Учебники

SQLAlchemy ORM — объявление сопоставления

Основной целью API Object Relational Mapper в SQLAlchemy является облегчение связывания пользовательских классов Python с таблицами базы данных, а объектов этих классов — со строками в соответствующих таблицах. Изменения в состояниях объектов и строк синхронно сопоставляются друг с другом. SQLAlchemy позволяет выражать запросы к базе данных в терминах пользовательских классов и их определенных отношений.

ORM построен поверх языка выражений SQL. Это высокий уровень и абстрактная схема использования. На самом деле ORM — это прикладное использование языка выражений.

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

Объявить картирование

Прежде всего, вызывается функция create_engine () для настройки объекта механизма, который впоследствии используется для выполнения операций SQL. Функция имеет два аргумента: один — имя базы данных, а другой — параметр эха, если для параметра установлено значение True, будет создан журнал активности. Если он не существует, база данных будет создана. В следующем примере создается база данных SQLite.

from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)

Engine устанавливает реальное соединение DBAPI с базой данных при вызове метода, подобного Engine.execute () или Engine.connect (). Затем он используется для испускания SQLORM, который не использует Engine напрямую; вместо этого он используется за кадром ORM.

В случае ORM процесс конфигурации начинается с описания таблиц базы данных, а затем с определения классов, которые будут сопоставлены с этими таблицами. В SQLAlchemy эти две задачи выполняются вместе. Это делается с помощью декларативной системы; созданные классы включают директивы для описания фактической таблицы базы данных, в которую они отображаются.

Базовый класс хранит каталог классов и сопоставленных таблиц в декларативной системе. Это называется декларативным базовым классом. Обычно будет только один экземпляр этой базы в обычно импортируемом модуле. Функция Declarative_base () используется для создания базового класса. Эта функция определена в модуле sqlalchemy.ext.declarative.

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

Как только базовый класс объявлен, любое количество отображаемых классов может быть определено в терминах этого. Следующий код определяет класс Заказчика. Он содержит таблицу для сопоставления, а также имена и типы данных столбцов в ней.

class Customers(Base):
   __tablename__ = 'customers'
   
   id = Column(Integer, primary_key = True)
   name = Column(String)
   address = Column(String)
   email = Column(String)

Класс в Declarative должен иметь атрибут __tablename__ и хотя бы один столбец, который является частью первичного ключа. Декларативный заменяет все объекты Column специальными средствами доступа Python, известными как дескрипторы . Этот процесс известен как инструментарий, который предоставляет средства для обращения к таблице в контексте SQL и позволяет сохранять и загружать значения столбцов из базы данных.

Этот сопоставленный класс, как и обычный класс Python, имеет атрибуты и методы согласно требованию.

Информация о классе в декларативной системе, называется метаданными таблицы. SQLAlchemy использует объект Table для представления этой информации для конкретной таблицы, созданной в декларативном. Объект Table создается в соответствии со спецификациями и связывается с классом путем создания объекта Mapper. Этот объект сопоставления не используется напрямую, но используется внутри как интерфейс между отображаемым классом и таблицей.

Каждый объект Table является членом большой коллекции, известной как MetaData, и этот объект доступен с помощью атрибута .metadata декларативного базового класса. Метод MetaData.create_all () передает наш движок в качестве источника подключения к базе данных. Для всех таблиц, которые еще не были созданы, он выдает операторы CREATE TABLE в базу данных.

Base.metadata.create_all(engine)

Полный скрипт для создания базы данных и таблицы, а также для отображения класса Python приведен ниже —

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
engine = create_engine('sqlite:///sales.db', echo = True)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()

class Customers(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key=True)

   name = Column(String)
   address = Column(String)
   email = Column(String)
Base.metadata.create_all(engine)

При запуске консоль Python выдает эхо после выполнения выражения SQL —

CREATE TABLE customers (
   id INTEGER NOT NULL,
   name VARCHAR,
   address VARCHAR,
   email VARCHAR,
   PRIMARY KEY (id)
)

Если мы откроем Sales.db с помощью графического инструмента SQLiteStudio, в нем будет показана таблица клиентов с вышеупомянутой структурой.