Я присоединился к своей нынешней компании в апреле 2017 года и с тех пор пытался перенять чужой код. Как все знают, чтение кода никогда не бывает легким, особенно с тоннами кода бизнес-логики.

В течение этого периода моя команда не использовала SqlAlchemy, поэтому для взаимодействия с MySQL у нас был такой код.

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

К счастью, у нас есть SQLAlchemy (псевдоним SA)!
SQLAlchemy - это набор инструментов Python SQL и Object Relational Mapper, который дает разработчикам приложений полную мощь и гибкость SQL.

В этой статье я в основном сосредоточусь на ORM (объектно-реляционное сопоставление).
Давайте начнем с простого примера. Скажем, у нас есть две таблицы authors и articles.

Вот некоторые пояснения:
1. __tablename__: имя таблицы в БД
2. Переменная класса: при определении столбца можно указать тип данных, ключевые ограничения. Конечно, вы также можете указать для него имя, которое является фактическим именем столбца в БД; таким образом устанавливается соответствие между col_name и переменной класса ORM. Подробнее об этом через секунду.
3. Отношения: между таблицами можно установить отношения. В приведенном выше примере отображение «многие-к-одному» устанавливается путем определения author_id как FK и оператора связи в обоих определениях классов.

Чтобы получить запись, вы можете использовать

А теперь время вопросов.
Почему нам нужно указывать аргумент имени в операторе Column?
Ну, по умолчанию SA использует имена переменных класса в качестве имен столбцов для запроса базы данных; Если передан аргумент имени, SA будет использовать этот аргумент, и после получения результата столбец будет сопоставлен с переменной класса, к которой вы сможете получить доступ.
Вы можете использовать ORM централизованно и совместно, что означает что классы ORM определены и где-то хранятся, и все разработчики могут обращаться к этим классам для операций с БД, не зная заранее подробностей таблицы.

Меня не устраивают внешние ключи, можем ли мы устанавливать отношения без объявления внешних ключей и как?
Ответ - да, и вот как.

В операторе связи вы определяете Article.id как «поддельный» внешний ключ, который вообще не имеет никаких фактических ограничений, и аргумент primary_join, который будет использоваться для запроса базы данных в качестве условия соединения.

SQLAlchemy - действительно полезный инструментарий, и есть о многих аспектах, о которых стоит поговорить. Я постараюсь изо всех сил дать полную серию статей о его философии, концепции, а также более подробно о технических деталях.

Если вам интересно, пожалуйста, хлопайте в ладоши и следуйте за мной, спасибо!