Определение ограничений и индексов

В этом разделе мы обсудим SQL constraints и индексы. В SQLAlchemy ключевые классы включают ForeignKeyConstraint и Index.

Определение внешних ключей

Внешний ключ* в SQL - это конструкция на уровне таблицы, которая ограничивает один или несколько столбцов в этой таблице только теми значениями, которые присутствуют в другом наборе столбцов, обычно, но не всегда, расположенных в другой таблице. Мы называем столбцы, на которые накладываются ограничения, столбцами внешнего ключа, а столбцы, на которые они накладываются, столбцами ссылки. Ссылающиеся столбцы почти всегда определяют первичный ключ для своей таблицы, хотя бывают и исключения. Внешний ключ является «суставом», который соединяет вместе пары строк, имеющих отношения друг с другом, и SQLAlchemy придает этому понятию очень большое значение практически во всех областях своей работы.

В SQLAlchemy, как и в DDL, ограничения внешнего ключа могут быть определены как дополнительные атрибуты в предложении таблицы, или для одноколоночных внешних ключей они могут быть указаны в определении отдельного столбца. Одноколоночный внешний ключ является более распространенным, и на уровне колонок задается путем построения объекта ForeignKey в качестве аргумента к объекту Column:

user_preference = Table(
    "user_preference",
    metadata_obj,
    Column("pref_id", Integer, primary_key=True),
    Column("user_id", Integer, ForeignKey("user.user_id"), nullable=False),
    Column("pref_name", String(40), nullable=False),
    Column("pref_value", String(100)),
)

Выше мы определили новую таблицу user_preference, для которой каждая строка должна содержать значение в столбце user_id, которое также существует в столбце user_id таблицы user.

Аргументом ForeignKey чаще всего является строка вида <tablename>.<columnname>, или для таблицы в удаленной схеме или «владельца» вида <schemaname>.<tablename>.<columnname>. Это также может быть фактический объект Column, доступ к которому, как мы увидим позже, осуществляется из существующего объекта Table через его коллекцию c:

ForeignKey(user.c.user_id)

Преимущество использования строки заключается в том, что связь между user и user_preference в языке Python разрешается только при первой необходимости, поэтому объекты таблицы можно легко распределить по нескольким модулям и определить в любом порядке.

Внешние ключи также могут быть определены на уровне таблицы с помощью объекта ForeignKeyConstraint. Этот объект может описывать одноколоночный или многоколоночный внешний ключ. Многоколоночный внешний ключ известен как композитный внешний ключ, и почти всегда ссылается на таблицу, имеющую составной первичный ключ. Ниже мы определяем таблицу invoice, которая имеет составной первичный ключ:

invoice = Table(
    "invoice",
    metadata_obj,
    Column("invoice_id", Integer, primary_key=True),
    Column("ref_num", Integer, primary_key=True),
    Column("description", String(60), nullable=False),
)

А затем таблица invoice_item с составным внешним ключом, ссылающимся на invoice:

invoice_item = Table(
    "invoice_item",
    metadata_obj,
    Column("item_id", Integer, primary_key=True),
    Column("item_name", String(60), nullable=False),
    Column("invoice_id", Integer, nullable=False),
    Column("ref_num", Integer, nullable=False),
    ForeignKeyConstraint(
        ["invoice_id", "ref_num"], ["invoice.invoice_id", "invoice.ref_num"]
    ),
)

Важно отметить, что ForeignKeyConstraint - это единственный способ определить составной внешний ключ. Хотя мы также могли бы разместить отдельные объекты ForeignKey на столбцах invoice_item.invoice_id и invoice_item.ref_num, SQLAlchemy не будет знать, что эти два значения должны быть соединены вместе - это будут два отдельных ограничения внешнего ключа вместо одного составного внешнего ключа, ссылающегося на два столбца.

Создание/удаление ограничений внешних ключей с помощью ALTER

Поведение, которое мы видели в учебниках и в других местах, связанных с внешними ключами с DDL, показывает, что ограничения обычно отображаются «в линию» в операторе CREATE TABLE, например:

CREATE TABLE addresses (
    id INTEGER NOT NULL,
    user_id INTEGER,
    email_address VARCHAR NOT NULL,
    PRIMARY KEY (id),
    CONSTRAINT user_id_fk FOREIGN KEY(user_id) REFERENCES users (id)
)

Директива CONSTRAINT .. FOREIGN KEY используется для создания ограничения «встроенным» способом в определении CREATE TABLE. Методы MetaData.create_all() и MetaData.drop_all() делают это по умолчанию, используя топологическую сортировку всех задействованных объектов Table таким образом, что таблицы создаются и удаляются в порядке зависимости от внешнего ключа (эта сортировка также доступна через аксессор MetaData.sorted_tables).

Этот подход не может работать, когда два или более ограничений по внешнему ключу вовлечены в «цикл зависимости», где набор таблиц взаимно зависит друг от друга, предполагая, что бэкенд принудительно использует внешние ключи (всегда так, кроме SQLite, MySQL/MyISAM). Поэтому методы будут разбивать ограничения в таком цикле на отдельные операторы ALTER, на всех бэкендах, кроме SQLite, который не поддерживает большинство форм ALTER. Дана схема вида:

node = Table(
    "node",
    metadata_obj,
    Column("node_id", Integer, primary_key=True),
    Column("primary_element", Integer, ForeignKey("element.element_id")),
)

element = Table(
    "element",
    metadata_obj,
    Column("element_id", Integer, primary_key=True),
    Column("parent_node_id", Integer),
    ForeignKeyConstraint(
        ["parent_node_id"], ["node.node_id"], name="fk_element_parent_node_id"
    ),
)

Когда мы обращаемся к MetaData.create_all() на бэкенде, таком как бэкенд PostgreSQL, цикл между этими двумя таблицами разрешается, и ограничения создаются отдельно:

>>> with engine.connect() as conn:
...     metadata_obj.create_all(conn, checkfirst=False)
{execsql}CREATE TABLE element (
    element_id SERIAL NOT NULL,
    parent_node_id INTEGER,
    PRIMARY KEY (element_id)
)

CREATE TABLE node (
    node_id SERIAL NOT NULL,
    primary_element INTEGER,
    PRIMARY KEY (node_id)
)

ALTER TABLE element ADD CONSTRAINT fk_element_parent_node_id
    FOREIGN KEY(parent_node_id) REFERENCES node (node_id)
ALTER TABLE node ADD FOREIGN KEY(primary_element)
    REFERENCES element (element_id)
{stop}

Для того чтобы выдать DROP для этих таблиц, применяется та же логика, однако обратите внимание, что в SQL для выдачи DROP CONSTRAINT требуется, чтобы ограничение имело имя. В случае с таблицей 'node' выше, мы не назвали это ограничение; поэтому система попытается выдать DROP только для тех ограничений, которые названы:

>>> with engine.connect() as conn:
...     metadata_obj.drop_all(conn, checkfirst=False)
{execsql}ALTER TABLE element DROP CONSTRAINT fk_element_parent_node_id
DROP TABLE node
DROP TABLE element
{stop}

В случае, когда цикл не может быть разрешен, например, если мы не применили имя к одному из ограничений, мы получим следующую ошибку:

sqlalchemy.exc.CircularDependencyError: Can't sort tables for DROP;
an unresolvable foreign key dependency exists between tables:
element, node.  Please ensure that the ForeignKey and ForeignKeyConstraint
objects involved in the cycle have names so that they can be dropped
using DROP CONSTRAINT.

Эта ошибка относится только к случаю DROP, поскольку в случае CREATE мы можем выдать «ADD CONSTRAINT» без имени; база данных обычно назначает его автоматически.

