Ответ
Объект MetaData
в SQLAlchemy — это контейнер, который служит центральным реестром (каталогом) для описания схемы базы данных. Он хранит информацию о таблицах, колонках, индексах, внешних ключах и других объектах схемы.
Основные функции MetaData
:
- Определение схемы: Он агрегирует объекты
Table
, которые декларативно описывают структуру базы данных. - Генерация DDL: Используется для генерации SQL-команд языка определения данных (Data Definition Language), таких как
CREATE TABLE
,DROP TABLE
. Методmetadata.create_all(engine)
создает все определенные вMetaData
таблицы в базе данных. - Отражение (Reflection):
MetaData
может автоматически загружать информацию о схеме из существующей базы данных. Это полезно для работы с уже созданными таблицами.
Пример использования в SQLAlchemy Core
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
# Создаем движок для подключения к БД (в данном случае SQLite в памяти)
engine = create_engine('sqlite:///:memory:')
# 1. Создаем экземпляр MetaData
metadata_obj = MetaData()
# 2. Описываем таблицу и связываем ее с нашим объектом metadata
user_table = Table(
'users',
metadata_obj,
Column('id', Integer, primary_key=True),
Column('name', String(50)),
Column('email', String(50))
)
# 3. Генерируем и выполняем DDL-запрос для создания таблицы
metadata_obj.create_all(engine)
print(f"Таблицы в metadata: {metadata_obj.tables.keys()}")
# Вывод: Таблицы в metadata: dict_keys(['users'])
Использование в SQLAlchemy ORM
При работе с ORM через декларативный базовый класс (declarative_base
), объект MetaData
обычно создается и управляется неявно. Каждая модель, унаследованная от Base
, автоматически регистрируется в Base.metadata
.
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
# ...
# Все таблицы, унаследованные от Base, находятся в Base.metadata
# Base.metadata.create_all(engine)