Definition von Constraints und Indizes

Dieser Abschnitt behandelt SQL- Constraints und Indizes. In SQLAlchemy sind die wichtigsten Klassen ForeignKeyConstraint und Index.

Definition von Fremdschlüsseln

Ein Fremdschlüssel in SQL ist ein Tabellen-Level-Konstrukt, das eine oder mehrere Spalten in dieser Tabelle einschränkt, um nur Werte zuzulassen, die in einer anderen Menge von Spalten vorhanden sind, typischerweise, aber nicht immer, auf einer anderen Tabelle. Wir nennen die eingeschränkten Spalten die Fremdschlüssel-Spalten und die Spalten, auf die sie eingeschränkt sind, die referenzierten Spalten. Die referenzierten Spalten definieren fast immer den Primärschlüssel für ihre besitzende Tabelle, obwohl es Ausnahmen gibt. Der Fremdschlüssel ist die „Verbindung“, die Paare von Zeilen verbindet, die eine Beziehung zueinander haben, und SQLAlchemy misst diesem Konzept in praktisch jedem Bereich seiner Operationen eine sehr tiefe Bedeutung bei.

In SQLAlchemy sowie in DDL können Fremdschlüssel-Constraints als zusätzliche Attribute innerhalb der Tabellenklausel definiert werden, oder für einspaltige Fremdschlüssel können sie optional innerhalb der Definition einer einzelnen Spalte angegeben werden. Der einspaltige Fremdschlüssel ist häufiger und wird auf Spaltenebene durch die Konstruktion eines ForeignKey-Objekts als Argument zu einem Column-Objekt spezifiziert.

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)),
)

Oben definieren wir eine neue Tabelle user_preference, für die jede Zeile einen Wert in der Spalte user_id enthalten muss, der auch in der Spalte user_id der Tabelle user vorhanden ist.

Das Argument für ForeignKey ist am häufigsten ein String der Form <tablename>.<columnname>, oder für eine Tabelle in einem entfernten Schema oder „Owner“ die Form <schemaname>.<tablename>.<columnname>. Es kann auch ein tatsächliches Column-Objekt sein, das, wie wir später sehen werden, aus einem vorhandenen Table-Objekt über seine c-Sammlung abgerufen wird.

ForeignKey(user.c.user_id)

Der Vorteil der Verwendung eines Strings besteht darin, dass die Verknüpfung in Python zwischen user und user_preference erst bei Bedarf aufgelöst wird, sodass Tabellenobjekte leicht über mehrere Module verteilt und in beliebiger Reihenfolge definiert werden können.

Fremdschlüssel können auch auf Tabellenebene über das Objekt ForeignKeyConstraint definiert werden. Dieses Objekt kann einen ein- oder mehrspaltigen Fremdschlüssel beschreiben. Ein mehrspaltiger Fremdschlüssel wird als zusammengesetzter Fremdschlüssel bezeichnet und referenziert fast immer eine Tabelle, die einen zusammengesetzten Primärschlüssel hat. Unten definieren wir eine Tabelle invoice, die einen zusammengesetzten Primärschlüssel hat.

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),
)

Und dann eine Tabelle invoice_item mit einem zusammengesetzten Fremdschlüssel, der auf invoice verweist.

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"]
    ),
)

Es ist wichtig zu beachten, dass die ForeignKeyConstraint die einzige Möglichkeit ist, einen zusammengesetzten Fremdschlüssel zu definieren. Obwohl wir auch einzelne ForeignKey-Objekte auf beiden Spalten invoice_item.invoice_id und invoice_item.ref_num hätten platzieren können, wäre SQLAlchemy nicht bewusst, dass diese beiden Werte zusammengehören sollten – es wären zwei einzelne Fremdschlüssel-Constraints statt eines einzelnen zusammengesetzten Fremdschlüssels, der auf zwei Spalten verweist.

Erstellen/Löschen von Fremdschlüssel-Constraints per ALTER

Das Verhalten, das wir in Tutorials und anderswo bei Fremdschlüsseln mit DDL gesehen haben, zeigt, dass die Constraints typischerweise „inline“ innerhalb der CREATE TABLE-Anweisung gerendert werden, wie z. B.

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)
)

Die Direktive CONSTRAINT .. FOREIGN KEY wird verwendet, um den Constraint „inline“ innerhalb der CREATE TABLE-Definition zu erstellen. Die Methoden MetaData.create_all() und MetaData.drop_all() tun dies standardmäßig, indem sie eine topologische Sortierung aller beteiligten Table-Objekte verwenden, sodass Tabellen in der Reihenfolge ihrer Fremdschlüsselabhängigkeit erstellt und gelöscht werden (diese Sortierung ist auch über den MetaData.sorted_tables-Accessor verfügbar).

Dieser Ansatz funktioniert nicht, wenn zwei oder mehr Fremdschlüssel-Constraints in einem „Abhängigkeitszyklus“ beteiligt sind, d. h. eine Menge von Tabellen gegenseitig voneinander abhängig ist, vorausgesetzt, das Backend erzwingt Fremdschlüssel (immer der Fall außer bei SQLite, MySQL/MyISAM). Die Methoden werden daher Constraints in einem solchen Zyklus in separate ALTER-Anweisungen aufbrechen, auf allen Backends außer SQLite, das die meisten Formen von ALTER nicht unterstützt. Gegeben ein Schema wie

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"
    ),
)

Wenn wir MetaData.create_all() auf einem Backend wie dem PostgreSQL-Backend aufrufen, wird der Zyklus zwischen diesen beiden Tabellen aufgelöst und die Constraints werden separat erstellt.

>>> with engine.connect() as conn:
...     metadata_obj.create_all(conn, checkfirst=False)
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)

Um diese Tabellen zu löschen, gilt die gleiche Logik. Beachten Sie jedoch, dass in SQL das Löschen von Constraints erfordert, dass der Constraint einen Namen hat. Im Fall der 'node'-Tabelle oben haben wir diesen Constraint nicht benannt; das System wird daher versuchen, nur die benannten Constraints zu löschen.

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

Wenn der Zyklus nicht aufgelöst werden kann, z. B. wenn wir hier keinerlei Namen für einen der Constraints vergeben hätten, erhalten wir die folgende Fehlermeldung.

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.

Dieser Fehler gilt nur für den DROP-Fall, da wir „ADD CONSTRAINT“ im CREATE-Fall ohne Namen ausgeben können; die Datenbank weist normalerweise automatisch einen zu.

Die Schlüsselwörter ForeignKeyConstraint.use_alter und ForeignKey.use_alter können verwendet werden, um Abhängigkeitszyklen manuell aufzulösen. Wir können dieses Flag nur für die Tabelle 'element' wie folgt hinzufügen.

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",
    ),
)

In unserem CREATE DDL sehen wir die ALTER-Anweisung nur für diesen Constraint und nicht für den anderen.

>>> with engine.connect() as conn:
...     metadata_obj.create_all(conn, checkfirst=False)
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)

ForeignKeyConstraint.use_alter und ForeignKey.use_alter erfordern bei Verwendung in Verbindung mit einer Löschoperation, dass der Constraint benannt ist, andernfalls wird ein Fehler wie der folgende generiert.

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

ON UPDATE und ON DELETE