Аргументы ключевых слов ForeignKeyConstraint.use_alter и ForeignKey.use_alter могут быть использованы для ручного разрешения циклов зависимости. Мы можем добавить этот флаг только к таблице 'element' следующим образом:

element = Table(
    "element",
    metadata_obj,
    Column("element_id", Integer, primary_key=True),
    Column("parent_node_id", Integer),
    ForeignKeyConstraint(
        ["parent_node_id"],
        ["node.node_id"],
        use_alter=True,
        name="fk_element_parent_node_id",
    ),
)

в нашем CREATE DDL мы увидим оператор ALTER только для этого ограничения, а не для другого:

>>> with engine.connect() as conn:
...     metadata_obj.create_all(conn, checkfirst=False)
{execsql}CREATE TABLE element (
    element_id SERIAL NOT NULL,
    parent_node_id INTEGER,
    PRIMARY KEY (element_id)
)

CREATE TABLE node (
    node_id SERIAL NOT NULL,
    primary_element INTEGER,
    PRIMARY KEY (node_id),
    FOREIGN KEY(primary_element) REFERENCES element (element_id)
)

ALTER TABLE element ADD CONSTRAINT fk_element_parent_node_id
FOREIGN KEY(parent_node_id) REFERENCES node (node_id)
{stop}

ForeignKeyConstraint.use_alter и ForeignKey.use_alter, когда они используются вместе с операцией drop, требуют, чтобы ограничение было именованным, иначе возникнет ошибка, подобная следующей:

sqlalchemy.exc.CompileError: Can't emit DROP CONSTRAINT for constraint
ForeignKeyConstraint(...); it has no name

ON UPDATE и ON DELETE

Большинство баз данных поддерживают каскадирование значений внешних ключей, то есть при обновлении родительской строки новое значение помещается в дочерние строки, или при удалении родительской строки все соответствующие дочерние строки устанавливаются в null или удаляются. На языке определения данных они задаются с помощью фраз типа «ON UPDATE CASCADE», «ON DELETE CASCADE» и «ON DELETE SET NULL», соответствующих ограничениям внешнего ключа. Фраза после «ON UPDATE» или «ON DELETE» может содержать и другие фразы, специфичные для используемой базы данных. Объекты ForeignKey и ForeignKeyConstraint поддерживают генерацию этой фразы через аргументы ключевых слов onupdate и ondelete. Значением является любая строка, которая будет выведена после соответствующей фразы «ON UPDATE» или «ON DELETE»:

child = Table(
    "child",
    metadata_obj,
    Column(
        "id",
        Integer,
        ForeignKey("parent.id", onupdate="CASCADE", ondelete="CASCADE"),
        primary_key=True,
    ),
)

composite = Table(
    "composite",
    metadata_obj,
    Column("id", Integer, primary_key=True),
    Column("rev_id", Integer),
    Column("note_id", Integer),
    ForeignKeyConstraint(
        ["rev_id", "note_id"],
        ["revisions.id", "revisions.note_id"],
        onupdate="CASCADE",
        ondelete="SET NULL",
    ),
)

Обратите внимание, что эти пункты требуют InnoDB таблиц при использовании с MySQL. Они также могут не поддерживаться в других базах данных.

Ограничение UNIQUE

Уникальные ограничения могут быть созданы анонимно для одного столбца с помощью ключевого слова unique на Column. Явно именованные уникальные ограничения и/или ограничения с несколькими столбцами создаются с помощью конструкции UniqueConstraint на уровне таблицы.

from sqlalchemy import UniqueConstraint

metadata_obj = MetaData()
mytable = Table(
    "mytable",
    metadata_obj,
    # per-column anonymous unique constraint
    Column("col1", Integer, unique=True),
    Column("col2", Integer),
    Column("col3", Integer),
    # explicit/composite unique constraint.  'name' is optional.
    UniqueConstraint("col2", "col3", name="uix_1"),
)

Ограничение CHECK

Контрольные ограничения могут быть именованными или неименованными и могут быть созданы на уровне столбца или таблицы с использованием конструкции CheckConstraint. Текст проверочного ограничения передается непосредственно в базу данных, поэтому «независимое от базы данных» поведение ограничено. Контрольные ограничения на уровне столбцов обычно должны ссылаться только на столбец, к которому они относятся, в то время как ограничения на уровне таблицы могут ссылаться на любые столбцы в таблице.

Обратите внимание, что некоторые базы данных активно не поддерживают ограничения проверки, например, старые версии MySQL (до 8.0.16).

from sqlalchemy import CheckConstraint

metadata_obj = MetaData()
mytable = Table(
    "mytable",
    metadata_obj,
    # per-column CHECK constraint
    Column("col1", Integer, CheckConstraint("col1>5")),
    Column("col2", Integer),
    Column("col3", Integer),
    # table level CHECK constraint.  'name' is optional.
    CheckConstraint("col2 > col3 + 5", name="check1"),
)

mytable.create(engine)
{execsql}CREATE TABLE mytable (
    col1 INTEGER  CHECK (col1>5),
    col2 INTEGER,
    col3 INTEGER,
    CONSTRAINT check1  CHECK (col2 > col3 + 5)
){stop}

PRIMARY KEY Constraint

Ограничение первичного ключа любого объекта Table присутствует неявно, на основе объектов Column, которые отмечены флагом Column.primary_key. Объект PrimaryKeyConstraint обеспечивает явный доступ к этому ограничению, который включает возможность непосредственной настройки:

from sqlalchemy import PrimaryKeyConstraint

my_table = Table(
    "mytable",
    metadata_obj,
    Column("id", Integer),
    Column("version_id", Integer),
    Column("data", String(50)),
    PrimaryKeyConstraint("id", "version_id", name="mytable_pk"),
)

См.также

PrimaryKeyConstraint - подробная документация по API.

Настройка ограничений при использовании расширения Declarative ORM

Table - это конструкция SQLAlchemy Core, позволяющая определить метаданные таблицы, которые, помимо прочего, могут быть использованы SQLAlchemy ORM в качестве цели для отображения класса. Расширение Declarative позволяет автоматически создавать объект Table, учитывая содержимое таблицы, прежде всего как отображение объектов Column.

Чтобы применить объекты ограничений на уровне таблицы, такие как ForeignKeyConstraint, к таблице, определенной с помощью Declarative, используйте атрибут __table_args__, описанный в Конфигурация стола.

Настройка соглашений об именовании ограничений

Реляционные базы данных обычно присваивают явные имена всем ограничениям и индексам. В обычном случае, когда таблица создается с помощью команды CREATE TABLE, где такие ограничения, как CHECK, UNIQUE и PRIMARY KEY, создаются вместе с определением таблицы, база данных обычно имеет систему, в которой имена автоматически присваиваются этим ограничениям, если имя не указано иначе. Когда существующая таблица базы данных изменяется в базе данных с помощью такой команды, как ALTER TABLE, эта команда обычно должна указать явные имена для новых ограничений, а также иметь возможность указать имя существующего ограничения, которое должно быть удалено или изменено.

Ограничения могут быть названы явно с помощью параметра Constraint.name, а для индексов - параметра Index.name. Однако в случае с ограничениями этот параметр необязателен. Существуют также случаи использования параметров Column.unique и Column.index, которые создают объекты UniqueConstraint и Index без указания явного имени.

С изменением существующих таблиц и ограничений могут справиться инструменты миграции схемы, такие как Alembic. Однако ни Alembic, ни SQLAlchemy в настоящее время не создают имен для объектов ограничений, если имя не определено, что приводит к ситуации, когда возможность изменения существующих ограничений означает, что необходимо пересмотреть систему именования, используемую реляционной базой данных для автоматического присвоения имен, или что необходимо позаботиться о том, чтобы все ограничения были названы.

