Я рад сообщить, что вышла новая версия моей Rust-библиотеки для объектно-реляционного отображения - Ormlib 1.0.1. В этой версии было проделано много работы по улучшению архитектуры библиотеки.

В предыдущей версии 0.3.3, Ormlib работал только с базой данных SQLite. Это ограничивало сферы применения библиотеки. В версии 1.0.1 была проделана большая работа по рефакторингу кода, чтобы абстрагировать ее от конкретной реализации СУБД.

После рефакторинга я использовал механизм "features", который позволяет подключать Ormlib либо с поддержкой SQLite, либо с поддержкой MySQL.

[dependencies]
ormlib = {version = "1.0.1", features = ["sqlite"]} # or "mysql"
ormlib_derive = "1.0.1"

Для реализации этой возможности был создан трейт ORMTrait, который определяет общий интерфейс для работы с ORM.

Этот трейт реализуется отдельно для SQLite и MySQL. Таким образом я получил гибкую архитектуру, которая позволит в будущем добавлять поддержку и других СУБД.

Трейт ORMTrait предоставляет следующие базовые методы для работы с базой данных:

  • add() - добавляет данные в базу данных

  • close() - закрывает соединение с базой данных

  • find_one() - ищет одну запись по ID

  • find_many() - ищет несколько записей по условию

  • find_all() - ищет все записи

  • modify() - изменяет запись

  • remove() - удаляет запись

  • query() - выполняет произвольный запрос

  • query_update() - выполняет произвольный запрос с обновлением данных

  • protect() - экранирует строку от SQL-инъекций

  • init() - выполняет инициализацию базы данных

Чтобы перейти на использование новой версии Ormlib, необходимо код:

use ormlib::{ORM, ORMError};

заменить на:

use ormlib::sqlite::ORM; // для перехода на mysql заменить на use ormlib::mysql::ORM;
use ormlib::{ORMError, ORMTrait};

Код библиотеки доступен на GitHub по ссылке.

Ссылка на первую статью про Ormlib.