Die meisten Datenbanken unterstützen das Kaskadieren von Fremdschlüsselwerten, d. h. wenn eine übergeordnete Zeile aktualisiert wird, wird der neue Wert in untergeordnete Zeilen geschrieben, oder wenn die übergeordnete Zeile gelöscht wird, werden alle entsprechenden untergeordneten Zeilen auf NULL gesetzt oder gelöscht. In der Data Definition Language werden diese mit Phrasen wie „ON UPDATE CASCADE“, „ON DELETE CASCADE“ und „ON DELETE SET NULL“ angegeben, die Fremdschlüssel-Constraints entsprechen. Die Phrase nach „ON UPDATE“ oder „ON DELETE“ kann auch andere Phrasen zulassen, die für die verwendete Datenbank spezifisch sind. Die Objekte ForeignKey und ForeignKeyConstraint unterstützen die Generierung dieser Klausel über die Schlüsselwortargumente onupdate und ondelete. Der Wert ist ein beliebiger String, der nach der entsprechenden Phrase „ON UPDATE“ oder „ON DELETE“ ausgegeben wird.

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",
    ),
)

Beachten Sie, dass diese Klauseln InnoDB-Tabellen erfordern, wenn sie mit MySQL verwendet werden. Sie werden möglicherweise auch auf anderen Datenbanken nicht unterstützt.

Siehe auch

Hintergrundinformationen zur Integration von ON DELETE CASCADE mit ORM- relationship()-Konstrukten finden Sie in den folgenden Abschnitten.

Verwendung von foreign key ON DELETE cascade bei ORM-Beziehungen

Verwendung von foreign key ON DELETE bei Many-to-Many-Beziehungen

UNIQUE Constraint

Unique Constraints können anonym auf einer einzelnen Spalte über das Schlüsselwort unique auf Column erstellt werden. Explizit benannte Unique Constraints und/oder solche mit mehreren Spalten werden über das Tabellen-Level-Konstrukt UniqueConstraint erstellt.

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 Constraint

Check Constraints können benannt oder unbenannt sein und auf Spalten- oder Tabellenebene über das Konstrukt CheckConstraint erstellt werden. Der Text des Check Constraints wird direkt an die Datenbank weitergegeben, daher gibt es nur begrenztes „datenbankunabhängiges“ Verhalten. Spalten-Level-Check Constraints sollten sich im Allgemeinen nur auf die Spalte beziehen, auf der sie platziert sind, während Tabellen-Level-Constraints sich auf beliebige Spalten in der Tabelle beziehen können.

Beachten Sie, dass einige Datenbanken Check Constraints nicht aktiv unterstützen, wie z. B. ältere Versionen von MySQL (vor 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)
CREATE TABLE mytable ( col1 INTEGER CHECK (col1>5), col2 INTEGER, col3 INTEGER, CONSTRAINT check1 CHECK (col2 > col3 + 5) )

PRIMARY KEY Constraint

Der Primärschlüssel-Constraint jedes Table-Objekts ist implizit vorhanden, basierend auf den Column-Objekten, die mit dem Flag Column.primary_key markiert sind. Das Objekt PrimaryKeyConstraint bietet expliziten Zugriff auf diesen Constraint, einschließlich der Option, ihn direkt zu konfigurieren.

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"),
)

Siehe auch

PrimaryKeyConstraint - detaillierte API-Dokumentation.

Einrichten von Constraints bei Verwendung der Declarative ORM-Erweiterung

Die Table ist das SQLAlchemy Core-Konstrukt, das es ermöglicht, Tabellenmetadaten zu definieren, die unter anderem vom SQLAlchemy ORM als Ziel für die Abbildung einer Klasse verwendet werden können. Die Declarative-Erweiterung ermöglicht die automatische Erstellung des Table-Objekts, wobei der Inhalt der Tabelle hauptsächlich als Abbildung von Column-Objekten dient.

Um Tabellen-Level-Constraint-Objekte wie ForeignKeyConstraint auf eine mit Declarative definierte Tabelle anzuwenden, verwenden Sie das Attribut __table_args__, das unter Table Configuration beschrieben wird.

Konfigurieren von Constraint-Namenskonventionen

Relationale Datenbanken weisen allen Constraints und Indizes typischerweise explizite Namen zu. In dem gängigen Fall, dass eine Tabelle mit CREATE TABLE erstellt wird, bei der Constraints wie CHECK, UNIQUE und PRIMARY KEY Constraints inline mit der Tabellendefinition erzeugt werden, verfügt die Datenbank normalerweise über ein System, bei dem Namen automatisch diesen Constraints zugewiesen werden, wenn kein Name anderweitig angegeben ist. Wenn eine vorhandene Datenbanktabelle in einer Datenbank mit einem Befehl wie ALTER TABLE geändert wird, muss dieser Befehl typischerweise explizite Namen für neue Constraints angeben und auch in der Lage sein, den Namen eines vorhandenen Constraints anzugeben, der gelöscht oder geändert werden soll.

Constraints können explizit über den Parameter Constraint.name und für Indizes über den Parameter Index.name benannt werden. Im Fall von Constraints ist dieser Parameter jedoch optional. Es gibt auch die Anwendungsfälle, die Parameter Column.unique und Column.index zu verwenden, die UniqueConstraint- und Index-Objekte ohne explizite Namensangabe erstellen.

Der Anwendungsfall der Änderung vorhandener Tabellen und Constraints kann durch Schema-Migrationswerkzeuge wie Alembic gehandhabt werden. Weder Alembic noch SQLAlchemy erstellen jedoch derzeit Namen für Constraint-Objekte, bei denen der Name anderweitig nicht angegeben ist, was dazu führt, dass die Änderung vorhandener Constraints erfordert, dass man das Benennungssystem der relationalen Datenbank zur automatischen Namensvergabe umkehren muss oder dass Sorgfalt darauf gelegt werden muss, dass alle Constraints benannt sind.

Im Gegensatz zur expliziten Benennung aller Constraint- und Index-Objekte können automatisierte Benennungsschemata mithilfe von Events konstruiert werden. Dieser Ansatz hat den Vorteil, dass Constraints ein konsistentes Benennungsschema erhalten, ohne dass explizite Namensparameter im gesamten Code erforderlich sind, und dass die Konvention genauso gut für die durch die Parameter Column.unique und Column.index erzeugten Constraints und Indizes gilt. Seit SQLAlchemy 0.9.2 ist dieser ereignisbasierte Ansatz enthalten und kann mit dem Argument MetaData.naming_convention konfiguriert werden.

Konfigurieren einer Namenskonvention für eine MetaData-Sammlung

MetaData.naming_convention bezieht sich auf ein Wörterbuch, das die Klasse Index oder einzelne Klassen Constraint als Schlüssel und Python-String-Vorlagen als Werte akzeptiert. Es akzeptiert auch eine Reihe von String-Codes als alternative Schlüssel: "fk", "pk", "ix", "ck" und "uq" für Fremdschlüssel, Primärschlüssel, Index, Check und Unique Constraints. Die String-Vorlagen in diesem Wörterbuch werden verwendet, wann immer ein Constraint oder Index mit diesem MetaData-Objekt verknüpft wird, das keinen bestehenden Namen hat (einschließlich eines Ausnahmefalls, in dem ein bestehender Name weiter verschönert werden kann).

Ein Beispiel für eine Namenskonvention, die grundlegende Fälle abdeckt, ist wie folgt:

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)

Die obige Konvention legt Namen für alle Constraints innerhalb der Ziel- MetaData-Sammlung fest. Wir können beispielsweise den Namen beobachten, der erzeugt wird, wenn wir einen unbenannten UniqueConstraint erstellen.

>>> 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'

Dieselbe Funktion greift, auch wenn wir nur das Flag Column.unique verwenden.

>>> 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'

Ein wesentlicher Vorteil des Namenskonventionsansatzes ist, dass die Namen zur Python-Konstruktionszeit und nicht zur DDL-Emissionszeit festgelegt werden. Dies hat zur Folge, dass bei Verwendung der --autogenerate-Funktion von Alembic die Namenskonvention bei der Generierung eines neuen Migrationsskripts explizit wird.

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

Der obige String "uq_user_name" wurde aus dem UniqueConstraint-Objekt kopiert, das --autogenerate in unseren Metadaten gefunden hat.