В отличие от необходимости присваивать явные имена всем объектам Constraint и Index, автоматические схемы именования могут быть построены с использованием событий. Преимущество такого подхода заключается в том, что ограничения получают согласованную схему именования без необходимости использования явных параметров имени по всему коду, а также в том, что согласование происходит точно так же и для тех ограничений и индексов, которые создаются с помощью параметров Column.unique и Column.index. Начиная с SQLAlchemy 0.9.2 этот подход, основанный на событиях, включен и может быть настроен с помощью аргумента MetaData.naming_convention.

Настройка соглашения об именовании для коллекции метаданных

MetaData.naming_convention относится к словарю, который принимает класс Index или отдельные классы Constraint в качестве ключей, а шаблоны строк Python в качестве значений. Он также принимает ряд строковых кодов в качестве альтернативных ключей, "fk", "pk", "ix", "ck", "uq" для внешнего ключа, первичного ключа, индекса, проверки и уникального ограничения, соответственно. Строковые шаблоны в этом словаре используются всякий раз, когда с объектом MetaData ассоциируется ограничение или индекс, не имеющий существующего имени (включая один исключительный случай, когда существующее имя может быть дополнительно приукрашено).

Пример соглашения об именовании, которое подходит для основных случаев, выглядит следующим образом:

convention = {
    "ix": "ix_%(column_0_label)s",
    "uq": "uq_%(table_name)s_%(column_0_name)s",
    "ck": "ck_%(table_name)s_%(constraint_name)s",
    "fk": "fk_%(table_name)s_%(column_0_name)s_%(referred_table_name)s",
    "pk": "pk_%(table_name)s",
}

metadata_obj = MetaData(naming_convention=convention)

Приведенное выше соглашение устанавливает имена для всех ограничений в целевой коллекции MetaData. Например, мы можем наблюдать имя, полученное при создании безымянного ограничения UniqueConstraint:

>>> user_table = Table(
...     "user",
...     metadata_obj,
...     Column("id", Integer, primary_key=True),
...     Column("name", String(30), nullable=False),
...     UniqueConstraint("name"),
... )
>>> list(user_table.constraints)[1].name
'uq_user_name'

Это же свойство действует, даже если мы просто используем флаг Column.unique:

>>> user_table = Table(
...     "user",
...     metadata_obj,
...     Column("id", Integer, primary_key=True),
...     Column("name", String(30), nullable=False, unique=True),
... )
>>> list(user_table.constraints)[1].name
'uq_user_name'

Ключевым преимуществом подхода с использованием соглашения об именовании является то, что имена устанавливаются во время конструирования Python, а не во время эмиссии DDL. При использовании функции Alembic --autogenerate эффект заключается в том, что соглашение об именовании будет явным при создании нового сценария миграции:

def upgrade():
    op.create_unique_constraint("uq_user_name", "user", ["name"])

Приведенная выше строка "uq_user_name" была скопирована из объекта UniqueConstraint, который --autogenerate находится в наших метаданных.

Доступные маркеры включают %(table_name)s, %(referred_table_name)s, %(column_0_name)s, %(column_0_label)s, %(column_0_key)s, %(referred_column_0_name)s и %(constraint_name)s, а также многоколоночные версии каждого из них, включая %(column_0N_name)s, %(column_0_N_name)s, %(referred_column_0_N_name)s, которые отображают все имена колонок, разделенные подчеркиванием или без него. Более подробная информация о каждом из этих соглашений содержится в документации к MetaData.naming_convention.

Соглашение об именовании по умолчанию

Значение по умолчанию для MetaData.naming_convention обрабатывает давно известное поведение SQLAlchemy по присвоению имени объекту Index, который создается с помощью параметра Column.index:

>>> from sqlalchemy.sql.schema import DEFAULT_NAMING_CONVENTION
>>> DEFAULT_NAMING_CONVENTION
immutabledict({'ix': 'ix_%(column_0_label)s'})

Усечение длинных имен

Если генерируемое имя, особенно те, которые используют маркеры нескольких столбцов, слишком длинное для ограничения длины идентификатора целевой базы данных (например, PostgreSQL имеет ограничение в 63 символа), имя будет детерминистически усечено с помощью 4-символьного суффикса, основанного на md5-хэше длинного имени. Например, приведенное ниже соглашение об именовании будет генерировать очень длинные имена, учитывая используемые имена столбцов:

metadata_obj = MetaData(
    naming_convention={"uq": "uq_%(table_name)s_%(column_0_N_name)s"}
)

long_names = Table(
    "long_names",
    metadata_obj,
    Column("information_channel_code", Integer, key="a"),
    Column("billing_convention_name", Integer, key="b"),
    Column("product_identifier", Integer, key="c"),
    UniqueConstraint("a", "b", "c"),
)

В диалекте PostgreSQL имена длиной более 63 символов будут усекаться, как в следующем примере:

CREATE TABLE long_names (
    information_channel_code INTEGER,
    billing_convention_name INTEGER,
    product_identifier INTEGER,
    CONSTRAINT uq_long_names_information_channel_code_billing_conventi_a79e
    UNIQUE (information_channel_code, billing_convention_name, product_identifier)
)

Приведенный выше суффикс a79e основан на хэше md5 длинного имени и будет генерировать одно и то же значение каждый раз для создания согласованных имен для данной схемы.

Создание пользовательских маркеров для соглашений об именовании

Можно также добавить новые маркеры, указав дополнительный маркер и вызываемый объект в словаре naming_convention. Например, если мы хотим назвать наши ограничения внешнего ключа, используя схему GUID, мы можем сделать это следующим образом:

import uuid


def fk_guid(constraint, table):
    str_tokens = (
        [
            table.name,
        ]
        + [element.parent.name for element in constraint.elements]
        + [element.target_fullname for element in constraint.elements]
    )
    guid = uuid.uuid5(uuid.NAMESPACE_OID, "_".join(str_tokens).encode("ascii"))
    return str(guid)


convention = {
    "fk_guid": fk_guid,
    "ix": "ix_%(column_0_label)s",
    "fk": "fk_%(fk_guid)s",
}

Выше, когда мы создадим новый ForeignKeyConstraint, мы получим имя следующим образом:

>>> metadata_obj = MetaData(naming_convention=convention)

>>> user_table = Table(
...     "user",
...     metadata_obj,
...     Column("id", Integer, primary_key=True),
...     Column("version", Integer, primary_key=True),
...     Column("data", String(30)),
... )
>>> address_table = Table(
...     "address",
...     metadata_obj,
...     Column("id", Integer, primary_key=True),
...     Column("user_id", Integer),
...     Column("user_version_id", Integer),
... )
>>> fk = ForeignKeyConstraint(["user_id", "user_version_id"], ["user.id", "user.version"])
>>> address_table.append_constraint(fk)
>>> fk.name
fk_0cd51ab5-8d70-56e8-a83c-86661737766d

См.также

MetaData.naming_convention - для получения дополнительной информации об использовании, а также списка всех доступных компонентов именования.

The Importance of Naming Constraints - в документации Alembic.

Добавлено в версии 1.3.0: добавлены многоколоночные маркеры именования, такие как %(column_0_N_name)s. Генерируемые имена, выходящие за пределы лимита символов для целевой базы данных, будут детерминированно усекаться.

Именование ограничений CHECK

Объект CheckConstraint настраивается на произвольное SQL-выражение, в котором может присутствовать любое количество столбцов, и дополнительно часто настраивается с помощью необработанной SQL-строки. Поэтому для использования CheckConstraint обычно используется соглашение, в котором мы ожидаем, что объект уже имеет имя, а затем дополняем его другими элементами соглашения. Типичным соглашением является "ck_%(table_name)s_%(constraint_name)s":

metadata_obj = MetaData(
    naming_convention={"ck": "ck_%(table_name)s_%(constraint_name)s"}
)