Комментарии (19)


  1. PrinceKorwin
    08.10.2023 14:40
    +4

    Не критики ради, просто интересно. Почему выбрали названия: add(), remove(), modify(), find() вместо принятых в SQL: insert, update, delete, select?


    1. igumnov Автор
      08.10.2023 14:40
      -4

      Уважаемый комментатор, большое спасибо за интересный вопрос!

      Я выбрал такие названия методов, как add(), remove(), modify(), find(), чтобы отойти от стандартных SQL терминов insert, update, delete, select. Моя цель - создать полноценную ORM библиотеку, а не просто обёртку над SQL.

      Поэтому я постарался использовать более абстрактные и понятные названия методов, которые лучше отражают суть действий с объектами, нежели специфичные SQL команды. Это помогает сделать код на Rust более естественным и выразительным при работе с базами данных.

      Надеюсь, я смог объяснить причину такого решения. Если у Вас остались вопросы или другие предложения по улучшению библиотеки, я с удовольствием их обсужу!


      1. Nurked
        08.10.2023 14:40
        +8

        Блин, имейте совесть. Хватит отвечать через ЧатГПТ.


        1. igumnov Автор
          08.10.2023 14:40
          -2

          Вам шашечки или доехать? вот ответ без ИИ - вы за него минусуете


          1. Nurked
            08.10.2023 14:40
            +8

            Мне живое, человеческое общение. Нафига писать тремя абзацами Гптшного жополизания то, на что надо было ответить человеческим языком?

            "Так захотелось" - содержание вашего ответа. Непонятно зачем, но ладно, пусть будет. Я ещё в жизни не видел ОРМщика, у которого add и modify были бы вместо insert и update.

            Не пойми меня неправильно, нет ничего плохого, что ты хочешь попробовать раскрутить на Хабре свою самописную библиотеку.

            Но уж, пожалуйста, не надо устраивать тут фарс и рассказывать с помощью чат-бота о том, как замечательно, что вышла уже версия 1.0.*! У тебя семь звёзд и полтора месяца коммитов. Про это бибиотеку знают твои друзья.

            Ну так возьми и напиши открытыи текстом: "Ребят, строю свою ОРМ на расте. Вот работает так кто и так то. Столкнулся с тем-то при порте на MySQL" Проект в зачатке, но большие планы.

            Никто тебя обижать не будет. Ты на самом деле закомитил много кода. Напиши ты своими словами об этом коде.

            Вместо этого ты буквально тихо привераешь, используя ГПТ. Ты рассказываешь о том, как наконец-то вышла такая крутейшая библиотека! Уууу!

            Да твою в поперек. Держи плюсик. Только учти, над написанием этого комментария я трудился больше, чем ты над написанием всей этой статьи. Я считаю, что время других - ценно. Поэтому я лично отвечаю текстом, который сам пишу. А не отмазываюсь бесполезной ГПТнёй.

            И уж темболее, когда тебя ОРМщики спрашивают: "нафига надо было менять четыре самых фундаментальных слова в ОРМ?" Уж изволь. Вылезай из чата, и начинай брать отвественность за свой код. Я не говорю что он плох. Я говорю что этой ГПТшкой ты показываешь неуважение и безответственность к своим читателям.


            1. igumnov Автор
              08.10.2023 14:40
              +1

              Согласен. Исправлюсь.


              1. Nurked
                08.10.2023 14:40

                Достойный ответ. Ещё раз - у тебя дохрена кода. Пиши о том, как ты его кодил и какие решения ты принимал. Иы быстро станешь первым по расту на Хабре.


            1. mayorovp
              08.10.2023 14:40

              Я ещё в жизни не видел ОРМщика, у которого add и modify были бы вместо insert и update.

              Посмотрите на EF и EF Core — там используются именно что Add и Remove. Именно что с целью дать семантику коллекций и отойти от таблиц.


              А в JPA так и вовсе используется название "persist", видимо чтобы никто не догадался что вообще происходит. Вспоминайте про JPA каждый раз когда кажется что в других ORM есть что-то нелогичное :-)


  1. Nurked
    08.10.2023 14:40
    +8

    @Boomburum Алексей, А можно добавить новую причину минуса "Написано нейронкой"?


    1. godzie
      08.10.2023 14:40
      +1

      Не любопытства ради, а как приобрести скил распознавания?


      1. Nurked
        08.10.2023 14:40
        +8

        Я статью напишу. Но я бы сказал что это синдром "Никто не ожидает Испанскую Инквизицию".

        Если не знаете о чём я - идите и смотрите скетчи Монти Пайтона по ссылке. У них в шоу был такой прикол. Иногда в середине скетча из ниоткуда появялись трое инквизиторов и всё становилось с ног на голову. Это было внезапно.

        ГПТ так не умеет. Он просто монотонно балаболит о чём-то. Посмотри на этот текст и на первый коммент. Вопрос в первом комменте - это испанская инквизиция. "Какого чёрта ты делаешь ОРМку, где Update называется Modify?" А ответ на это более чем монотонная балаболка. "Уважаемый комментатор..." Кто в здравом уме такое напишет на Хабре? ГПТ чрезмерно покладист и всеуважающ. Он будет мило отвечать на вопрос "Какого чёрта?"

        Ответ должен был быть в стиле: "Я решил началь революцию! Не нужны нам CRUD, будем их переназывать!"

        После этого - всё ясно. Снова смотрим на саму статью и видим, что она умещается в один ответ от ГПТ. Возможно её поправили в паре мест, но уж очень она "покладистая". Живой человек, который действительно провёл полтора месяца над написанием ОРМ библиотеки на расте так говорить не будет. У него будет увлечённость и вовлечённость. А тут - абстрагирование.

        Хотя, судя по всему, я не особо удивлюсь, если сам код написан только ГПТшкой.

        После этого посмотри в комменты пользователя и ты увидишь, что большинство из его комментов это "уважаемый комментатор" [плевал я на тебя, мне лень тебе отвечать, но я буду СЕОшиться на Хабре, поэтому вот тебе болванка]. Потом смотришь на его безличные статьи, из которых только одна набрала какой-то там рейтинг, и понимаешь, что это просто ещё один из многочисленых ГПТГенераторов.

        Я так подразумеваю, что тремя комментами к этой статье я сделал больше усилий, чем автор оригинала всеми своими статьями и комментами.

        Поэтому и хочу добиться, чтобы контент, сгенерированный ГПТшкой так просто и тагился и скрывался. Это уже сделал Амазон, и на Хабре пора.


        1. igumnov Автор
          08.10.2023 14:40
          -3

          Все верно, просто 90% комментаторов, просто пальцы гнут. Устал им отвечать. На счет того что код генерит ИИ. Сам попробуй через ИИ написать такой код как в моих либах) Тебя ждет приятный сюрприз...


          1. Nurked
            08.10.2023 14:40

            Не смотрел твой код. В комменте только написал "не удивлюсь если".

            Если ты хочешь раскрутиться на Хабре, то тебе надо не СЕОшить и гнуть пальцы на троллей, а писать мясо в статьях.

            Я не говорю что твой код - какашка. Но так ты о нём и пиши. Посмотри на мои статьи. Я просто не отвечаю троллям. Их здесь есть, но я на гих не обращаю внимания. И тебе не стоит. Но, если бы ты не отвечал через ГПТ а просто настаивал на своём мнении, то у тебя бы вышло намного круче.

            Ещё раз - у тебя дофига кода в репах. Если он твой - пиши о нём. У тебя карму сливать некуда будет. И забудь про ГПТ. Его можно только на проверку орфографии.


            1. aegoroff
              08.10.2023 14:40
              +8

              Не смотрел твой код. В комменте только написал "не удивлюсь если".

              я посмотрел - я бы не стал пользоваться ORM, которая даже теоретически (пусть там супер пупер экранирование) допускает попадание внешних данных в тело запроса

                  fn add<T>(&self, data: T) -> QueryBuilder<T, T, ORM>
                      where T: for<'a> Deserialize<'a> + TableDeserialize + TableSerialize + Serialize + Debug + 'static
                  {
                      let table_name = data.name();
                      let types = serializer_types::to_string(&data).unwrap();
                      let values = serializer_values::to_string(&data).unwrap();
                      let query: String = format!("insert into {table_name} {types} values {values}");
                      let qb = QueryBuilder::<T,T, ORM> {
                          query: query,
                          entity: Default::default(),
                          orm: self,
                          result: std::marker::PhantomData,
                      };
                      qb
                  }

              ну его в качель, уж лучше самому, используя тот же sqlx или дизель, работать, чем с подобным.


          1. mayorovp
            08.10.2023 14:40

            Все верно, просто 90% комментаторов, просто пальцы гнут. Устал им отвечать.

            Так не отвечай, это ж главное преимущество интернета: возможность просто не отвечать.


  1. igumnov Автор
    08.10.2023 14:40
    -5

    Ребят, наваливайтесь, минусуйте, все мои стать, комментарии, и коды на гитхабе ИИ написал! Аминь!


  1. aegoroff
    08.10.2023 14:40
    +6

    • protect() - экранирует строку от SQL-инъекций


    Зачем это нужно? Нет, я понимаю что такое SQL инъекция и что плохо когда неконтролируемые внешние данные могут попадать в код строящий запросы к базе, я о другом - ЗАЧЕМ вообще разрешать такому коду попадать в запросы? Уже 100 лет в обед, во ВСЕХ СУБД имеется механизм параметризованных запросов, если нужно внешние данные использовать при, например фильтрации, сортировке и т.д. Вероятность неправильно сделать экранирование (накосячить, не знать и т.д.) весьма высока причем даже самим создателям БД, которые знают синтаксис досконально, а цена такой ошибки просто может быть фатальной.

    В общем, мой посыл - что подставлять внешние данные в тело запроса, должно быть ЗАПРЕЩЕНО, на уровне код стайла и никаких тут не может быть исключений.


  1. sergeilem
    08.10.2023 14:40

    А зачем, если есть SeaORM?


    1. igumnov Автор
      08.10.2023 14:40

      В первой статье я ответил на этот вопрос https://habr.com/ru/articles/757070/