Die verfügbaren Tokens umfassen %(table_name)s, %(referred_table_name)s, %(column_0_name)s, %(column_0_label)s, %(column_0_key)s, %(referred_column_0_name)s und %(constraint_name)s, sowie Mehrfachspaltenversionen davon, einschließlich %(column_0N_name)s, %(column_0_N_name)s, %(referred_column_0_N_name)s, die alle Spaltennamen mit oder ohne Unterstrich getrennt rendern. Die Dokumentation für MetaData.naming_convention enthält weitere Details zu jedem dieser Konventionen.

Die Standard-Namenskonvention

Der Standardwert für MetaData.naming_convention behandelt das langjährige SQLAlchemy-Verhalten, einem Index-Objekt, das mit dem Parameter Column.index erstellt wird, einen Namen zuzuweisen.

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

Abschneiden langer Namen

Wenn ein generierter Name, insbesondere jene, die Mehrfachspalten-Tokens verwenden, zu lang für die Kennungslängenbeschränkung der Ziel-Datenbank ist (z. B. hat PostgreSQL eine Beschränkung von 63 Zeichen), wird der Name deterministisch mit einem 4-Zeichen-Suffix, das auf einem MD5-Hash des langen Namens basiert, abgeschnitten. Zum Beispiel wird die folgende Namenskonvention bei den verwendeten Spaltennamen sehr lange Namen generieren.

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"),
)

Auf dem PostgreSQL-Dialekt werden Namen, die länger als 63 Zeichen sind, wie im folgenden Beispiel abgeschnitten.

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)
)

Das obige Suffix a79e basiert auf dem MD5-Hash des langen Namens und generiert jedes Mal denselben Wert, um konsistente Namen für ein gegebenes Schema zu erzeugen.

Erstellen benutzerdefinierter Tokens für Namenskonventionen

Neue Tokens können auch hinzugefügt werden, indem ein zusätzliches Token und eine aufrufbare Funktion im `naming_convention`-Wörterbuch angegeben werden. Wenn wir beispielsweise unsere Fremdschlüssel-Constraints mit einem GUID-Schema benennen möchten, könnten wir dies wie folgt tun.

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",
}

Oben, wenn wir eine neue ForeignKeyConstraint erstellen, erhalten wir einen Namen wie folgt:

>>> 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

Siehe auch

MetaData.naming_convention - für zusätzliche Nutzungshinweise sowie eine Auflistung aller verfügbaren Namenskomponenten.

The Importance of Naming Constraints - in der Alembic-Dokumentation.

Neu in Version 1.3.0: Mehrspalten-Namens-Tokens wie %(column_0_N_name)s hinzugefügt. Generierte Namen, die das Zeichenlimit für die Ziel-Datenbank überschreiten, werden deterministisch abgeschnitten.

Benennung von CHECK Constraints

Das CheckConstraint-Objekt wird gegen einen beliebigen SQL-Ausdruck konfiguriert, der beliebig viele Spalten enthalten kann, und wird zusätzlich oft mit einer rohen SQL-Zeichenkette konfiguriert. Daher ist eine gängige Konvention für die Verwendung mit CheckConstraint eine, bei der wir erwarten, dass das Objekt bereits einen Namen hat, und wir erweitern es dann mit anderen Konventionselementen. Eine typische Konvention ist "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"),
)

Die obige Tabelle erzeugt den Namen ck_foo_value_gt_5

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

CheckConstraint unterstützt auch das Token %(columns_0_name)s; wir können dies nutzen, indem wir sicherstellen, dass wir ein Column- oder column()-Element innerhalb des Ausdrucks der Einschränkung verwenden, entweder indem wir die Einschränkung separat von der Tabelle deklarieren

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)

oder indem wir ein column() inline verwenden

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)
)

Beides erzeugt den Namen ck_foo_value

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

Die Bestimmung des Namens der "Spalte Null" erfolgt durch Scannen des gegebenen Ausdrucks nach Spaltenobjekten. Wenn der Ausdruck mehr als eine Spalte enthält, verwendet der Scan eine deterministische Suche, jedoch bestimmt die Struktur des Ausdrucks, welche Spalte als "Spalte Null" vermerkt wird.

Konfiguration der Benennung für Boolesche, Enum- und andere Schematypen

Die Klasse SchemaType bezieht sich auf Typobjekte wie Boolean und Enum, die eine CHECK-Einschränkung generieren, die mit dem Typ einhergeht. Der Name für die Einschränkung wird hier am direktesten durch Senden des Parameters "name" gesetzt, z. B. Boolean.name

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

Das Feature für die Benennungskonvention kann auch mit diesen Typen kombiniert werden, normalerweise durch die Verwendung einer Konvention, die %(constraint_name)s enthält, und dann durch die Zuweisung eines Namens zum Typ

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

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

Die obige Tabelle erzeugt den Einschränkungsnamen ck_foo_flag_bool

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

Die SchemaType-Klassen verwenden spezielle interne Symbole, sodass die Benennungskonvention erst zur DDL-Kompilierungszeit bestimmt wird. Unter PostgreSQL gibt es einen nativen BOOLEAN-Typ, daher ist die CHECK-Einschränkung von Boolean nicht erforderlich; wir können einen Boolean-Typ ohne Namen einrichten, auch wenn eine Benennungskonvention für Check-Constraints vorhanden ist. Diese Konvention wird nur für die CHECK-Einschränkung konsultiert, wenn wir gegen eine Datenbank ohne nativen BOOLEAN-Typ wie SQLite oder MySQL laufen.

Die CHECK-Einschränkung kann auch das Token column_0_name nutzen, was gut mit SchemaType funktioniert, da diese Einschränkungen nur eine Spalte haben

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

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

Das obige Schema erzeugt

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

Verwendung von Benennungskonventionen mit ORM Declarative Mixins

Bei der Verwendung des Benennungskonventions-Features mit ORM Declarative Mixins müssen für jede tatsächliche Tabellen-abgebildete Unterklasse individuelle Einschränkungsobjekte vorhanden sein. Siehe den Abschnitt Erstellen von Indizes und Einschränkungen mit Benennungskonventionen auf Mixins für Hintergrundinformationen und Beispiele.

Constraints API

Objektname Beschreibung

CheckConstraint

Eine Tabellen- oder spaltenbezogene CHECK-Einschränkung.

ColumnCollectionConstraint

Eine Einschränkung, die eine ColumnCollection proxy-mäßig nutzt.

ColumnCollectionMixin

Eine ColumnCollection von Column-Objekten.

Constraint

Eine SQL-Einschränkung auf Tabellenebene.

conv

Markiert eine Zeichenkette, die angibt, dass ein Name bereits durch eine Benennungskonvention konvertiert wurde.

ForeignKey

Definiert eine Abhängigkeit zwischen zwei Spalten.

ForeignKeyConstraint

Eine FOREIGN KEY-Einschränkung auf Tabellenebene.

HasConditionalDDL

Definieren Sie eine Klasse, die die Methode HasConditionalDDL.ddl_if() enthält, was eine bedingte Wiedergabe von DDL ermöglicht.

PrimaryKeyConstraint

Eine PRIMARY KEY-Einschränkung auf Tabellenebene.

UniqueConstraint

Eine UNIQUE-Einschränkung auf Tabellenebene.

class sqlalchemy.schema.Constraint

Eine SQL-Einschränkung auf Tabellenebene.

Constraint dient als Basisklasse für die Reihe von Einschränkungsobjekten, die mit Table-Objekten verknüpft werden können, einschließlich PrimaryKeyConstraint, ForeignKeyConstraint UniqueConstraint und CheckConstraint.

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

Erstellt eine SQL-Einschränkung.

