Атрибут sorted_tables класса MetaData
Атрибут sorted_tables класса MetaData возвращает список
объектов Table, отсортированных в порядке, при котором
таблицы с внешними ключами располагаются после таблиц,
на которые они ссылаются. Это особенно важно при создании
и удалении таблиц в правильной последовательности.
Атрибут не принимает параметров и доступен только для чтения.
Синтаксис
metadata.sorted_tables
Пример
Давайте создадим две связанные таблицы и посмотрим,
в каком порядке они окажутся в атрибуте sorted_tables.
Сначала объявим таблицу users, затем таблицу
articles, которая ссылается на неё через внешний ключ:
from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey
metadata = MetaData()
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String)
)
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('user_id', Integer, ForeignKey('users.id'))
)
print([table.name for table in metadata.sorted_tables])
Результат выполнения кода:
['users', 'articles']
Пример
Даже если таблица с внешним ключом была определена раньше,
атрибут sorted_tables всё равно расставит их в правильном
порядке. Проверим это, объявив articles перед users:
from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('user_id', Integer, ForeignKey('users.id'))
)
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String)
)
print([table.name for table in metadata.sorted_tables])
Результат выполнения кода:
['users', 'articles']
Пример
Атрибут sorted_tables удобно использовать для
последовательного создания таблиц в базе данных.
Создадим обе таблицы в правильном порядке:
from sqlalchemy import MetaData, Table, Column, Integer, String, ForeignKey, create_engine
metadata = MetaData()
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String)
)
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('user_id', Integer, ForeignKey('users.id'))
)
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
for table in metadata.sorted_tables:
table.create(conn)
print(f"Table {table.name} created")
Результат выполнения кода:
"Table users created"
"Table articles created"
Смотрите также
-
класс
MetaData,
который хранит информацию о таблицах и схеме -
атрибут
tables,
который содержит словарь всех таблиц -
метод
create_all,
который создает все таблицы в базе данных -
метод
drop_all,
который удаляет все таблицы в правильном порядке