Table(
    "foo",
    metadata_obj,
    Column("value", Integer),
    CheckConstraint("value > 5", name="value_gt_5"),
)

Из приведенной выше таблицы получится имя ck_foo_value_gt_5:

CREATE TABLE foo (
    value INTEGER,
    CONSTRAINT ck_foo_value_gt_5 CHECK (value > 5)
)

CheckConstraint также поддерживает маркер %(columns_0_name)s; мы можем использовать его, обеспечив использование элемента Column или column() в выражении ограничения, либо объявив ограничение отдельно от таблицы:

metadata_obj = MetaData(naming_convention={"ck": "ck_%(table_name)s_%(column_0_name)s"})

foo = Table("foo", metadata_obj, Column("value", Integer))

CheckConstraint(foo.c.value > 5)

или с помощью строки column() inline:

from sqlalchemy import column

metadata_obj = MetaData(naming_convention={"ck": "ck_%(table_name)s_%(column_0_name)s"})

foo = Table(
    "foo", metadata_obj, Column("value", Integer), CheckConstraint(column("value") > 5)
)

В обоих случаях будет получено имя ck_foo_value:

CREATE TABLE foo (
    value INTEGER,
    CONSTRAINT ck_foo_value CHECK (value > 5)
)

Определение имени «нулевого столбца» выполняется путем сканирования заданного выражения на наличие объектов столбцов. Если в выражении присутствует более одного столбца, сканирование использует детерминированный поиск, однако структура выражения определяет, какой столбец будет отмечен как «нулевой столбец».

Настройка именования для типов Boolean, Enum и других схем

Класс SchemaType относится к объектам типа, таким как Boolean и Enum, которые генерируют ограничение CHECK, сопровождающее тип. Имя для ограничения здесь наиболее непосредственно задается путем передачи параметра «name», например, Boolean.name:

Table("foo", metadata_obj, Column("flag", Boolean(name="ck_foo_flag")))

Функция соглашения об именовании также может быть объединена с этими типами, обычно с помощью соглашения, которое включает %(constraint_name)s и затем применяет имя к типу:

metadata_obj = MetaData(
    naming_convention={"ck": "ck_%(table_name)s_%(constraint_name)s"}
)

Table("foo", metadata_obj, Column("flag", Boolean(name="flag_bool")))

В приведенной выше таблице будет получено имя ограничения ck_foo_flag_bool:

CREATE TABLE foo (
    flag BOOL,
    CONSTRAINT ck_foo_flag_bool CHECK (flag IN (0, 1))
)

Классы SchemaType используют специальные внутренние символы, так что соглашение об именовании определяется только во время компиляции DDL. В PostgreSQL существует собственный тип BOOLEAN, поэтому ограничение CHECK для Boolean не нужно; мы можем спокойно установить тип Boolean без имени, несмотря на то, что для ограничений проверки существует соглашение об именовании. Это соглашение будет использоваться для ограничения CHECK только в том случае, если мы работаем с базой данных, не имеющей собственного типа BOOLEAN, например SQLite или MySQL.

Ограничение CHECK также может использовать маркер column_0_name, который хорошо сочетается с SchemaType, поскольку эти ограничения имеют только один столбец:

metadata_obj = MetaData(naming_convention={"ck": "ck_%(table_name)s_%(column_0_name)s"})

Table("foo", metadata_obj, Column("flag", Boolean()))

Приведенная выше схема приведет к созданию:

CREATE TABLE foo (
    flag BOOL,
    CONSTRAINT ck_foo_flag CHECK (flag IN (0, 1))
)

API ограничений

Object Name Description

CheckConstraint

Ограничение CHECK на уровне таблицы или столбца.

ColumnCollectionConstraint

Ограничение, проксирующее ColumnCollection.

ColumnCollectionMixin

ColumnCollection из Column объектов.

Constraint

SQL-ограничение на уровне таблицы.

conv

Отметить строку, указывающую на то, что имя уже было преобразовано в соответствии с соглашением об именовании.

ForeignKey

Определяет зависимость между двумя столбцами.

ForeignKeyConstraint

Ограничение FOREIGN KEY на уровне таблицы.

HasConditionalDDL

определить класс, включающий метод HasConditionalDDL.ddl_if(), позволяющий условно отображать DDL.

PrimaryKeyConstraint

Ограничение PRIMARY KEY на уровне таблицы.

UniqueConstraint

Ограничение UNIQUE на уровне таблицы.

class sqlalchemy.schema.Constraint

SQL-ограничение на уровне таблицы.

Constraint служит базовым классом для ряда объектов ограничений, которые могут быть связаны с объектами Table, включая PrimaryKeyConstraint, ForeignKeyConstraint, UniqueConstraint и CheckConstraint.

method sqlalchemy.schema.Constraint.__init__(name: _ConstraintNameArgument = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, info: Optional[_InfoType] = None, comment: Optional[str] = None, _create_rule: Optional[Any] = None, _type_bound: bool = False, **dialect_kw: Any) None

Создайте SQL-ограничение.

Параметры:
  • name – Необязательно, имя в базе данных для этого Constraint.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • info – Необязательный словарь данных, который будет заполнен в атрибут SchemaItem.info этого объекта.

  • comment – Необязательная строка, которая выводит SQL-комментарий о создании ограничения внешнего ключа. … versionadded:: 2.0

  • **dialect_kw – Дополнительные аргументы ключевых слов зависят от диалекта и передаются в форме <dialectname>_<argname>. Подробную информацию о документированных аргументах смотрите в документации по отдельному диалекту по адресу Диалекты.

  • _create_rule – используется внутренне некоторыми типами данных, которые также создают ограничения.

  • _type_bound – используется внутренне для указания того, что это ограничение связано с определенным типом данных.

classmethod sqlalchemy.schema.Constraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

method sqlalchemy.schema.Constraint.copy(**kw: Any) Self

Не рекомендуется, начиная с версии 1.4: Метод Constraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.Constraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.Constraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.Constraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.Constraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.Constraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.ColumnCollectionMixin

ColumnCollection из Column объектов.

Эта коллекция представляет столбцы, на которые ссылается данный объект.

class sqlalchemy.schema.ColumnCollectionConstraint

Ограничение, проксирующее ColumnCollection.

method sqlalchemy.schema.ColumnCollectionConstraint.__init__(*columns: _DDLColumnArgument, name: _ConstraintNameArgument = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, info: Optional[_InfoType] = None, _autoattach: bool = True, _column_flag: bool = False, _gather_expressions: Optional[List[_DDLColumnArgument]] = None, **dialect_kw: Any) None
Параметры:
  • *columns – Последовательность имен столбцов или объектов Column.

  • name – Необязательно, имя этого ограничения в базе данных.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • **dialect_kw – другие аргументы ключевых слов, включая специфичные для диалекта аргументы, распространяются на суперкласс Constraint.

classmethod sqlalchemy.schema.ColumnCollectionConstraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.ColumnCollectionConstraint.columns: ReadOnlyColumnCollection[str, Column[Any]]

наследуется от ColumnCollectionMixin.columns атрибута ColumnCollectionMixin

ColumnCollection, представляющий набор столбцов для данного ограничения.

method sqlalchemy.schema.ColumnCollectionConstraint.contains_column(col: Column[Any]) bool

Возвращает True, если данное ограничение содержит заданный столбец.

Обратите внимание, что этот объект также содержит атрибут .columns, который является ColumnCollection объектов Column.

method sqlalchemy.schema.ColumnCollectionConstraint.copy(*, target_table: Optional[Table] = None, **kw: Any) ColumnCollectionConstraint

Не рекомендуется, начиная с версии 1.4: Метод ColumnCollectionConstraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.ColumnCollectionConstraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.ColumnCollectionConstraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.ColumnCollectionConstraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.ColumnCollectionConstraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.ColumnCollectionConstraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.CheckConstraint