Parameter:
  • name – Optional, der In-Database-Name dieser Constraint.

  • deferrable – Optionaler Boolescher Wert. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE beim Ausgeben von DDL für diese Einschränkung emittiert.

  • initially – Optionaler String. Wenn gesetzt, wird INITIALLY <wert> beim Ausgeben von DDL für diese Einschränkung emittiert.

  • info – Optionales Datenwörterbuch, das in das Attribut SchemaItem.info dieses Objekts populert wird.

  • comment

    Optionaler String, der beim Erstellen von Fremdschlüsseleinschränkungen einen SQL-Kommentar rendert.

    Neu in Version 2.0.

  • **dialect_kw – Zusätzliche Schlüsselwortargumente sind dialektspezifisch und werden in der Form <dialectname>_<argname> übergeben. Siehe die Dokumentation zu einem einzelnen Dialekt unter Dialekte für Details zu dokumentierten Argumenten.

  • _create_rule – wird intern von einigen Datentypen verwendet, die auch Einschränkungen erstellen.

  • _type_bound – wird intern verwendet, um anzuzeigen, dass diese Einschränkung mit einem bestimmten Datentyp verbunden ist.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss auch eine vorhandene Sammlung DefaultDialect.construct_arguments enthalten, die angibt, dass er am Validierungs- und Standard-System für Schlüsselwortargumente teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, können bereits beliebige Schlüsselwortargumente im Namen dieses Dialekts angegeben werden. Alle in SQLAlchemy verpackten Dialekte enthalten diese Sammlung, jedoch kann die Unterstützung für Drittanbieter-Dialekte variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

Seit Version 1.4 veraltet: Die Methode Constraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

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

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Zeichenkettenname eines Dialekts oder ein Tupel von Zeichenkettennamen zur Angabe mehrerer Dialekttypen.

  • callable_ – ein aufrufbares Objekt, das in derselben Form konstruiert wird wie in ExecutableDDLElement.execute_if.callable_ beschrieben.

  • state – ein beliebiges Objekt, das an das aufrufbare Objekt übergeben wird, falls vorhanden.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribute sqlalchemy.schema.Constraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.Constraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

attribute sqlalchemy.schema.Constraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.Constraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.ColumnCollectionMixin

Eine ColumnCollection von Column-Objekten.

Diese Sammlung repräsentiert die Spalten, auf die sich dieses Objekt bezieht.

class sqlalchemy.schema.ColumnCollectionConstraint

Eine Einschränkung, die eine ColumnCollection proxy-mäßig nutzt.

method sqlalchemy.schema.ColumnCollectionConstraint.__init__(*columns: _DDLColumnArgument, name: _ConstraintNameArgument = None, deferrable: bool | None = None, initially: str | None = None, info: _InfoType | None = None, _autoattach: bool = True, _column_flag: bool = False, _gather_expressions: List[_DDLColumnArgument] | None = None, **dialect_kw: Any) None
Parameter:
  • *columns – Eine Sequenz von Spaltennamen oder Spaltenobjekten.

  • name – Optional, der In-Database-Name dieser Einschränkung.

  • deferrable – Optionaler Boolescher Wert. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE beim Ausgeben von DDL für diese Einschränkung emittiert.

  • initially – Optionaler String. Wenn gesetzt, wird INITIALLY <value> ausgegeben, wenn DDL für diese Einschränkung erstellt wird.

  • **dialect_kw – andere Schlüsselwortargumente, einschließlich dialektspezifischer Argumente, werden an die Constraint-Superklasse weitergeleitet.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss außerdem eine vorhandene DefaultDialect.construct_arguments-Sammlung enthalten, die angibt, dass er am Validierungs- und Standard-System für Schlüsselwortargumente teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, kann jedes Schlüsselwortargument bereits für diesen Dialekt angegeben werden. Alle in SQLAlchemy enthaltenen Dialekte enthalten diese Sammlung, bei Dialekten von Drittanbietern kann die Unterstützung variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

geerbt vom ColumnCollectionMixin.columns Attribut von ColumnCollectionMixin

Eine ColumnCollection, die die Menge der Spalten für diese Einschränkung darstellt.

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

Gibt True zurück, wenn diese Einschränkung die gegebene Spalte enthält.

Beachten Sie, dass dieses Objekt auch ein Attribut .columns enthält, das eine ColumnCollection von Column-Objekten ist.

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

Veraltet seit Version 1.4: Die Methode ColumnCollectionConstraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

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

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Stringname eines Dialekts oder ein Tupel von Stringnamen zur Angabe mehrerer Dialekttypen.

  • callable_ – ein aufrufbares Objekt, das in derselben Form erstellt wird, wie in ExecutableDDLElement.execute_if.callable_ beschrieben.

  • state – beliebiges Objekt, das bei Vorhandensein an die aufrufbare Funktion übergeben wird.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribute sqlalchemy.schema.ColumnCollectionConstraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.ColumnCollectionConstraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

attribute sqlalchemy.schema.ColumnCollectionConstraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.ColumnCollectionConstraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.CheckConstraint

Eine Tabellen- oder spaltenbezogene CHECK-Einschränkung.

Kann in der Definition einer Tabelle oder Spalte enthalten sein.

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

Erstellt eine CHECK-Einschränkung.

Parameter:
  • sqltext

    Ein String, der die Einschränkungsdefinition enthält und unverändert verwendet wird, oder ein SQL-Ausdruckskonstrukt. Wenn als String angegeben, wird das Objekt in ein text()-Objekt konvertiert. Wenn der Textstring ein Doppelpunktzeichen enthält, maskieren Sie es mit einem Backslash.

    CheckConstraint(r"foo ~ E'a(?\:b|c)d")

    Warnung

    Das Argument CheckConstraint.sqltext für CheckConstraint kann als Python-String-Argument übergeben werden, das als **vertrauenswürdiger SQL-Text** behandelt und unverändert gerendert wird. **Geben Sie KEINE nicht vertrauenswürdigen Eingaben an diesen Parameter weiter**.

  • name – Optional, der In-Datenbank-Name der Einschränkung.

  • deferrable – Optional boolesch. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE ausgegeben, wenn DDL für diese Einschränkung erstellt wird.

  • initially – Optionaler String. Wenn gesetzt, wird INITIALLY <value> ausgegeben, wenn DDL für diese Einschränkung erstellt wird.

  • info – Optionale Datenwörterbuch, das in das SchemaItem.info-Attribut dieses Objekts eingetragen wird.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss außerdem eine vorhandene DefaultDialect.construct_arguments-Sammlung enthalten, die angibt, dass er am Validierungs- und Standard-System für Schlüsselwortargumente teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, kann jedes Schlüsselwortargument bereits für diesen Dialekt angegeben werden. Alle in SQLAlchemy enthaltenen Dialekte enthalten diese Sammlung, bei Dialekten von Drittanbietern kann die Unterstützung variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

geerbt vom ColumnCollectionMixin.columns Attribut von ColumnCollectionMixin

Eine ColumnCollection, die die Menge der Spalten für diese Einschränkung darstellt.

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

Gibt True zurück, wenn diese Einschränkung die gegebene Spalte enthält.

Beachten Sie, dass dieses Objekt auch ein Attribut .columns enthält, das eine ColumnCollection von Column-Objekten ist.

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

Veraltet seit Version 1.4: Die Methode CheckConstraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

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

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Stringname eines Dialekts oder ein Tupel von Stringnamen zur Angabe mehrerer Dialekttypen.

  • callable_ – ein aufrufbares Objekt, das in derselben Form erstellt wird, wie in ExecutableDDLElement.execute_if.callable_ beschrieben.

  • state – beliebiges Objekt, das bei Vorhandensein an die aufrufbare Funktion übergeben wird.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribute sqlalchemy.schema.CheckConstraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.CheckConstraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

