Comments 15
Ну вот сразу не хватает плашек, ведущих на crates.io и docs.rs. Без этого не удобно изучать проект, и нужно его отдельно искать где он опубликован.
Кстати, а чем sea orm не устроил?
мистер
расскажите, откуда у вас столько времени, чтобы вести все эти опен сорс проекты?
не думаете ведь вы, что сообщество будет развивать их само по себе, пока вы будете с улыбкой на лице наблюдать, как одна за другой появляются звёздочки на гитхабе?
В том случае, если вопросы финансового характера остро не стоят, у человека появляется уйма свободного времени.
Есть целый пласт людей, например инди-хакеры, готовых инвестировать свое время в потенциально интересный но не прибыльный проект.
В моем случае, open source стал отличным способ изучать языки и технологии.
Это не статья, а просто ссылка на Github. Еще и хабы выбраны про программирование, а в статье ни одной строчки кода.
В статье нужно описать, чем ваше решение лучше аналогов (Diesel, SeaORM, Sqlx), какие походы использовали, с какими трудностями столкнулись, в чем подобие именно Hibernate и т.п.
Вы можете найти это все в моей предыдущей статье: https://habr.com/ru/articles/757070/
А кроме того стоит уровень статьи Средний. Уровень это про текст статьи, но в статье (если это вообще статьёй можно назвать) нет ничего требующего навыков отличных от навыка чтения.
Также замечу, что существует сайт Code Review Stack Exchange, созданный специально с целью помогать ревьювить код и помогать с кодом в плане архитетуры, стиля и всего такого. Я подозреваю, что автору нужно было написать туда.
На основании примера:
(Не критицизм кода) ORM - никогда их не любил, но как способ попрактиковаться - OK
Почему метод connect почему-то блокирующий, в то время как всё остальное асинхронное?
Prepared statement нет? В примере format и protect - есть гарантии что он корректно всё заэскейпит?
conn.query(query.as_str()) - можно использовать AsRef чтобы можно было передовать строки в разной форме
Очень много клонирования. Можно принимать и ссылки. Ну а лучше разрешить и то и то, опять же с помощью AsRef
Оk
Сказать честно, не помню, толи просто сделал толи компилятор ругался так как либа в которой конекция создается выдавало ошибку про Send и Sync - надо перепроверить - спасибо за замечание
Да согласен, prepared statement не хватает вообщем как раз можно перейти на sqlx crate https://github.com/igumnoff/parvati/issues/1
Интересно, а это чуть медленнее работает?
Ну клонирование, точно не быстрое. Вот тут точно AsRef уместно. Надо заняться рефакторингом
ну из нечитаемого
вот такое
match value {
Some(v_opt) => {
match v_opt {
None => {
None
}
Some(v) => {
let r = Z::from_str(v.as_str());
match r {
Ok(res) => {
Some(res)
}
Err(_) => {
None
}
}
}
}
}
None => {
None
}
}
Должно использовать идиому if let Some(x)
/ if let Ok(x)
.
Аналогично но с циклом while let Some(x)
.
Две PhantomData в одной структуре выглядит как минимум подозрительно, как максимум бесполезно - лайфтайм у них один и тот же.
Преобразование ошибок выглядит не очень. Возможно стоит подсмотреть как используют какой-нибудь thiserror/anyhow либо сделать impl Into/From
для ваших ошибок.
Санация ввода определённо требует много тестов и вероятно выделение в собственную сущность или как минимум отдельный трейт с имплементацией для char
, str
и String
, чтобы можно быо делать что-то вроде "praise the sun \0/".orm_escape()
.
Сейчас тестов вроде примерно нисколько. Да и в общем по проекту тестов как-то мало. Отсюда же отсутствие понимания у людей как это будет использоваться в дальнейшем.
Про сериализацию наверное стоит подсмотреть какой-нибудь miniserde ибо текущий вариант кажется имплементит только какой-то сабсет json спеки. Ввиду отсутвия тестов - непонятно.
вот тут https://github.com/igumnoff/parvati/blob/3c3e6ff32872326bbef818192cc3d634962c9381/lib/src/sqlite.rs#L89 у вас прямо SQL инъекция в чистом виде - я вам еще в прошлый раз об этом говорил, но видимо вы не поняли. НЕЛЬЗЯ данные неизвестно откуда использовать в запросах напрямую, пусть даже с санитайзером, ТОЛЬКО передавая их через параметры.
Я понял - поэтому буду переписывать на sqlx с prepare statement
более того я про preapare statement знал и использовал 25 лет назад когда делал свой высоконогруженый веб сервис обслуживащий более 20 млн пользователей
а текущая либа это просто на коленке писаный прототип, быстрей - быстрей лишь бы скомпилировалось и работало
https://github.com/igumnoff/parvati/issues/1
Но вы молодец, что так упорно гнете свою линию )
в 99 году сервис обслуживающий более 20 млн.? Это Яндекс, Рамблер, Апорт, Мейлру что-ли? И да, что у вас было за железо? в ту пору диск на 10 Гигов считался огромным, типичный было что-то вроде 4-8 Гб. Тогда наверно в России было ну 2-3 млн. пользователей интренета
сорри, ошибся, погуглите mylivepage проект он чуть позже был )
просто для меня это было как вчера ) и я плюс минус 5-10 лет не уточняю
https://igumnoff.com/about
Хотя мы с вами похожи, вы отвергаете авторитеты как и я, так как они стары как засохшая жвачка под партой в школе )
ORM не умеет генерировать create table …
(просто недостаточно информации о точных типах полей), обратно тоже не умеет создавать описания растовских структур из существующих таблиц. В примере create_table_sqlite.sql
нет ограничений not null
, хотя по коду в расте они подразумеваются.
let user_opt: Option<User> = conn.find_one(user_from_db.id as u64).run().await?;
А если я захочу первичный ключ сделать с типом char(4 char)?
Ну и всякие мелочи по оптимизации:
update user set name = \"Mike\",age = 30 where id = 1
- не отслеживается список ИЗМЕНЁННЫХ полей, правильно так:update user set name = \"Mike\" where id = 1
select * from user
- ORM же должен знать ВСЕ поля и давать возможность выбрать только НЕКОТОРЫЕ:select id, name, age from user
иselect id, name from user
insert into user (name,age) values (\"John\",30)
- опа, явный косяк. А где указанный мной id=0?!select * from user where rowid = 1
- зачем оно делает селект сразу же после запроса и откуда оно узнало rowid? Правильно так:
insert into user (
name,
age
) values (
"John",
30
) returning
id;
Pet-проект на Rust нуждается в конструктивной критике