Ограничение CHECK на уровне таблицы или столбца.

Может быть включено в определение таблицы или столбца.

method sqlalchemy.schema.CheckConstraint.__init__(sqltext: _TextCoercedExpressionArgument[Any], name: _ConstraintNameArgument = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, table: Optional[Table] = None, info: Optional[_InfoType] = None, _create_rule: Optional[Any] = None, _autoattach: bool = True, _type_bound: bool = False, **dialect_kw: Any) None

Постройте ограничение CHECK.

Параметры:
  • sqltext – Строка, содержащая определение ограничения, которое будет использоваться дословно, или конструкцию выражения SQL. Если объект задан в виде строки, он преобразуется в объект text(). Если текстовая строка включает символ двоеточия, экранируйте его с помощью обратной косой черты:: CheckConstraint(r «foo ~ E’a(?:b|c)d») … warning:: Аргумент CheckConstraint.sqltext в CheckConstraint может быть передан как строковый аргумент Python, который будет рассматриваться как доверенный текст SQL и отображаться как указано. НЕ ПЕРЕДАВАЙТЕ НЕДОВЕРЕННЫЙ ВВОД В ЭТОТ ПАРАМЕТР.

  • name – Необязательно, имя ограничения в базе данных.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • info – Необязательный словарь данных, который будет заполнен в атрибут SchemaItem.info этого объекта.

classmethod sqlalchemy.schema.CheckConstraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.CheckConstraint.columns: ReadOnlyColumnCollection[str, Column[Any]]

наследуется от ColumnCollectionMixin.columns атрибута ColumnCollectionMixin

ColumnCollection, представляющий набор столбцов для данного ограничения.

method sqlalchemy.schema.CheckConstraint.contains_column(col: Column[Any]) bool

Возвращает True, если данное ограничение содержит заданный столбец.

Обратите внимание, что этот объект также содержит атрибут .columns, который является ColumnCollection объектов Column.

method sqlalchemy.schema.CheckConstraint.copy(*, target_table: Optional[Table] = None, **kw: Any) CheckConstraint

Не рекомендуется, начиная с версии 1.4: Метод CheckConstraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.CheckConstraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.CheckConstraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.CheckConstraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.CheckConstraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.CheckConstraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.ForeignKey

Определяет зависимость между двумя столбцами.

ForeignKey указывается в качестве аргумента объекта Column, например:

t = Table("remote_table", metadata,
    Column("remote_id", ForeignKey("main_table.id"))
)

Обратите внимание, что ForeignKey - это только объект-маркер, определяющий зависимость между двумя столбцами. Фактическое ограничение во всех случаях представлено объектом ForeignKeyConstraint. Этот объект генерируется автоматически, когда ForeignKey связан с Column, который в свою очередь связан с Table. И наоборот, когда ForeignKeyConstraint применяется к Table, автоматически генерируются маркеры ForeignKey, которые будут присутствовать на каждом связанном Column, которые также связаны с объектом ограничения.

Обратите внимание, что вы не можете определить «составное» ограничение внешнего ключа, то есть ограничение между группировкой нескольких родительских/дочерних столбцов, используя объекты ForeignKey. Чтобы определить такую группировку, необходимо использовать объект ForeignKeyConstraint и применить его к Table. Связанные объекты ForeignKey создаются автоматически.

Объекты ForeignKey, связанные с отдельным объектом Column, доступны в коллекции foreign_keys этого столбца.

Другие примеры конфигурации внешнего ключа приведены в Определение внешних ключей.

method sqlalchemy.schema.ForeignKey.__init__(column: _DDLColumnArgument, _constraint: Optional[ForeignKeyConstraint] = None, use_alter: bool = False, name: _ConstraintNameArgument = None, onupdate: Optional[str] = None, ondelete: Optional[str] = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, link_to_name: bool = False, match: Optional[str] = None, info: Optional[_InfoType] = None, comment: Optional[str] = None, _unresolvable: bool = False, **dialect_kw: Any)

Создайте FOREIGN KEY на уровне столбца.

Объект ForeignKey при построении создает объект ForeignKeyConstraint, который связан с коллекцией ограничений родительского объекта Table.

Параметры:
  • column – Один целевой столбец для ключевого отношения. Объект Column или имя столбца в виде строки: tablename.columnkey или schema.tablename.columnkey. columnkey - это key, которое было присвоено столбцу (по умолчанию это имя самого столбца), если только link_to_name не True, в этом случае используется визуализированное имя столбца.

  • name – Необязательная строка. Имя ключа в базе данных, если не указано constraint.

  • onupdate – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдается ON UPDATE <значение>. Типичные значения включают CASCADE, DELETE и RESTRICT.

  • ondelete – Необязательная строка. Если установлено, то при выдаче DDL для этого ограничения выдается ON DELETE <значение>. Типичные значения включают CASCADE, DELETE и RESTRICT.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • link_to_name – если True, то строковое имя, указанное в column, является отображаемым именем ссылаемого столбца, а не его локально назначенным именем key.

  • use_alter – передается базовому ForeignKeyConstraint, чтобы указать, что ограничение должно быть сгенерировано/отменено вне оператора CREATE TABLE/ DROP TABLE. Дальнейшее описание см. в ForeignKeyConstraint.use_alter. … см. также:: ForeignKeyConstraint.use_alter Создание/удаление ограничений внешних ключей с помощью ALTER

  • match – Необязательная строка. Если установлено, то при выдаче DDL для этого ограничения выдается MATCH <значение>. Типичные значения: SIMPLE, PARTIAL и FULL.

  • info – Необязательный словарь данных, который будет заполнен в атрибут SchemaItem.info этого объекта.

  • comment – Необязательная строка, которая выводит SQL-комментарий о создании ограничения внешнего ключа. … versionadded:: 2.0

  • **dialect_kw – Дополнительные аргументы ключевых слов зависят от диалекта и передаются в форме <dialectname>_<argname>. Аргументы в конечном итоге обрабатываются соответствующим ForeignKeyConstraint. Подробнее о документированных аргументах смотрите документацию по отдельному диалекту в Диалекты.

classmethod sqlalchemy.schema.ForeignKey.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.ForeignKey.column

Возвращает цель Column, на которую ссылается данный ForeignKey.

Если целевой столбец не был создан, возникает исключение.

method sqlalchemy.schema.ForeignKey.copy(*, schema: Optional[str] = None, **kw: Any) ForeignKey

Не рекомендуется, начиная с версии 1.4: Метод ForeignKey.copy() является устаревшим и будет удален в одном из будущих выпусков.

attribute sqlalchemy.schema.ForeignKey.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.ForeignKey.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

method sqlalchemy.schema.ForeignKey.get_referent(table: FromClause) Optional[Column[Any]]

Возвращает Column в данном Table (или любом FromClause), на который ссылается данный ForeignKey.

Возвращает None, если данный ForeignKey не ссылается на данный Table.

attribute sqlalchemy.schema.ForeignKey.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.ForeignKey.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

method sqlalchemy.schema.ForeignKey.references(table: Table) bool

Возвращает True, если на данный Table ссылается данный ForeignKey.

attribute sqlalchemy.schema.ForeignKey.target_fullname

Возвращает строковую «спецификацию столбцов» для данного ForeignKey.

Обычно это эквивалент строкового аргумента «tablename.colname», впервые переданного в конструктор объекта.

class sqlalchemy.schema.ForeignKeyConstraint

Ограничение FOREIGN KEY на уровне таблицы.

Определяет один столбец или составной FOREIGN KEY … REFERENCES. Для одностолбцового внешнего ключа, не требующего особых усилий, добавление ForeignKey к определению Column является сокращенным эквивалентом для безымянного одностолбцового ForeignKeyConstraint.