attribute sqlalchemy.schema.CheckConstraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.CheckConstraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.ForeignKey

Definiert eine Abhängigkeit zwischen zwei Spalten.

ForeignKey wird als Argument für ein Column-Objekt angegeben, z. B.

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

Beachten Sie, dass ForeignKey nur ein Markierungsobjekt ist, das eine Abhängigkeit zwischen zwei Spalten definiert. Die eigentliche Einschränkung wird in allen Fällen durch das Objekt ForeignKeyConstraint dargestellt. Dieses Objekt wird automatisch generiert, wenn ein ForeignKey mit einer Column verbunden ist, die wiederum mit einer Table verbunden ist. Umgekehrt, wenn ForeignKeyConstraint auf eine Table angewendet wird, werden automatisch ForeignKey-Markierungen generiert, die auf jeder zugehörigen Column vorhanden sind und die ebenfalls mit dem Constraint-Objekt verbunden sind.

Beachten Sie, dass Sie mit ForeignKey-Objekten keine „zusammengesetzte“ Fremdschlüsselbeschränkung definieren können, d. h. eine Beschränkung zwischen einer Gruppierung mehrerer Eltern-/Kindspalten. Um diese Gruppierung zu definieren, muss das Objekt ForeignKeyConstraint verwendet und auf die Table angewendet werden. Die zugehörigen ForeignKey-Objekte werden automatisch erstellt.

Die ForeignKey-Objekte, die einem einzelnen Column-Objekt zugeordnet sind, sind in der foreign_keys-Sammlung dieser Spalte verfügbar.

Weitere Beispiele für die Konfiguration von Fremdschlüsseln finden Sie unter Definition von Fremdschlüsseln.

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

Konstruiert einen spaltenbezogenen FOREIGN KEY.

Das Objekt ForeignKey generiert bei der Konstruktion ein ForeignKeyConstraint, das mit der Sammlung von Constraints des übergeordneten Table-Objekts verbunden ist.

Parameter:
  • column – Eine einzelne Zielspalte für die Schlüsselbeziehung. Ein Column-Objekt oder ein Spaltenname als String: tabellenname.spaltenschlüssel oder schema.tabellenname.spaltenschlüssel. spaltenschlüssel ist der key, der der Spalte zugewiesen wurde (standardmäßig der Spaltenname selbst), es sei denn, link_to_name ist True, in welchem Fall der gerenderte Name der Spalte verwendet wird.

  • name – Optionaler String. Ein Name für den Schlüssel in der Datenbank, wenn constraint nicht angegeben ist.

  • onupdate – Optionaler String. Wenn gesetzt, wird ON UPDATE <value> beim Ausgeben von DDL für diese Einschränkung emittiert. Typische Werte sind CASCADE, DELETE und RESTRICT.

  • ondelete – Optionaler String. Wenn gesetzt, wird ON DELETE <value> beim Ausgeben von DDL für diese Einschränkung emittiert. Typische Werte sind CASCADE, SET NULL und RESTRICT.

  • deferrable – Optionaler Boolescher Wert. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE beim Ausgeben von DDL für diese Einschränkung emittiert.

  • initially – Optionaler String. Wenn gesetzt, wird INITIALLY <value> beim Ausgeben von DDL für diese Einschränkung emittiert.

  • link_to_name – Wenn True, ist der String-Name, der in column angegeben ist, der gerenderte Name der referenzierten Spalte und nicht ihr lokal zugewiesener key.

  • use_alter

    Wird an die zugrundeliegende ForeignKeyConstraint übergeben, um anzuzeigen, dass die Einschränkung extern vom CREATE TABLE/DROP TABLE-Statement generiert/gelöscht werden soll. Siehe ForeignKeyConstraint.use_alter für weitere Details.

  • match – Optionaler String. Wenn gesetzt, wird MATCH <value> beim Ausgeben von DDL für diese Einschränkung emittiert. Typische Werte sind SIMPLE, PARTIAL und FULL.

  • info – Optionales Datenwörterbuch, das in das Attribut SchemaItem.info dieses Objekts eingetragen wird.

  • comment

    Optionaler String, der beim Erstellen von Fremdschlüsseleinschränkungen einen SQL-Kommentar rendert.

    Neu in Version 2.0.

  • **dialect_kw – Zusätzliche Schlüsselwortargumente sind dialektspezifisch und werden in der Form <dialektname>_<argname> übergeben. Die Argumente werden letztendlich von einer entsprechenden ForeignKeyConstraint verarbeitet. Die Dokumentation zu einem einzelnen Dialekt unter Dialekte enthält Details zu dokumentierten Argumenten.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss auch eine vorhandene DefaultDialect.construct_arguments-Sammlung enthalten, die angibt, dass er am Schlüsselwortargument-Validierungs- und Standard-System teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, können bereits beliebige Schlüsselwortargumente für diesen Dialekt angegeben werden. Alle innerhalb von SQLAlchemy verpackten Dialekte enthalten diese Sammlung, für Dialekte von Drittanbietern kann die Unterstützung jedoch variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

attribute sqlalchemy.schema.ForeignKey.column

Gibt die Ziel-Column zurück, auf die dieser ForeignKey verweist.

Wenn keine Zielspalte festgelegt wurde, wird eine Ausnahme ausgelöst.

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

Veraltet seit Version 1.4: Die Methode ForeignKey.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

attribute sqlalchemy.schema.ForeignKey.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.ForeignKey.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

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

Gibt die Column in der angegebenen Table (oder einer beliebigen FromClause) zurück, auf die dieser ForeignKey verweist.

Gibt None zurück, wenn dieser ForeignKey nicht auf die angegebene Table verweist.

attribute sqlalchemy.schema.ForeignKey.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.ForeignKey.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

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

Gibt True zurück, wenn die angegebene Table von diesem ForeignKey referenziert wird.

attribute sqlalchemy.schema.ForeignKey.target_fullname

Gibt einen String basierend auf der „Spaltenspezifikation“ für diesen ForeignKey zurück.

Dies ist normalerweise das Äquivalent des String-basierten Arguments „tabellenname.spaltenname“, das zuerst dem Konstruktor des Objekts übergeben wurde.

class sqlalchemy.schema.ForeignKeyConstraint

Eine FOREIGN KEY-Einschränkung auf Tabellenebene.

Definiert eine einzelne Spalte oder eine zusammengesetzte FOREIGN KEY … REFERENCES-Beschränkung. Für einen einfachen Fremdschlüssel mit einer einzelnen Spalte ist das Hinzufügen eines ForeignKey zur Definition einer Column eine Kurzform für eine unbenannte, einzelne Spalte ForeignKeyConstraint.

Beispiele für die Konfiguration von Fremdschlüsseln finden Sie unter Definition von Fremdschlüsseln.

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

Konstruiert einen zusammengesetzten Fremdschlüssel.

