Метод reflect класса MetaData
Метод reflect класса MetaData
читает структуру таблиц напрямую из базы данных
и создает соответствующие объекты Table
в коллекции метаданных. Первым параметром
передается объект подключения bind,
который может быть движком или соединением.
Параметр only позволяет ограничить
список отражаемых таблиц, а schema
задает схему базы данных.
Синтаксис
MetaData.reflect(bind, [only], [schema], [views])
Пример
Давайте создадим таблицу в базе SQLite
и отразим ее через новый объект метаданных:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
new_metadata = MetaData()
new_metadata.reflect(bind=engine)
print(new_metadata.tables.keys())
Результат выполнения кода:
"dict_keys(['articles'])"
Пример
Давайте ограничим отражение только одной таблицей
через параметр only:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String),
)
metadata.create_all(engine)
new_metadata = MetaData()
new_metadata.reflect(bind=engine, only=['articles'])
print(new_metadata.tables.keys())
Результат выполнения кода:
"dict_keys(['articles'])"
Пример
Давайте отразим таблицу и выполним из нее
SQL-запрос через select:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, insert
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(insert(articles).values(title='article'))
conn.commit()
new_metadata = MetaData()
new_metadata.reflect(bind=engine)
reflected = new_metadata.tables['articles']
with engine.connect() as conn:
res = conn.execute(select(reflected.c.title))
print(res.fetchall())
Результат выполнения кода:
[('article',)]
Смотрите также
-
класс
MetaData,
который хранит коллекцию таблиц и схем -
метод
create_all,
который создает все таблицы в базе данных -
атрибут
tables,
который содержит словарь отраженных таблиц -
метод
clear,
который очищает коллекцию метаданных