Примеры конфигурации внешнего ключа приведены в Определение внешних ключей.

method sqlalchemy.schema.ForeignKeyConstraint.__init__(columns: _typing_Sequence[_DDLColumnArgument], refcolumns: _typing_Sequence[_DDLColumnArgument], name: _ConstraintNameArgument = None, onupdate: Optional[str] = None, ondelete: Optional[str] = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, use_alter: bool = False, link_to_name: bool = False, match: Optional[str] = None, table: Optional[Table] = None, info: Optional[_InfoType] = None, comment: Optional[str] = None, **dialect_kw: Any) None

Постройте FOREIGN KEY с возможностью композиции.

Параметры:
  • columns – Последовательность локальных имен столбцов. Именованные столбцы должны быть определены и присутствовать в родительской таблице. Имена должны совпадать с key, заданным для каждого столбца (по умолчанию имя), если только link_to_name не равно True.

  • refcolumns – Последовательность имен иностранных столбцов или объектов Column. Все столбцы должны находиться в одной таблице.

  • name – Необязательно, имя ключа в базе данных.

  • onupdate – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдается ON UPDATE <значение>. Типичные значения включают CASCADE, DELETE и RESTRICT.

  • ondelete – Необязательная строка. Если установлено, то при выдаче DDL для этого ограничения выдается ON DELETE <значение>. Типичные значения включают CASCADE, DELETE и RESTRICT.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • link_to_name – если True, то строковое имя, указанное в column, является отображаемым именем ссылаемого столбца, а не его локально назначенным именем key.

  • use_alter – Если True, не создавайте DDL для этого ограничения как часть определения CREATE TABLE. Вместо этого создайте его с помощью оператора ALTER TABLE, выпущенного после создания полной коллекции таблиц, и удалите его с помощью оператора ALTER TABLE перед удалением полной коллекции таблиц. Использование ForeignKeyConstraint.use_alter особенно актуально для случая, когда две или более таблиц созданы в рамках взаимозависимых отношений ограничения внешнего ключа; однако методы MetaData.create_all() и MetaData.drop_all() выполняют это разрешение автоматически, поэтому флаг обычно не нужен. … seealso:: Создание/удаление ограничений внешних ключей с помощью ALTER

  • match – Необязательная строка. Если установлено, то при выдаче DDL для этого ограничения выдается MATCH <значение>. Типичные значения: SIMPLE, PARTIAL и FULL.

  • info – Необязательный словарь данных, который будет заполнен в атрибут SchemaItem.info этого объекта.

  • comment – Необязательная строка, которая выводит SQL-комментарий о создании ограничения внешнего ключа. … versionadded:: 2.0

  • **dialect_kw – Дополнительные аргументы ключевых слов зависят от диалекта и передаются в форме <dialectname>_<argname>. Подробную информацию о документированных аргументах смотрите в документации по отдельному диалекту по адресу Диалекты.

classmethod sqlalchemy.schema.ForeignKeyConstraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.ForeignKeyConstraint.column_keys

Возвращает список строковых ключей, представляющих локальные колонки в данном ForeignKeyConstraint.

Этот список представляет собой либо исходные строковые аргументы, переданные в конструктор ForeignKeyConstraint, либо, если ограничение было инициализировано объектами Column, строку .key каждого элемента.

attribute sqlalchemy.schema.ForeignKeyConstraint.columns: ReadOnlyColumnCollection[str, Column[Any]]

наследуется от ColumnCollectionMixin.columns атрибута ColumnCollectionMixin

ColumnCollection, представляющий набор столбцов для данного ограничения.

method sqlalchemy.schema.ForeignKeyConstraint.contains_column(col: Column[Any]) bool

Возвращает True, если данное ограничение содержит заданный столбец.

Обратите внимание, что этот объект также содержит атрибут .columns, который является ColumnCollection объектов Column.

method sqlalchemy.schema.ForeignKeyConstraint.copy(*, schema: Optional[str] = None, target_table: Optional[Table] = None, **kw: Any) ForeignKeyConstraint

Не рекомендуется, начиная с версии 1.4: Метод ForeignKeyConstraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.ForeignKeyConstraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.ForeignKeyConstraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.ForeignKeyConstraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.ForeignKeyConstraint.elements: List[ForeignKey]

Последовательность объектов ForeignKey.

Каждый ForeignKey представляет собой одну пару ссылающийся столбец/ссылающийся столбец.

Эта коллекция предназначена только для чтения.

attribute sqlalchemy.schema.ForeignKeyConstraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.ForeignKeyConstraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

attribute sqlalchemy.schema.ForeignKeyConstraint.referred_table

Объект Table, на который ссылается этот ForeignKeyConstraint.

Это динамически вычисляемый атрибут, который может быть недоступен, если ограничение и/или родительская таблица еще не связаны с коллекцией метаданных, содержащей упомянутую таблицу.

class sqlalchemy.schema.HasConditionalDDL

определить класс, включающий метод HasConditionalDDL.ddl_if(), позволяющий условно отображать DDL.

В настоящее время применяется к ограничениям и индексам.

Members

ddl_if()

Добавлено в версии 2.0.

method sqlalchemy.schema.HasConditionalDDL.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

class sqlalchemy.schema.PrimaryKeyConstraint

Ограничение PRIMARY KEY на уровне таблицы.

Объект PrimaryKeyConstraint автоматически присутствует на любом объекте Table; ему назначается набор объектов Column, соответствующих объектам, помеченным флагом Column.primary_key:

>>> my_table = Table('mytable', metadata,
...                 Column('id', Integer, primary_key=True),
...                 Column('version_id', Integer, primary_key=True),
...                 Column('data', String(50))
...     )
>>> my_table.primary_key
PrimaryKeyConstraint(
    Column('id', Integer(), table=<mytable>,
           primary_key=True, nullable=False),
    Column('version_id', Integer(), table=<mytable>,
           primary_key=True, nullable=False)
)

Первичный ключ Table также может быть задан с помощью объекта PrimaryKeyConstraint в явном виде; в этом режиме использования также может быть указано «имя» ограничения, а также другие параметры, которые могут быть распознаны диалектами:

my_table = Table('mytable', metadata,
            Column('id', Integer),
            Column('version_id', Integer),
            Column('data', String(50)),
            PrimaryKeyConstraint('id', 'version_id',
                                 name='mytable_pk')
        )

Эти два стиля указания столбцов, как правило, не следует смешивать. Предупреждение выдается, если столбцы, присутствующие в PrimaryKeyConstraint, не совпадают со столбцами, которые были помечены как primary_key=True, если они оба присутствуют; в этом случае столбцы берутся строго из объявления PrimaryKeyConstraint, а столбцы, помеченные как primary_key=True, игнорируются. Это поведение предназначено для обратной совместимости с предыдущим поведением.

Для случая, когда на PrimaryKeyConstraint необходимо указать конкретные параметры, но обычный стиль использования флагов primary_key=True по-прежнему желателен, можно указать пустой PrimaryKeyConstraint, который возьмет коллекцию столбцов первичного ключа из Table на основе флагов:

my_table = Table('mytable', metadata,
            Column('id', Integer, primary_key=True),
            Column('version_id', Integer, primary_key=True),
            Column('data', String(50)),
            PrimaryKeyConstraint(name='mytable_pk',
                                 mssql_clustered=True)
        )
classmethod sqlalchemy.schema.PrimaryKeyConstraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.PrimaryKeyConstraint.columns: ReadOnlyColumnCollection[str, Column[Any]]

наследуется от ColumnCollectionMixin.columns атрибута ColumnCollectionMixin

ColumnCollection, представляющий набор столбцов для данного ограничения.

method sqlalchemy.schema.PrimaryKeyConstraint.contains_column(col: Column[Any]) bool