Parameter:
  • columns – Eine Sequenz von lokalen Spaltennamen. Die benannten Spalten müssen definiert und in der übergeordneten Tabelle vorhanden sein. Die Namen sollten mit dem key übereinstimmen, der jeder Spalte zugewiesen wurde (standardmäßig der Name), es sei denn, link_to_name ist True.

  • refcolumns – Eine Sequenz von fremden Spaltennamen oder Spaltenobjekten. Die Spalten müssen alle in derselben Tabelle liegen.

  • name – Optional, der Name des Schlüssels in der Datenbank.

  • onupdate – Optionaler String. Wenn gesetzt, wird ON UPDATE <value> beim Ausgeben von DDL für diese Einschränkung emittiert. Typische Werte sind CASCADE, DELETE und RESTRICT.

  • ondelete – Optionaler String. Wenn gesetzt, wird ON DELETE <value> beim Ausgeben von DDL für diese Einschränkung emittiert. Typische Werte sind CASCADE, SET NULL und RESTRICT.

  • deferrable – Optionaler Boolescher Wert. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE beim Ausgeben von DDL für diese Einschränkung emittiert.

  • initially – Optionaler String. Wenn gesetzt, wird INITIALLY <value> beim Ausgeben von DDL für diese Einschränkung emittiert.

  • link_to_name – Wenn True, ist der String-Name, der in column angegeben ist, der gerenderte Name der referenzierten Spalte und nicht ihr lokal zugewiesener key.

  • use_alter

    Wenn True, wird die DDL für diese Einschränkung nicht als Teil der CREATE TABLE-Definition ausgegeben. Stattdessen wird sie über eine ALTER TABLE-Anweisung generiert, die nach der Erstellung der gesamten Tabellensammlung ausgegeben wird, und sie wird über eine ALTER TABLE-Anweisung gelöscht, bevor die gesamte Tabellensammlung gelöscht wird.

    Die Verwendung von ForeignKeyConstraint.use_alter ist besonders für den Fall gedacht, dass zwei oder mehr Tabellen in einer gegenseitig abhängigen Fremdschlüsselbeziehung stehen; die Methoden MetaData.create_all() und MetaData.drop_all() werden diese Auflösung automatisch durchführen, sodass das Flag normalerweise nicht benötigt wird.

  • match – Optional string. Wenn gesetzt, wird MATCH <value> beim Ausgeben von DDL für diese Einschränkung verwendet. Typische Werte sind SIMPLE, PARTIAL und FULL.

  • info – Optionales Datenwörterbuch, das in das Attribut SchemaItem.info dieses Objekts populatiert wird.

  • comment

    Optionaler String, der beim Erstellen von Fremdschlüsseleinschränkungen einen SQL-Kommentar rendert.

    Neu in Version 2.0.

  • **dialect_kw – Zusätzliche Schlüsselwortargumente sind dialektspezifisch und werden in der Form <dialectname>_<argname> übergeben. Weitere Informationen zu dokumentierten Argumenten finden Sie in der Dokumentation zu den einzelnen Dialekten unter Dialekte.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss außerdem eine vorhandene construct_arguments-Sammlung des DefaultDialect.construct_arguments enthalten, die angibt, dass er am Validierungs- und Standardsystem für Schlüsselwortargumente teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, kann jedes Schlüsselwortargument bereits im Namen dieses Dialekts angegeben werden. Alle innerhalb von SQLAlchemy verpackten Dialekte enthalten diese Sammlung, bei Dialekten von Drittanbietern kann die Unterstützung jedoch variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

attribute sqlalchemy.schema.ForeignKeyConstraint.column_keys

Gibt eine Liste von Zeichenkettenschlüsseln zurück, die die lokalen Spalten in dieser ForeignKeyConstraint darstellen.

Diese Liste sind entweder die ursprünglichen Zeichenkettenargumente, die an den Konstruktor der ForeignKeyConstraint übergeben wurden, oder, wenn die Einschränkung mit Column-Objekten initialisiert wurde, die Zeichenkette .key jedes Elements.

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

geerbt vom ColumnCollectionMixin.columns Attribut von ColumnCollectionMixin

Eine ColumnCollection, die die Menge der Spalten für diese Einschränkung darstellt.

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

Gibt True zurück, wenn diese Einschränkung die gegebene Spalte enthält.

Beachten Sie, dass dieses Objekt auch ein Attribut .columns enthält, das eine ColumnCollection von Column-Objekten ist.

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

Veraltet seit Version 1.4: Die Methode ForeignKeyConstraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

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

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Zeichenkettenname eines Dialekts oder ein Tupel von Zeichenkettennamen zur Angabe mehrerer Dialekttypen.

  • callable_ – Ein aufrufbares Objekt, das in der gleichen Form wie in ExecutableDDLElement.execute_if.callable_ beschrieben wird.

  • state – beliebiges Objekt, das bei Anwesenheit an das aufrufbare Objekt übergeben wird.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribute sqlalchemy.schema.ForeignKeyConstraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.ForeignKeyConstraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

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

Eine Sequenz von ForeignKey-Objekten.

Jeder ForeignKey repräsentiert ein einzelnes Bezugsspalte/bezogene Spalte-Paar.

Diese Sammlung ist schreibgeschützt.

attribute sqlalchemy.schema.ForeignKeyConstraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.ForeignKeyConstraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

attribute sqlalchemy.schema.ForeignKeyConstraint.referred_table

Das Table-Objekt, auf das sich diese ForeignKeyConstraint bezieht.

Dies ist ein dynamisch berechnetes Attribut, das möglicherweise nicht verfügbar ist, wenn die Einschränkung und/oder die übergeordnete Tabelle noch nicht mit einer Metadatensammlung verknüpft ist, die die bezogene Tabelle enthält.

class sqlalchemy.schema.HasConditionalDDL

Definieren Sie eine Klasse, die die Methode HasConditionalDDL.ddl_if() enthält, was eine bedingte Wiedergabe von DDL ermöglicht.

Gilt derzeit für Einschränkungen und Indizes.

Mitglieder

ddl_if()

Neu in Version 2.0.

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

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Zeichenkettenname eines Dialekts oder ein Tupel von Zeichenkettennamen zur Angabe mehrerer Dialekttypen.

  • callable_ – Ein aufrufbares Objekt, das in der gleichen Form wie in ExecutableDDLElement.execute_if.callable_ beschrieben wird.

  • state – beliebiges Objekt, das bei Anwesenheit an das aufrufbare Objekt übergeben wird.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

class sqlalchemy.schema.PrimaryKeyConstraint

Eine PRIMARY KEY-Einschränkung auf Tabellenebene.

Das PrimaryKeyConstraint-Objekt ist automatisch auf jedem Table-Objekt vorhanden; es wird eine Menge von Column-Objekten zugewiesen, die denen entsprechen, die mit dem Flag Column.primary_key gekennzeichnet sind.

>>> 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)
)

Der Primärschlüssel einer Table kann auch durch explizite Verwendung eines PrimaryKeyConstraint-Objekts angegeben werden; in diesem Verwendungsmodus kann auch der „Name“ der Einschränkung angegeben werden, sowie andere Optionen, die von Dialekten erkannt werden können.

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

Die beiden Stile der Spaltenspezifikation sollten im Allgemeinen nicht gemischt werden. Eine Warnung wird ausgegeben, wenn die Spalten in der PrimaryKeyConstraint nicht mit den Spalten übereinstimmen, die als primary_key=True gekennzeichnet waren, wenn beide vorhanden sind; in diesem Fall werden die Spalten strikt aus der PrimaryKeyConstraint-Deklaration übernommen, und die Spalten, die anderweitig als primary_key=True gekennzeichnet waren, werden ignoriert. Dieses Verhalten ist rückwärtskompatibel mit dem vorherigen Verhalten.

Für den Anwendungsfall, dass bestimmte Optionen für die PrimaryKeyConstraint angegeben werden sollen, aber der übliche Stil der Verwendung von primary_key=True-Flags weiterhin erwünscht ist, kann eine leere PrimaryKeyConstraint angegeben werden, die die Primärschlüsselspaltenmenge aus der Table basierend auf den Flags übernimmt.

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)

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird ein NoSuchModuleError ausgelöst. Der Dialekt muss auch eine vorhandene construct_arguments-Sammlung des DefaultDialect.construct_arguments enthalten, die angibt, dass er am Validierungs- und Standardsystem für Schlüsselwortargumente teilnimmt, andernfalls wird ein ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, kann jedes Schlüsselwortargument bereits im Namen dieses Dialekts angegeben werden. Alle innerhalb von SQLAlchemy verpackten Dialekte enthalten diese Sammlung, bei Dialekten von Drittanbietern kann die Unterstützung jedoch variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

