Теперь, когда мы уже научились работать с машиной соединений и выполнять SQL скрипты, мы готовы перейти к магической алхимии. Центральным элементом как Core, так и ORM, является язык выражений SQL, который позволяет просто и быстро конструировать различные SQL скрипты. Фундаментом этих скриптов будут такие объекты как таблицы (Table) и столбцы (Column) в базе данных. Вместе мы будем называть их метаданными (MetaData) базы данных.
<aside> 🌐 Практически вся эта глава посвящена ORM концепциям, поэтому если вы заинтересованы только в Core, то можете пропустить ее
</aside>
Когда мы работаем с реляционными базами данных, базовой структурой, которую мы можем создать и с которой можем работать, является таблица. В алхимии она представлена одноименным Python объектом - Table.
Для начала работы мы должны создать несколько таблиц. Каждая из них должна быть объявлена, что означает непосредственное создание ее напрямую в исходном Python коде. Мы также можем сгенерировать эти объекты на основе тех, что уже существуют в базе данных. Оба этих подхода могут быть реализованы несколькими способами.
Независимо от того, что мы планируем делать: объявлять таблицы или генерировать объекты на основе существующих - нам потребуется некоторая коллекция данных, названная MetaData. Этот объект является по большому счету фасадой вокруг словаря, который хранит в себе всю информацию о таблицах.
Создание метаданных вылядит вполне рутинно:
from sqlalchemy import MetaData
metadata_obj = MetaData()
Иметь один единственный объект метаданных на всё приложение - это вполне распространённый случай. Но также допускается и несколько коллекций метаданных, хотя, как правило, наиболее полезно, если таблицы, связанные друг с другом, принадлежат к одному объекту метаданных.
Как только у нас уже есть объект метаданных, мы можем объявить несколько таблиц. В данном туториале мы начнем с создания SQLAlchemy моделей пользователей (например, какого-то сайта) и e-mail адрессов, которые так или иначе относятся к пользователям. Обычно мы объявляем каждую таблицу в качестве переменной, на которую мы можем в дальнейшем ссылаться в нашем коде.
from sqlalchemy import Table, Column, Integer, String
user_table = Table(
"user_account",
metadata_obj,
Column("id", Integer, primary_key=True),
Column("name", String(30)),
Column("fullname", String),
)
Мы можем наблюдать, что создание таблицы выглядит практически идентично выражению CREATE TABLE: оно также начинается с названия таблицы, затем происходит перечисление каждого столбца с названиями и типами данных. В примере были использованы такие объекты как:
user_table.c.name
Column('name', String(length=30), table=<user_account>)
user_table.c.keys()
['id', 'name', 'fullname']