Возвращает True, если данное ограничение содержит заданный столбец.

Обратите внимание, что этот объект также содержит атрибут .columns, который является ColumnCollection объектов Column.

method sqlalchemy.schema.PrimaryKeyConstraint.copy(*, target_table: Optional[Table] = None, **kw: Any) ColumnCollectionConstraint

наследуется от ColumnCollectionConstraint.copy() метода ColumnCollectionConstraint

Не рекомендуется, начиная с версии 1.4: Метод ColumnCollectionConstraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.PrimaryKeyConstraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.PrimaryKeyConstraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.PrimaryKeyConstraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.PrimaryKeyConstraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.PrimaryKeyConstraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.UniqueConstraint

Ограничение UNIQUE на уровне таблицы.

Определяет ограничение UNIQUE для одного столбца или составное ограничение UNIQUE. Для одностолбцового ограничения, не требующего особых усилий, добавление unique=True к определению Column является сокращенным эквивалентом для безымянного одностолбцового UniqueConstraint.

method sqlalchemy.schema.UniqueConstraint.__init__(*columns: _DDLColumnArgument, name: _ConstraintNameArgument = None, deferrable: Optional[bool] = None, initially: Optional[str] = None, info: Optional[_InfoType] = None, _autoattach: bool = True, _column_flag: bool = False, _gather_expressions: Optional[List[_DDLColumnArgument]] = None, **dialect_kw: Any) None

наследуется от sqlalchemy.schema.ColumnCollectionConstraint.__init__ метода ColumnCollectionConstraint

Параметры:
  • *columns – Последовательность имен столбцов или объектов Column.

  • name – Необязательно, имя этого ограничения в базе данных.

  • deferrable – Необязательный параметр bool. Если установлен, то при выпуске DDL для этого ограничения выдавать DEFERRABLE или NOT DEFERRABLE.

  • initially – Необязательная строка. Если установлено, то при выпуске DDL для этого ограничения выдавать INITIALLY <значение>.

  • **dialect_kw – другие аргументы ключевых слов, включая специфичные для диалекта аргументы, распространяются на суперкласс Constraint.

classmethod sqlalchemy.schema.UniqueConstraint.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

attribute sqlalchemy.schema.UniqueConstraint.columns: ReadOnlyColumnCollection[str, Column[Any]]

наследуется от ColumnCollectionMixin.columns атрибута ColumnCollectionMixin

ColumnCollection, представляющий набор столбцов для данного ограничения.

method sqlalchemy.schema.UniqueConstraint.contains_column(col: Column[Any]) bool

Возвращает True, если данное ограничение содержит заданный столбец.

Обратите внимание, что этот объект также содержит атрибут .columns, который является ColumnCollection объектов Column.

method sqlalchemy.schema.UniqueConstraint.copy(*, target_table: Optional[Table] = None, **kw: Any) ColumnCollectionConstraint

наследуется от ColumnCollectionConstraint.copy() метода ColumnCollectionConstraint

Не рекомендуется, начиная с версии 1.4: Метод ColumnCollectionConstraint.copy() является устаревшим и будет удален в одном из будущих выпусков.

method sqlalchemy.schema.UniqueConstraint.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.UniqueConstraint.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.UniqueConstraint.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

attribute sqlalchemy.schema.UniqueConstraint.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.UniqueConstraint.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

function sqlalchemy.schema.conv(value: str, quote: Optional[bool] = None) Any

Отметить строку, указывающую на то, что имя уже было преобразовано в соответствии с соглашением об именовании.

Это строковый подкласс, указывающий на имя, которое не должно подчиняться никаким дальнейшим соглашениям об именовании.

Например, когда мы создаем Constraint, используя соглашение об именовании следующим образом:

m = MetaData(naming_convention={
    "ck": "ck_%(table_name)s_%(constraint_name)s"
})
t = Table('t', m, Column('x', Integer),
                CheckConstraint('x > 5', name='x5'))

Имя вышеуказанного ограничения будет отображаться как "ck_t_x5". То есть, существующее имя x5 используется в соглашении об именовании как маркер constraint_name.

В некоторых ситуациях, например, в сценариях миграции, мы можем отобразить вышеупомянутое CheckConstraint с именем, которое уже было преобразовано. Чтобы убедиться, что имя не будет дважды изменено, новое имя применяется с помощью маркера conv(). Мы можем использовать его в явном виде следующим образом:

m = MetaData(naming_convention={
    "ck": "ck_%(table_name)s_%(constraint_name)s"
})
t = Table('t', m, Column('x', Integer),
                CheckConstraint('x > 5', name=conv('ck_t_x5')))

Там, где выше, маркер conv() указывает, что имя ограничения здесь окончательное, и имя будет отображаться как "ck_t_x5", а не "ck_t_ck_t_x5".

Индексы

Индексы могут быть созданы анонимно (с использованием автоматически генерируемого имени ix_<column label>) для одного столбца с помощью ключевого слова inline index на Column, которое также изменяет использование unique для применения уникальности к самому индексу, вместо добавления отдельного ограничения UNIQUE. Для индексов с определенными именами или охватывающих более одного столбца, используйте конструкцию Index, которая требует указания имени.

Ниже показана таблица Table с несколькими связанными с ней объектами Index. DDL для «CREATE INDEX» выдается сразу после операторов создания таблицы:

metadata_obj = MetaData()
mytable = Table(
    "mytable",
    metadata_obj,
    # an indexed column, with index "ix_mytable_col1"
    Column("col1", Integer, index=True),
    # a uniquely indexed column with index "ix_mytable_col2"
    Column("col2", Integer, index=True, unique=True),
    Column("col3", Integer),
    Column("col4", Integer),
    Column("col5", Integer),
    Column("col6", Integer),
)

# place an index on col3, col4
Index("idx_col34", mytable.c.col3, mytable.c.col4)

# place a unique index on col5, col6
Index("myindex", mytable.c.col5, mytable.c.col6, unique=True)

mytable.create(engine)
{execsql}CREATE TABLE mytable (
    col1 INTEGER,
    col2 INTEGER,
    col3 INTEGER,
    col4 INTEGER,
    col5 INTEGER,
    col6 INTEGER
)
CREATE INDEX ix_mytable_col1 ON mytable (col1)
CREATE UNIQUE INDEX ix_mytable_col2 ON mytable (col2)
CREATE UNIQUE INDEX myindex ON mytable (col5, col6)
CREATE INDEX idx_col34 ON mytable (col3, col4){stop}

Обратите внимание, что в приведенном примере конструкция Index создается вне таблицы, которой она соответствует, используя непосредственно объекты Column. Index также поддерживает определение «inline» внутри Table, используя строковые имена для идентификации столбцов:

metadata_obj = MetaData()
mytable = Table(
    "mytable",
    metadata_obj,
    Column("col1", Integer),
    Column("col2", Integer),
    Column("col3", Integer),
    Column("col4", Integer),
    # place an index on col1, col2
    Index("idx_col12", "col1", "col2"),
    # place a unique index on col3, col4
    Index("idx_col34", "col3", "col4", unique=True),
)

Объект Index также поддерживает свой собственный метод create():

i = Index("someindex", mytable.c.col5)
i.create(engine)
{execsql}CREATE INDEX someindex ON mytable (col5){stop}

Функциональные индексы

Index поддерживает SQL и функциональные выражения, поддерживаемые целевым бэкендом. Для создания индекса по столбцу, использующему убывающее значение, можно использовать модификатор ColumnElement.desc():

from sqlalchemy import Index

Index("someindex", mytable.c.somecol.desc())

Или с бэкендом, поддерживающим функциональные индексы, таким как PostgreSQL, индекс «без учета регистра» может быть создан с помощью функции lower():

from sqlalchemy import func, Index