geerbt vom ColumnCollectionMixin.columns Attribut von ColumnCollectionMixin

Eine ColumnCollection, die die Menge der Spalten für diese Einschränkung darstellt.

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

Gibt True zurück, wenn diese Einschränkung die gegebene Spalte enthält.

Beachten Sie, dass dieses Objekt auch ein Attribut .columns enthält, das eine ColumnCollection von Column-Objekten ist.

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

Veraltet seit Version 1.4: Die Methode ColumnCollectionConstraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

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

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Zeichenkettenname eines Dialekts oder ein Tupel von Zeichenkettennamen zur Angabe mehrerer Dialekttypen.

  • callable_ – Ein aufrufbares Objekt, das in der gleichen Form wie in ExecutableDDLElement.execute_if.callable_ beschrieben wird.

  • state – beliebiges Objekt, das bei Anwesenheit an das aufrufbare Objekt übergeben wird.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribute sqlalchemy.schema.PrimaryKeyConstraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribute sqlalchemy.schema.PrimaryKeyConstraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

attribute sqlalchemy.schema.PrimaryKeyConstraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribute sqlalchemy.schema.PrimaryKeyConstraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

class sqlalchemy.schema.UniqueConstraint

Eine UNIQUE-Einschränkung auf Tabellenebene.

Definiert eine einzelne Spalte oder eine zusammengesetzte UNIQUE-Einschränkung. Für eine unkomplizierte, einzelne Spalten-Einschränkung ist das Hinzufügen von unique=True zur Column-Definition eine Kurzform, die einer unbenannten, einzelnen Spalten-UniqueConstraint entspricht.

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

geerbt von der sqlalchemy.schema.ColumnCollectionConstraint.__init__ Methode von ColumnCollectionConstraint

Parameter:
  • *columns – Eine Sequenz von Spaltennamen oder Column-Objekten.

  • name – Optional, der In-Database-Name dieser Einschränkung.

  • deferrable – Optional Bool. Wenn gesetzt, wird DEFERRABLE oder NOT DEFERRABLE beim Ausgeben von DDL für diese Einschränkung ausgegeben.

  • initially – Optional String. Wenn gesetzt, wird INITIALLY <value> beim Ausgeben von DDL für diese Einschränkung ausgegeben.

  • **dialect_kw – andere Schlüsselwortargumente, einschließlich dialektspezifischer Argumente, werden an die Constraint Oberklasse weitergegeben.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird eine NoSuchModuleError ausgelöst. Der Dialekt muss auch eine vorhandene DefaultDialect.construct_arguments Sammlung enthalten, die angibt, dass er am Validierungs- und Standard-System für Schlüsselwortargumente teilnimmt, andernfalls wird ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, dann kann jedes Schlüsselwortargument bereits für diesen Dialekt angegeben werden. Alle in SQLAlchemy enthaltenen Dialekte enthalten diese Sammlung, jedoch kann die Unterstützung für Drittanbieter-Dialekte variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

geerbt vom ColumnCollectionMixin.columns Attribut von ColumnCollectionMixin

Eine ColumnCollection, die die Menge der Spalten für diese Einschränkung darstellt.

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

Gibt True zurück, wenn diese Einschränkung die gegebene Spalte enthält.

Beachten Sie, dass dieses Objekt auch ein Attribut .columns enthält, das eine ColumnCollection von Column-Objekten ist.

methode sqlalchemy.schema.UniqueConstraint.copy(*, target_table: Table | None = None, **kw: Any) ColumnCollectionConstraint

Veraltet seit Version 1.4: Die Methode ColumnCollectionConstraint.copy() ist veraltet und wird in einer zukünftigen Version entfernt.

methode sqlalchemy.schema.UniqueConstraint.ddl_if(dialect: str | None = None, callable_: DDLIfCallable | None = None, state: Any | None = None) Self

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – Name eines Dialekts als String oder ein Tupel von String-Namen zur Angabe mehrerer Dialekttypen.

  • callable_ – Ein Callable, das in derselben Form erstellt wird, wie unter ExecutableDDLElement.execute_if.callable_ beschrieben.

  • state – Ein beliebiges Objekt, das an das Callable übergeben wird, falls vorhanden.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

attribut sqlalchemy.schema.UniqueConstraint.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

attribut sqlalchemy.schema.UniqueConstraint.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

attribut sqlalchemy.schema.UniqueConstraint.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

attribut sqlalchemy.schema.UniqueConstraint.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.

funktion sqlalchemy.schema.conv(value: str, quote: bool | None = None) Any

Markiert eine Zeichenkette, die angibt, dass ein Name bereits durch eine Benennungskonvention konvertiert wurde.

Dies ist eine String-Unterklasse, die einen Namen angibt, der keiner weiteren Namenskonventionen unterliegen soll.

Zum Beispiel, wenn wir eine Constraint mit einer Namenskonvention wie folgt erstellen:

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

Der Name der obigen Einschränkung wird als "ck_t_x5" gerendert. Das heißt, der vorhandene Name x5 wird in der Namenskonvention als constraint_name Token verwendet.

In einigen Fällen, z. B. in Migrationsskripten, rendern wir möglicherweise die obige CheckConstraint mit einem Namen, der bereits konvertiert wurde. Um sicherzustellen, dass der Name nicht doppelt modifiziert wird, wird der neue Name mithilfe des conv() Markers angewendet. Wir können dies explizit wie folgt verwenden:

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")),
)

Oben zeigt der conv() Marker an, dass der Einschränkungsname hier endgültig ist, und der Name wird als "ck_t_x5" und nicht als "ck_t_ck_t_x5" gerendert.

Indizes

Indizes können anonym erstellt werden (mit einem automatisch generierten Namen ix_<column label>) für eine einzelne Spalte unter Verwendung des Inline-Schlüsselworts index auf Column, was auch die Verwendung von unique modifiziert, um die Einzigartigkeit auf den Index selbst anzuwenden, anstatt eine separate UNIQUE-Einschränkung hinzuzufügen. Für Indizes mit spezifischen Namen oder die mehr als eine Spalte umfassen, verwenden Sie das Konstrukt Index, das einen Namen erfordert.

Unten zeigen wir eine Table mit mehreren zugehörigen Index-Objekten. Die DDL für "CREATE INDEX" wird direkt nach den CREATE-Anweisungen für die Tabelle ausgegeben.

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)
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)

Beachten Sie im obigen Beispiel, dass das Index-Konstrukt extern zu der Tabelle erstellt wird, auf die es sich bezieht, wobei direkt Column-Objekte verwendet werden. Index unterstützt auch die "Inline"-Definition innerhalb der Table, unter Verwendung von String-Namen zur Identifizierung von Spalten.

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),
)

Das Index-Objekt unterstützt auch seine eigene create() Methode.

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

Funktionale Indizes

Index unterstützt SQL- und Funktionsausdrücke, wie sie vom Zielbackend unterstützt werden. Um einen Index auf eine Spalte mit absteigendem Wert zu erstellen, kann der Modifikator ColumnElement.desc() verwendet werden.

from sqlalchemy import Index

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

Oder mit einem Backend, das funktionale Indizes unterstützt, wie PostgreSQL, kann ein "case-insensitive" Index mit der lower() Funktion erstellt werden.

from sqlalchemy import func, Index

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

Index API

Objektname Beschreibung

Index

Ein INDEX auf Tabellenebene.

class sqlalchemy.schema.Index

Ein INDEX auf Tabellenebene.

Definiert einen zusammengesetzten INDEX (eine oder mehrere Spalten).

