Pull to refresh

Comments 15

Ну вот сразу не хватает плашек, ведущих на crates.io и docs.rs. Без этого не удобно изучать проект, и нужно его отдельно искать где он опубликован.

Кстати, а чем sea orm не устроил?

SeaORM меня больше радует чем Diesel ) Но захотелось что-то свое написать, вдруг получиться решение где меньше букв надо писать чем в SeaORM.

мистер

расскажите, откуда у вас столько времени, чтобы вести все эти опен сорс проекты?

не думаете ведь вы, что сообщество будет развивать их само по себе, пока вы будете с улыбкой на лице наблюдать, как одна за другой появляются звёздочки на гитхабе?

В том случае, если вопросы финансового характера остро не стоят, у человека появляется уйма свободного времени.

Есть целый пласт людей, например инди-хакеры, готовых инвестировать свое время в потенциально интересный но не прибыльный проект.

В моем случае, open source стал отличным способ изучать языки и технологии.

Это не статья, а просто ссылка на Github. Еще и хабы выбраны про программирование, а в статье ни одной строчки кода.

В статье нужно описать, чем ваше решение лучше аналогов (Diesel, SeaORM, Sqlx), какие походы использовали, с какими трудностями столкнулись, в чем подобие именно Hibernate и т.п.

А кроме того стоит уровень статьи Средний. Уровень это про текст статьи, но в статье (если это вообще статьёй можно назвать) нет ничего требующего навыков отличных от навыка чтения.

Также замечу, что существует сайт Code Review Stack Exchange, созданный специально с целью помогать ревьювить код и помогать с кодом в плане архитетуры, стиля и всего такого. Я подозреваю, что автору нужно было написать туда.

На основании примера:

  1. (Не критицизм кода) ORM - никогда их не любил, но как способ попрактиковаться - OK

  2. Почему метод connect почему-то блокирующий, в то время как всё остальное асинхронное?

  3. Prepared statement нет? В примере format и protect - есть гарантии что он корректно всё заэскейпит?

  4. conn.query(query.as_str()) - можно использовать AsRef чтобы можно было передовать строки в разной форме

  5. Очень много клонирования. Можно принимать и ссылки. Ну а лучше разрешить и то и то, опять же с помощью AsRef

  1. Оk

  2. Сказать честно, не помню, толи просто сделал толи компилятор ругался так как либа в которой конекция создается выдавало ошибку про Send и Sync - надо перепроверить - спасибо за замечание

  3. Да согласен, prepared statement не хватает вообщем как раз можно перейти на sqlx crate https://github.com/igumnoff/parvati/issues/1

  4. Интересно, а это чуть медленнее работает?

  5. Ну клонирование, точно не быстрое. Вот тут точно 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;
Sign up to leave a comment.

Articles