Index("someindex", func.lower(mytable.c.somecol))

Index API

Object Name Description

Index

ИНДЕКС на уровне таблицы.

class sqlalchemy.schema.Index

ИНДЕКС на уровне таблицы.

Определяет составной (один или несколько столбцов) ИНДЕКС.

Например:

sometable = Table("sometable", metadata,
                Column("name", String(50)),
                Column("address", String(100))
            )

Index("some_index", sometable.c.name)

Для одностолбцового индекса, не требующего особых усилий, добавление Column также поддерживает index=True:

sometable = Table("sometable", metadata,
                Column("name", String(50), index=True)
            )

Для составного индекса можно указать несколько столбцов:

Index("some_index", sometable.c.name, sometable.c.address)

Функциональные индексы также поддерживаются, обычно с помощью конструкции func в сочетании с привязанными к таблице объектами Column:

Index("some_index", func.lower(sometable.c.name))

Колонки Index также могут быть вручную связаны с колонками Table, либо через встроенное объявление, либо с помощью Table.append_constraint(). При использовании этого подхода имена индексируемых столбцов могут быть заданы в виде строк:

Table("sometable", metadata,
                Column("name", String(50)),
                Column("address", String(100)),
                Index("some_index", "name", "address")
        )

Для поддержки функциональных или основанных на выражениях индексов в этой форме может использоваться конструкция text():

from sqlalchemy import text

Table("sometable", metadata,
                Column("name", String(50)),
                Column("address", String(100)),
                Index("some_index", text("lower(name)"))
        )

См.также

Индексы - Общая информация о Index.

Параметры индекса, специфичные для PostgreSQL - специфические для PostgreSQL опции, доступные для конструкции Index.

MySQL / MariaDB - специфические параметры индекса - специфические для MySQL опции, доступные для конструкции Index.

Поддержка кластеризованных индексов - специфические для MSSQL опции, доступные для конструкции Index.

method sqlalchemy.schema.Index.__init__(name: Optional[str], *expressions: _DDLColumnArgument, unique: bool = False, quote: Optional[bool] = None, info: Optional[_InfoType] = None, _table: Optional[Table] = None, _column_flag: bool = False, **dialect_kw: Any) None

Создайте объект индекса.

Параметры:
  • name – Имя индекса

  • *expressions – Выражения столбцов для включения в индекс. Выражения обычно являются экземплярами Column, но могут быть и произвольными выражениями SQL, которые в конечном итоге ссылаются на Column.

  • unique=False – Только ключевой аргумент; если True, создается уникальный индекс.

  • quote=None – Аргумент только для ключевого слова; применять ли кавычки к имени индекса. Работает так же, как и Column.quote.

  • info=None – Необязательный словарь данных, который будет заполнен в атрибут SchemaItem.info этого объекта.

  • **dialect_kw – Дополнительные аргументы ключевых слов, не упомянутые выше, зависят от диалекта и передаются в форме <dialectname>_<argname>. Подробную информацию о документированных аргументах смотрите в документации по отдельному диалекту по адресу Диалекты.

classmethod sqlalchemy.schema.Index.argument_for(dialect_name, argument_name, default)

наследуется от DialectKWArgs.argument_for() метода DialectKWArgs

Добавьте новый вид аргумента ключевого слова, специфичного для диалекта, для этого класса.

Например:

Index.argument_for("mydialect", "length", None)

some_index = Index('a', 'b', mydialect_length=5)

Метод DialectKWArgs.argument_for() является способом добавления дополнительных аргументов в словарь DefaultDialect.construct_arguments. Этот словарь содержит список имен аргументов, принимаемых различными конструкциями уровня схемы от имени диалекта.

Новые диалекты, как правило, должны определять этот словарь сразу как член данных класса диалекта. Случаи добавления имен аргументов ad-hoc обычно используются для кода конечного пользователя, который также использует пользовательскую схему компиляции, потребляющую дополнительные аргументы.

Параметры:
  • dialect_name – имя диалекта. Диалект должен быть локализуемым, в противном случае выдается сообщение NoSuchModuleError. Диалект также должен включать существующую коллекцию DefaultDialect.construct_arguments, указывающую на то, что он участвует в системе проверки ключевых слов-аргументов и умолчаний, иначе будет выдано ArgumentError. Если диалект не включает эту коллекцию, то любой аргумент ключевого слова может быть указан от имени уже этого диалекта. Все диалекты, упакованные в SQLAlchemy, включают эту коллекцию, однако для диалектов сторонних производителей поддержка может отличаться.

  • argument_name – имя параметра.

  • default – значение параметра по умолчанию.

method sqlalchemy.schema.Index.create(bind: _CreateDropBind, checkfirst: bool = False) None

Выдать оператор CREATE для данного Index, используя данный Connection или Engine для связи.

См.также

MetaData.create_all().

method sqlalchemy.schema.Index.ddl_if(dialect: Optional[str] = None, callable_: Optional[DDLIfCallable] = None, state: Optional[Any] = None) Self

наследуется от HasConditionalDDL.ddl_if() метода HasConditionalDDL

применить условное правило DDL к этому элементу схемы.

Эти правила работают аналогично вызываемым ExecutableDDLElement.execute_if(), с добавлением возможности проверки критериев на этапе компиляции DDL для такой конструкции, как CreateTable. HasConditionalDDL.ddl_if() в настоящее время применяется к конструкции Index, а также ко всем конструкциям Constraint.

Параметры:
  • dialect – строковое имя диалекта, или кортеж строковых имен для указания нескольких типов диалектов.

  • callable_ – вызываемый объект, который строится с использованием той же формы, которая описана в ExecutableDDLElement.execute_if.callable_.

  • state – произвольный объект, который будет передан вызываемому объекту, если он присутствует.

Добавлено в версии 2.0.

См.также

Управление генерацией ограничений и индексов в DDL - история вопроса и примеры использования

attribute sqlalchemy.schema.Index.dialect_kwargs

наследуется от DialectKWArgs.dialect_kwargs атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Аргументы представлены здесь в их оригинальном формате <dialect>_<kwarg>. Включены только те аргументы, которые действительно были переданы; в отличие от коллекции DialectKWArgs.dialect_options, которая содержит все опции, известные этому диалекту, включая значения по умолчанию.

Коллекция также доступна для записи; ключи принимаются в форме <dialect>_<kwarg>, где значение будет собрано в список опций.

См.также

DialectKWArgs.dialect_options - форма вложенного словаря

attribute sqlalchemy.schema.Index.dialect_options

наследуется от DialectKWArgs.dialect_options атрибута DialectKWArgs

Набор аргументов ключевых слов, заданных как специфические для диалекта опции этой конструкции.

Это двухуровневый вложенный реестр, ключами которого являются <dialect_name> и <argument_name>. Например, аргумент postgresql_where можно найти как:

arg = my_object.dialect_options['postgresql']['where']

Добавлено в версии 0.9.2.

См.также

DialectKWArgs.dialect_kwargs - плоская словарная форма

method sqlalchemy.schema.Index.drop(bind: _CreateDropBind, checkfirst: bool = False) None

Выдать утверждение DROP для данного Index, используя для связи данное Connection или Engine.

См.также

MetaData.drop_all().

attribute sqlalchemy.schema.Index.info

наследуется от SchemaItem.info атрибута SchemaItem

Информационный словарь, связанный с объектом, позволяющий связать пользовательские данные с этим SchemaItem.

Словарь автоматически создается при первом обращении к нему. Он также может быть указан в конструкторе некоторых объектов, таких как Table и Column.

attribute sqlalchemy.schema.Index.kwargs

наследуется от DialectKWArgs.kwargs атрибута DialectKWArgs

Синоним для DialectKWArgs.dialect_kwargs.

Вернуться на верх