Z. B.

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

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

Für einen einfachen Index mit einer Spalte unterstützt die Hinzufügung von Column auch index=True.

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

Für einen zusammengesetzten Index können mehrere Spalten angegeben werden.

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

Funktionale Indizes werden ebenfalls unterstützt, typischerweise durch die Verwendung des func-Konstrukts in Verbindung mit Tabellen gebundenen Column-Objekten.

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

Ein Index kann auch manuell mit einer Table verknüpft werden, entweder durch Inline-Deklaration oder durch Verwendung von Table.append_constraint(). Wenn dieser Ansatz verwendet wird, können die Namen der indizierten Spalten als Strings angegeben werden.

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

Um funktionale oder ausdrucksbasierte Indizes in dieser Form zu unterstützen, kann das text()-Konstrukt verwendet werden.

from sqlalchemy import text

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

Siehe auch

Indizes - Allgemeine Informationen zu Index.

PostgreSQL-spezifische Indexoptionen - PostgreSQL-spezifische Optionen, die für das Index-Konstrukt verfügbar sind.

MySQL / MariaDB-spezifische Indexoptionen - MySQL-spezifische Optionen, die für das Index-Konstrukt verfügbar sind.

Unterstützung für Clustered Indexes - MSSQL-spezifische Optionen, die für das Index-Konstrukt verfügbar sind.

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

Erstellt ein Index-Objekt.

Parameter:
  • name – Der Name des Indexes.

  • *expressions – Spaltenausdrücke, die in den Index aufgenommen werden sollen. Die Ausdrücke sind normalerweise Instanzen von Column, können aber auch beliebige SQL-Ausdrücke sein, die letztendlich auf eine Column verweisen.

  • unique=False – Nur-Schlüsselwortargument; wenn True, wird ein eindeutiger Index erstellt.

  • quote=None – Nur-Schlüsselwortargument; ob Anführungszeichen für den Namen des Indexes angewendet werden sollen. Funktioniert auf die gleiche Weise wie bei Column.quote.

  • info=None – Optionale Daten, die im Attribut SchemaItem.info dieses Objekts gespeichert werden.

  • **dialect_kw – Zusätzliche Schlüsselwortargumente, die nicht oben erwähnt werden, sind dialektspezifisch und werden in der Form <dialectname>_<argname> übergeben. Details zu dokumentierten Argumenten finden Sie in der Dokumentation eines einzelnen Dialekts unter Dialekte.

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

geerbt von der Methode DialectKWArgs.argument_for() der Klasse DialectKWArgs

Fügt eine neue Art von dialektspezifischem Schlüsselwortargument für diese Klasse hinzu.

Z. B.

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

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

Die Methode DialectKWArgs.argument_for() ist ein pro-Argument-Weg, um zusätzliche Argumente zum Wörterbuch DefaultDialect.construct_arguments hinzuzufügen. Dieses Wörterbuch enthält eine Liste von Argumentnamen, die von verschiedenen schemabezogenen Konstrukten im Namen eines Dialekts akzeptiert werden.

Neue Dialekte sollten dieses Wörterbuch typischerweise auf einmal als Datenmember der Dialektklasse angeben. Der Anwendungsfall für die ad-hoc-Addition von Argumentnamen ist typischerweise für Endbenutzercode, der auch ein benutzerdefiniertes Kompilierungsschema verwendet, das die zusätzlichen Argumente konsumiert.

Parameter:
  • dialect_name – Name eines Dialekts. Der Dialekt muss auffindbar sein, andernfalls wird eine NoSuchModuleError ausgelöst. Der Dialekt muss auch eine vorhandene DefaultDialect.construct_arguments Sammlung enthalten, die angibt, dass er am Validierungs- und Standard-System für Schlüsselwortargumente teilnimmt, andernfalls wird ArgumentError ausgelöst. Wenn der Dialekt diese Sammlung nicht enthält, dann kann jedes Schlüsselwortargument bereits für diesen Dialekt angegeben werden. Alle in SQLAlchemy enthaltenen Dialekte enthalten diese Sammlung, jedoch kann die Unterstützung für Drittanbieter-Dialekte variieren.

  • argument_name – Name des Parameters.

  • default – Standardwert des Parameters.

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

Gibt eine CREATE-Anweisung für diesen Index aus und verwendet die gegebene Connection oder Engine` für die Konnektivität.

Siehe auch

MetaData.create_all().

Methode sqlalchemy.schema.Index.ddl_if(dialect: str | None = None, callable_: DDLIfCallable | None = None, state: Any | None = None) Self

geerbt von der Methode HasConditionalDDL.ddl_if() der Klasse HasConditionalDDL

Wenden Sie eine bedingte DDL-Regel auf dieses Schemelement an.

Diese Regeln funktionieren ähnlich wie der ExecutableDDLElement.execute_if()-Aufruf, mit der zusätzlichen Funktion, dass die Kriterien während der DDL-Kompilierungsphase für ein Konstrukt wie CreateTable geprüft werden können. HasConditionalDDL.ddl_if() gilt derzeit auch für das Index-Konstrukt sowie für alle Constraint-Konstrukte.

Parameter:
  • dialect – string name of a dialect, or a tuple of string names to indicate multiple dialect types.

  • callable_ – a callable that is constructed using the same form as that described in ExecutableDDLElement.execute_if.callable_.

  • state – any arbitrary object that will be passed to the callable, if present.

Neu in Version 2.0.

Siehe auch

Kontrolle der DDL-Generierung von Einschränkungen und Indizes - Hintergrund und Anwendungsbeispiele

Attribut sqlalchemy.schema.Index.dialect_kwargs

geerbt vom Attribut DialectKWArgs.dialect_kwargs der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Die Argumente sind hier in ihrem ursprünglichen Format <dialect>_<kwarg> vorhanden. Nur tatsächlich übergebene Argumente sind enthalten; im Gegensatz zur Sammlung DialectKWArgs.dialect_options, die alle vom Dialekt bekannten Optionen einschließlich Standardwerte enthält.

Die Sammlung ist auch beschreibbar; Schlüssel werden im Format <dialect>_<kwarg> akzeptiert, wobei der Wert in die Liste der Optionen aufgenommen wird.

Siehe auch

DialectKWArgs.dialect_options - verschachtelte Wörterbuchform

Attribut sqlalchemy.schema.Index.dialect_options

geerbt vom Attribut DialectKWArgs.dialect_options der Klasse DialectKWArgs

Eine Sammlung von Schlüsselwortargumenten, die als Dialekt-spezifische Optionen für dieses Konstrukt angegeben wurden.

Dies ist eine zweistufig verschachtelte Registry, die auf <dialect_name> und <argument_name> geschlüsselt ist. Zum Beispiel ist das Argument postgresql_where auffindbar unter

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

Neu in Version 0.9.2.

Siehe auch

DialectKWArgs.dialect_kwargs - flache Wörterbuchform

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

Issue a DROP statement for this Index, using the given Connection or Engine for connectivity.

Siehe auch

MetaData.drop_all().

Attribut sqlalchemy.schema.Index.info

geerbt vom Attribut SchemaItem.info der Klasse SchemaItem

Info-Wörterbuch, das dem Objekt zugeordnet ist und es ermöglicht, benutzerdefinierte Daten mit diesem SchemaItem zu verknüpfen.

Das Wörterbuch wird automatisch generiert, wenn es zum ersten Mal aufgerufen wird. Es kann auch im Konstruktor einiger Objekte, wie z. B. Table und Column, angegeben werden.

Attribut sqlalchemy.schema.Index.kwargs

geerbt vom Attribut DialectKWArgs.kwargs der Klasse DialectKWArgs

Ein Synonym für DialectKWArgs.dialect_kwargs.