Класс ForeignKeyConstraint
Класс ForeignKeyConstraint создает ограничение
внешнего ключа на уровне таблицы. Первым параметром
передается список локальных столбцов, вторым - список
целевых столбцов, на которые ссылается внешний ключ.
Ограничение обеспечивает ссылочную целостность между
таблицами базы данных.
Синтаксис
ForeignKeyConstraint(
columns,
refcolumns,
[name],
[ondelete],
[onupdate],
[deferrable],
[initially]
)
Пример
Давайте создадим две таблицы и свяжем их через
внешний ключ с помощью класса ForeignKeyConstraint:
from sqlalchemy import (
create_engine, MetaData, Table, Column,
Integer, String, ForeignKeyConstraint
)
engine = create_engine('sqlite:///:memory:')
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('user_id', Integer),
Column('title', String),
ForeignKeyConstraint(
['user_id'], ['users.id']
)
)
metadata.create_all(engine)
for fk in articles.foreign_key_constraints:
print(fk)
Результат выполнения кода:
"ForeignKeyConstraint(['user_id'], ['users.id'])"
Пример
Давайте зададим поведение при удалении связанной записи
через параметр ondelete:
from sqlalchemy import (
create_engine, MetaData, Table, Column,
Integer, String, ForeignKeyConstraint
)
engine = create_engine('sqlite:///:memory:')
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('user_id', Integer),
Column('title', String),
ForeignKeyConstraint(
['user_id'], ['users.id'],
ondelete='CASCADE',
onupdate='CASCADE'
)
)
metadata.create_all(engine)
for fk in articles.foreign_key_constraints:
print(fk.ondelete)
print(fk.onupdate)
Результат выполнения кода:
"CASCADE"
"CASCADE"
Пример
Давайте создадим составной внешний ключ из двух столбцов:
from sqlalchemy import (
create_engine, MetaData, Table, Column,
Integer, String, ForeignKeyConstraint
)
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
users = Table(
'users', metadata,
Column('id', Integer, primary_key=True),
Column('num', Integer, primary_key=True),
Column('name', String)
)
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('user_id', Integer),
Column('user_num', Integer),
Column('title', String),
ForeignKeyConstraint(
['user_id', 'user_num'],
['users.id', 'users.num']
)
)
metadata.create_all(engine)
for fk in articles.foreign_key_constraints:
print(fk.column_keys)
print(fk.elements)
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
user_id INTEGER,
user_num INTEGER,
title VARCHAR,
PRIMARY KEY (id),
FOREIGN KEY(user_id, user_num) REFERENCES users (id, num)
)
Смотрите также
-
класс
PrimaryKeyConstraint,
который задает первичный ключ таблицы -
класс
UniqueConstraint,
который задает уникальность значений столбцов -
класс
CheckConstraint,
который задает условие проверки значений -
класс
Constraint,
который является базовым классом для ограничений