SQLAlchemy 2.0 Dokumentation
SQLAlchemy Core
- API für SQL-Anweisungen und Ausdrücke
- Schema Definition Language
- Datenbanken mit MetaData beschreiben
- Datenbankobjekte reflektieren
- Column INSERT/UPDATE Defaults
- Constraints und Indizes definieren
- Anpassen von DDL¶
- Benutzerdefiniertes DDL
- Steuern von DDL-Sequenzen
- Verwenden der integrierten DDLElement-Klassen
- Steuerung der DDL-Generierung von Constraints und Indizes
- DDL-Ausdruckskonstrukte API
- SQL Datentyp-Objekte
- Engine und Connection verwenden
- Grundlagen der Core API
Projektversionen
- Vorhergehend: Definieren von Constraints und Indizes
- Nächstes: SQL-Datentypobjekte
- Nach oben: Startseite
- Auf dieser Seite
- DDL anpassen
- Benutzerdefiniertes DDL
- Steuern von DDL-Sequenzen
- Verwenden der integrierten DDLElement-Klassen
- Steuerung der DDL-Generierung von Constraints und Indizes
- DDL-Ausdruckskonstrukte API
Anpassen von DDL¶
In den vorherigen Abschnitten haben wir eine Vielzahl von Schemakonstrukten wie Table, ForeignKeyConstraint, CheckConstraint und Sequence besprochen. Durchweg haben wir uns auf die Methoden create() und create_all() von Table und MetaData verlassen, um datendefinitionssprachliche (DDL) Befehle für alle Konstrukte auszugeben. Wenn diese ausgegeben werden, wird eine vordefinierte Reihenfolge von Operationen aufgerufen, und DDL zum Erstellen jeder Tabelle wird bedingungslos erstellt, einschließlich aller damit verbundenen Constraints und anderer Objekte. Für komplexere Szenarien, bei denen datenbankspezifisches DDL erforderlich ist, bietet SQLAlchemy zwei Techniken, mit denen jedes DDL basierend auf jeder Bedingung hinzugefügt werden kann, entweder begleitend zur Standardgenerierung von Tabellen oder für sich allein.
Benutzerdefiniertes DDL¶
Benutzerdefinierte DDL-Phrasen werden am einfachsten mit dem DDL-Konstrukt erreicht. Dieses Konstrukt funktioniert wie alle anderen DDL-Elemente, außer dass es einen String akzeptiert, der den auszugebenden Text darstellt
event.listen(
metadata,
"after_create",
DDL(
"ALTER TABLE users ADD CONSTRAINT "
"cst_user_name_length "
" CHECK (length(user_name) >= 8)"
),
)Eine umfassendere Methode zum Erstellen von Bibliotheken von DDL-Konstrukten ist die Verwendung benutzerdefinierter Kompilierung - siehe Benutzerdefinierte SQL-Konstrukte und Kompilierungserweiterung für Details.
Steuerung von DDL-Sequenzen¶
Das zuvor eingeführte DDL-Konstrukt kann auch bedingt basierend auf der Inspektion der Datenbank aufgerufen werden. Diese Funktion ist über die Methode ExecutableDDLElement.execute_if() verfügbar. Wenn wir beispielsweise einen Trigger erstellen möchten, aber nur auf dem PostgreSQL-Backend, könnten wir dies wie folgt aufrufen
mytable = Table(
"mytable",
metadata,
Column("id", Integer, primary_key=True),
Column("data", String(50)),
)
func = DDL(
"CREATE FUNCTION my_func() "
"RETURNS TRIGGER AS $$ "
"BEGIN "
"NEW.data := 'ins'; "
"RETURN NEW; "
"END; $$ LANGUAGE PLPGSQL"
)
trigger = DDL(
"CREATE TRIGGER dt_ins BEFORE INSERT ON mytable "
"FOR EACH ROW EXECUTE PROCEDURE my_func();"
)
event.listen(mytable, "after_create", func.execute_if(dialect="postgresql"))
event.listen(mytable, "after_create", trigger.execute_if(dialect="postgresql"))Das Schlüsselwort ExecutableDDLElement.execute_if.dialect akzeptiert auch ein Tupel aus String-Dialektnamen
event.listen(
mytable, "after_create", trigger.execute_if(dialect=("postgresql", "mysql"))
)
event.listen(
mytable, "before_drop", trigger.execute_if(dialect=("postgresql", "mysql"))
)Die Methode ExecutableDDLElement.execute_if() kann auch gegen eine aufrufbare Funktion arbeiten, die die verwendete Datenbankverbindung erhält. Im folgenden Beispiel verwenden wir dies, um bedingt einen CHECK-Constraint zu erstellen, indem wir zunächst die PostgreSQL-Kataloge durchsuchen, um zu sehen, ob er existiert
def should_create(ddl, target, connection, **kw):
row = connection.execute(
"select conname from pg_constraint where conname='%s'" % ddl.element.name
).scalar()
return not bool(row)
def should_drop(ddl, target, connection, **kw):
return not should_create(ddl, target, connection, **kw)
event.listen(
users,
"after_create",
DDL(
"ALTER TABLE users ADD CONSTRAINT "
"cst_user_name_length CHECK (length(user_name) >= 8)"
).execute_if(callable_=should_create),
)
event.listen(
users,
"before_drop",
DDL("ALTER TABLE users DROP CONSTRAINT cst_user_name_length").execute_if(
callable_=should_drop
),
)
users.create(engine)
CREATE TABLE users (
user_id SERIAL NOT NULL,
user_name VARCHAR(40) NOT NULL,
PRIMARY KEY (user_id)
)
SELECT conname FROM pg_constraint WHERE conname='cst_user_name_length'
ALTER TABLE users ADD CONSTRAINT cst_user_name_length CHECK (length(user_name) >= 8)
users.drop(engine)
SELECT conname FROM pg_constraint WHERE conname='cst_user_name_length'
ALTER TABLE users DROP CONSTRAINT cst_user_name_length
DROP TABLE users
Verwenden der integrierten DDLElement-Klassen¶
Das Paket sqlalchemy.schema enthält SQL-Ausdruckskonstrukte, die DDL-Ausdrücke bereitstellen, die alle von der gemeinsamen Basisklasse ExecutableDDLElement erben. Um beispielsweise eine CREATE TABLE-Anweisung zu erzeugen, kann das CreateTable-Konstrukt verwendet werden
from sqlalchemy.schema import CreateTable
with engine.connect() as conn:
conn.execute(CreateTable(mytable))
CREATE TABLE mytable (
col1 INTEGER,
col2 INTEGER,
col3 INTEGER,
col4 INTEGER,
col5 INTEGER,
col6 INTEGER
)
Oben funktioniert das CreateTable-Konstrukt wie jedes andere Ausdruckskonstrukt (wie select(), table.insert() usw.). Alle DDL-orientierten Konstrukte von SQLAlchemy sind Unterklassen der Basisklasse ExecutableDDLElement. Dies ist die Basis aller Objekte, die CREATE und DROP sowie ALTER entsprechen, nicht nur in SQLAlchemy, sondern auch in Alembic Migrations. Eine vollständige Referenz der verfügbaren Konstrukte finden Sie in DDL-Ausdruckskonstrukte API.
Benutzerdefinierte DDL-Konstrukte können auch als Unterklassen von ExecutableDDLElement selbst erstellt werden. Die Dokumentation unter Benutzerdefinierte SQL-Konstrukte und Kompilierungserweiterung enthält mehrere Beispiele hierfür.
Steuerung der DDL-Generierung von Constraints und Indizes¶
Neu in Version 2.0.
Während die zuvor erwähnte Methode ExecutableDDLElement.execute_if() für benutzerdefinierte DDL-Klassen nützlich ist, die bedingt aufgerufen werden müssen, gibt es auch einen häufigen Bedarf für Elemente, die typischerweise mit einer bestimmten Table verbunden sind, nämlich Constraints und Indizes, um ebenfalls "bedingten" Regeln zu unterliegen, wie z. B. einem Index, der Funktionen enthält, die für ein bestimmtes Backend wie PostgreSQL oder SQL Server spezifisch sind. Für diesen Anwendungsfall können die Methoden Constraint.ddl_if() und Index.ddl_if() gegen Konstrukte wie CheckConstraint, UniqueConstraint und Index verwendet werden. Sie akzeptieren dieselben Argumente wie die Methode ExecutableDDLElement.execute_if(), um zu steuern, ob ihre DDL-Befehle im Hinblick auf ihr übergeordnetes Table-Objekt ausgegeben werden. Diese Methoden können Inline beim Erstellen der Definition für eine Table (oder ähnlich bei Verwendung der __table_args__-Sammlung in einem ORM-Deklarationsmapping) verwendet werden, wie z. B.
from sqlalchemy import CheckConstraint, Index
from sqlalchemy import MetaData, Table, Column
from sqlalchemy import Integer, String
meta = MetaData()
my_table = Table(
"my_table",
meta,
Column("id", Integer, primary_key=True),
Column("num", Integer),
Column("data", String),
Index("my_pg_index", "data").ddl_if(dialect="postgresql"),
CheckConstraint("num > 5").ddl_if(dialect="postgresql"),
)Im obigen Beispiel bezieht sich das Table-Konstrukt sowohl auf ein Index- als auch auf ein CheckConstraint-Konstrukt, die beide .ddl_if(dialect="postgresql") angeben, was bedeutet, dass diese Elemente nur bei der PostgreSQL-Dialekt bei der CREATE TABLE-Sequenz enthalten sind. Wenn wir beispielsweise meta.create_all() gegen die SQLite-Dialekt ausführen, werden keine der beiden Konstrukte einbezogen
>>> from sqlalchemy import create_engine
>>> sqlite_engine = create_engine("sqlite+pysqlite://", echo=True)
>>> meta.create_all(sqlite_engine)
BEGIN (implicit)
PRAGMA main.table_info("my_table")
[raw sql] ()
PRAGMA temp.table_info("my_table")
[raw sql] ()
CREATE TABLE my_table (
id INTEGER NOT NULL,
num INTEGER,
data VARCHAR,
PRIMARY KEY (id)
)
Wenn wir jedoch dieselben Befehle gegen eine PostgreSQL-Datenbank ausführen, sehen wir Inline-DDL für den CHECK-Constraint sowie eine separate CREATE-Anweisung für den Index
>>> from sqlalchemy import create_engine
>>> postgresql_engine = create_engine(
... "postgresql+psycopg2://scott:tiger@localhost/test", echo=True
... )
>>> meta.create_all(postgresql_engine)
BEGIN (implicit)
select relname from pg_class c join pg_namespace n on n.oid=c.relnamespace where pg_catalog.pg_table_is_visible(c.oid) and relname=%(name)s
[generated in 0.00009s] {'name': 'my_table'}
CREATE TABLE my_table (
id SERIAL NOT NULL,
num INTEGER,
data VARCHAR,
PRIMARY KEY (id),
CHECK (num > 5)
)
[no key 0.00007s] {}
CREATE INDEX my_pg_index ON my_table (data)
[no key 0.00013s] {}
COMMIT
Die Methoden Constraint.ddl_if() und Index.ddl_if() erstellen einen Event-Hook, der nicht nur zur DDL-Ausführungszeit wie bei ExecutableDDLElement.execute_if() abgefragt werden kann, sondern auch während der SQL-Kompilierungsphase des CreateTable-Objekts, das für das Rendern des CHECK (num > 5) DDL Inline in die CREATE TABLE-Anweisung verantwortlich ist. Daher verfügt der Event-Hook, der vom Parameter ddl_if.callable_() empfangen wird, über einen reichhaltigeren Satz von Argumenten, einschließlich des Schlüsselwortarguments dialect sowie einer Instanz von DDLCompiler über das Schlüsselwortargument compiler für den "Inline-Rendering"-Teil der Sequenz. Das Argument bind ist **nicht** vorhanden, wenn das Ereignis innerhalb der DDLCompiler-Sequenz ausgelöst wird. Ein moderner Event-Hook, der die Datenbankspezifikationsinformationen inspizieren möchte, würde am besten das gegebene Dialect-Objekt verwenden, z. B. um die PostgreSQL-Spezifikationsinformationen zu testen.
def only_pg_14(ddl_element, target, bind, dialect, **kw):
return dialect.name == "postgresql" and dialect.server_version_info >= (14,)
my_table = Table(
"my_table",
meta,
Column("id", Integer, primary_key=True),
Column("num", Integer),
Column("data", String),
Index("my_pg_index", "data").ddl_if(callable_=only_pg_14),
)DDL-Ausdruckskonstrukte API¶
| Objektname | Beschreibung |
|---|---|
Basisklasse für DDL-Konstrukte, die CREATE und DROP oder Entsprechungen darstellen. |
|
Repräsentiert eine ALTER TABLE ADD CONSTRAINT-Anweisung. |
|
Die Wurzel der DDL-Konstrukte, einschließlich derjenigen, die Unterelemente innerhalb des "CREATE TABLE"- und anderer Prozesse sind. |
|
Stellt eine |
|
Stellt eine CREATE INDEX-Anweisung dar. |
|
Stellt eine CREATE SCHEMA-Anweisung dar. |
|
Stellt eine CREATE SEQUENCE-Anweisung dar. |
|
Stellt eine CREATE TABLE-Anweisung dar. |
|
Eine wörtliche DDL-Anweisung. |
|
Repräsentiert eine ALTER TABLE DROP CONSTRAINT-Anweisung. |
|
Stellt eine DROP INDEX-Anweisung dar. |
|
Stellt eine DROP SCHEMA-Anweisung dar. |
|
Stellt eine DROP SEQUENCE-Anweisung dar. |
|
Stellt eine DROP TABLE-Anweisung dar. |
|
Basisklasse für eigenständige ausführbare DDL-Ausdruckskonstrukte. |
|
sort_tables(tables[, skip_fn, extra_dependencies]) |
Sortiert eine Sammlung von |
sort_tables_and_constraints(tables[, filter_fn, extra_dependencies, _warn_for_cycles]) |
Sortiert eine Sammlung von |
- function sqlalchemy.schema.sort_tables(tables: Iterable[TableClause], skip_fn: Callable[[ForeignKeyConstraint], bool] | None = None, extra_dependencies: typing_Sequence[Tuple[TableClause, TableClause]] | None = None) → List[Table]¶
Sortiert eine Sammlung von
Table-Objekten basierend auf Abhängigkeiten.Dies ist eine abhängigkeitsgeordnete Sortierung, die
Table-Objekte so ausgibt, dass sie ihren abhängigenTable-Objekten folgen. Tabellen sind voneinander abhängig aufgrund der Anwesenheit vonForeignKeyConstraint-Objekten sowie expliziten Abhängigkeiten, die durchTable.add_is_dependent_on()hinzugefügt wurden.Warnung
Die Funktion
sort_tables()kann nicht allein die automatische Auflösung von Abhängigkeitszyklen zwischen Tabellen unterstützen, die normalerweise durch gegenseitig abhängige Fremdschlüssel-Constraints verursacht werden. Wenn diese Zyklen erkannt werden, werden die Fremdschlüssel dieser Tabellen von der Berücksichtigung in der Sortierung ausgeschlossen. Es wird eine Warnung ausgegeben, wenn diese Bedingung auftritt, die in einer zukünftigen Version eine Ausnahme auslösen wird. Tabellen, die nicht Teil des Zyklus sind, werden weiterhin in Abhängigkeitsreihenfolge zurückgegeben.Um diese Zyklen aufzulösen, kann der Parameter
ForeignKeyConstraint.use_alterauf die Constraints angewendet werden, die einen Zyklus erzeugen. Alternativ gibt die Funktionsort_tables_and_constraints()Fremdschlüssel-Constraints bei erkannter Zyklen automatisch in einer separaten Sammlung zurück, sodass sie separat auf ein Schema angewendet werden können.Geändert in Version 1.3.17: - Es wird eine Warnung ausgegeben, wenn
sort_tables()aufgrund von zyklischen Abhängigkeiten keine korrekte Sortierung durchführen kann. Dies wird in einer zukünftigen Version zu einer Ausnahme führen. Zusätzlich wird die Sortierung weiterhin andere Tabellen, die nicht am Zyklus beteiligt sind, in Abhängigkeitsreihenfolge zurückgeben, was vorher nicht der Fall war.- Parameter:
skip_fn¶ – optionaler aufrufbarer Parameter, der ein
ForeignKeyConstraint-Objekt erhält; wenn er True zurückgibt, wird dieses Constraint nicht als Abhängigkeit berücksichtigt. Beachten Sie, dass dies **anders** ist als beim gleichnamigen Parameter insort_tables_and_constraints(), das stattdessen das besitzendeForeignKeyConstraint-Objekt erhält.extra_dependencies¶ – eine Sequenz von 2-Tupeln von Tabellen, die ebenfalls als voneinander abhängig betrachtet werden.
Siehe auch
MetaData.sorted_tables- verwendet diese Funktion zum Sortieren
- function sqlalchemy.schema.sort_tables_and_constraints(tables, filter_fn=None, extra_dependencies=None, _warn_for_cycles=False)¶
Sortiert eine Sammlung von
Table/ForeignKeyConstraint-Objekten.Dies ist eine abhängigkeitsgeordnete Sortierung, die Tupel von
(Table, [ForeignKeyConstraint, ...])ausgibt, sodass jedeTableihren abhängigenTable-Objekten folgt. VerbleibendeForeignKeyConstraint-Objekte, die aufgrund von Abhängigkeitsregeln, die von der Sortierung nicht erfüllt werden, getrennt sind, werden anschließend als(None, [ForeignKeyConstraint ...])ausgegeben.Tabellen sind voneinander abhängig aufgrund der Anwesenheit von
ForeignKeyConstraint-Objekten, expliziten Abhängigkeiten, die durchTable.add_is_dependent_on()hinzugefügt wurden, sowie Abhängigkeiten, die hier mit den Parameternsort_tables_and_constraints.skip_fnund/odersort_tables_and_constraints.extra_dependenciesangegeben sind.- Parameter:
filter_fn¶ – optionaler aufrufbarer Parameter, der ein
ForeignKeyConstraint-Objekt erhält und einen Wert zurückgibt, der angibt, ob dieses Constraint definitiv als Inline-Constraint einbezogen oder ausgeschlossen werden soll, oder keines von beiden. Wenn es False zurückgibt, wird das Constraint definitiv als Abhängigkeit einbezogen, die nicht durch ALTER geändert werden kann; wenn es True zurückgibt, wird es **nur** als ALTER-Ergebnis am Ende einbezogen. Wenn None zurückgegeben wird, bedeutet dies, dass das Constraint im tabellenbasierten Ergebnis enthalten ist, es sei denn, es wird als Teil eines Abhängigkeitszyklus erkannt.extra_dependencies¶ – eine Sequenz von 2-Tupeln von Tabellen, die ebenfalls als voneinander abhängig betrachtet werden.
Siehe auch
- class sqlalchemy.schema.BaseDDLElement¶
Die Wurzel der DDL-Konstrukte, einschließlich derjenigen, die Unterelemente innerhalb des "CREATE TABLE"- und anderer Prozesse sind.
Neu in Version 2.0.
Klassensignatur
class
sqlalchemy.schema.BaseDDLElement(sqlalchemy.sql.expression.ClauseElement)
- class sqlalchemy.schema.ExecutableDDLElement¶
Basisklasse für eigenständige ausführbare DDL-Ausdruckskonstrukte.
Diese Klasse ist die Basis für die allgemeine Klasse
DDLsowie für die verschiedenen CREATE/DROP-Klausel-Konstrukte wieCreateTable,DropTable,AddConstraintusw.Geändert in Version 2.0:
ExecutableDDLElementwurde vonDDLElementumbenannt, das für Abwärtskompatibilität weiterhin existiert.ExecutableDDLElementintegriert sich eng mit SQLAlchemy-Ereignissen, die in Events eingeführt wurden. Eine Instanz davon ist selbst ein Ereignis-empfangendes aufrufbares Objektevent.listen( users, "after_create", AddConstraint(constraint).execute_if(dialect="postgresql"), )
Mitglieder
Klassensignatur
class
sqlalchemy.schema.ExecutableDDLElement(sqlalchemy.sql.roles.DDLRole,sqlalchemy.sql.expression.Executable,sqlalchemy.schema.BaseDDLElement)-
method
sqlalchemy.schema.ExecutableDDLElement.__call__(target, bind, **kw)¶ Führt das DDL als ddl_listener aus.
-
method
sqlalchemy.schema.ExecutableDDLElement.against(target: SchemaItem) → Self¶ Gibt eine Kopie dieses
ExecutableDDLElementzurück, die das angegebene Ziel enthält.Dies wendet im Wesentlichen das gegebene Element auf das Attribut
.targetdes zurückgegebenenExecutableDDLElementObjekts an. Dieses Ziel kann dann von Ereignishandlern und Kompilierungsroutinen verwendet werden, um Dienste wie die Tokenisierung eines DDL-Strings im Hinblick auf eine bestimmteTablebereitzustellen.Wenn ein
ExecutableDDLElementObjekt als Ereignishandler für die EreignisseDDLEvents.before_create()oderDDLEvents.after_create()eingerichtet wird und das Ereignis dann für ein bestimmtes Ziel wie eineConstraintoderTableeintritt, wird dieses Ziel mit einer Kopie desExecutableDDLElementObjekts über diese Methode eingerichtet, die dann zur MethodeExecutableDDLElement.execute()übergeht, um die tatsächliche DDL-Anweisung aufzurufen.- Parameter:
target¶ – ein
SchemaItem, das das Ziel einer DDL-Operation sein wird.- Gibt zurück:
eine Kopie dieses
ExecutableDDLElementmit dem Attribut.target, das dem gegebenenSchemaItemzugewiesen ist.
Siehe auch
DDL- verwendet Tokenisierung gegen das „target“ bei der Verarbeitung des DDL-Strings.
-
method
sqlalchemy.schema.ExecutableDDLElement.execute_if(dialect: str | None = None, callable_: DDLIfCallable | None = None, state: Any | None = None) → Self¶ Gibt eine aufrufbare Funktion zurück, die dieses
ExecutableDDLElementbedingt innerhalb eines Ereignishandlers ausführt.Wird verwendet, um einen Wrapper für die Ereignisverfolgung bereitzustellen
event.listen( metadata, "before_create", DDL("my_ddl").execute_if(dialect="postgresql"), )
- Parameter:
dialect¶ –
Kann eine Zeichenkette oder ein Tupel von Zeichenketten sein. Wenn es eine Zeichenkette ist, wird sie mit dem Namen des ausführenden Datenbankdialekts verglichen.
DDL("something").execute_if(dialect="postgresql")
Wenn es ein Tupel ist, werden mehrere Dialektnamen angegeben.
DDL("something").execute_if(dialect=("postgresql", "mysql"))
callable_¶ –
Eine aufrufbare Funktion, die mit drei Positionsargumenten sowie optionalen Schlüsselwortargumenten aufgerufen wird.
- ddl:
Dieses DDL-Element.
- target:
Das
TableoderMetaDataObjekt, das das Ziel dieses Ereignisses ist. Kann None sein, wenn das DDL explizit ausgeführt wird.- bind:
Die
Connection, die für die DDL-Ausführung verwendet wird. Kann None sein, wenn diese Konstruktion inline innerhalb einer Tabelle erstellt wird, in welchem Fallcompilervorhanden sein wird.- tables:
Optionales Schlüsselwortargument - eine Liste von Table-Objekten, die innerhalb eines MetaData.create_all() oder drop_all() Methodenaufrufs erstellt/gelöscht werden sollen.
- dialect:
Schlüsselwortargument, aber immer vorhanden - der
Dialect, der an der Operation beteiligt ist.- compiler:
Schlüsselwortargument. Ist
Nonefür einen DDL-Aufruf auf Engine-Ebene, aber verweist auf einenDDLCompiler, wenn dieses DDL-Element inline innerhalb einer Tabelle erstellt wird.- state:
Optionales Schlüsselwortargument - ist der Wert, der dem Argument `state` dieses Funktionsaufrufs übergeben wurde.
- checkfirst:
Schlüsselwortargument, ist True, wenn das Flag 'checkfirst' während des Aufrufs von
create(),create_all(),drop(),drop_all()gesetzt wurde.
Wenn die aufrufbare Funktion einen True-Wert zurückgibt, wird die DDL-Anweisung ausgeführt.
state¶ – jeder Wert, der als Schlüsselwortargument
statean die aufrufbare Funktion übergeben wird.
-
method
- class sqlalchemy.schema.DDL¶
Eine wörtliche DDL-Anweisung.
Definiert wörtliche SQL DDL-Anweisungen, die von der Datenbank ausgeführt werden sollen. DDL-Objekte fungieren als DDL-Ereignis-Listener und können über die in
DDLEventsaufgeführten Ereignisse abonniert werden, wobei entwederTableoderMetaDataObjekte als Ziele verwendet werden. Grundlegende Vorlagenunterstützung ermöglicht es einer einzelnen DDL-Instanz, repetitive Aufgaben für mehrere Tabellen zu handhaben.Beispiele
from sqlalchemy import event, DDL tbl = Table("users", metadata, Column("uid", Integer)) event.listen(tbl, "before_create", DDL("DROP TRIGGER users_trigger")) spow = DDL("ALTER TABLE %(table)s SET secretpowers TRUE") event.listen(tbl, "after_create", spow.execute_if(dialect="somedb")) drop_spow = DDL("ALTER TABLE users SET secretpowers FALSE") connection.execute(drop_spow)
Bei der Verarbeitung von Tabellenereignissen sind die folgenden Ersetzungen für die Zeichenkette
statementverfügbar%(table)s - the Table name, with any required quoting applied %(schema)s - the schema name, with any required quoting applied %(fullname)s - the Table name including schema, quoted if needed
Der „Kontext“ des DDL wird mit den oben genannten Standardersetzungen kombiniert. Schlüssel, die im Kontext vorhanden sind, überschreiben die Standardersetzungen.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.DDL(sqlalchemy.schema.ExecutableDDLElement)-
method
sqlalchemy.schema.DDL.__init__(statement, context=None)¶ Erstellt eine DDL-Anweisung.
- Parameter:
statement¶ –
Eine Zeichenkette oder Unicode-Zeichenkette, die ausgeführt werden soll. Anweisungen werden mit dem String-Formatierungsoperator von Python verarbeitet, wobei eine feste Menge von Zeichenkettenersetzungen sowie zusätzliche Ersetzungen verwendet werden, die durch den optionalen Parameter
DDL.contextbereitgestellt werden.Ein wörtliches '%' in einer Anweisung muss als '%%' maskiert werden.
SQL-Bindungsparameter sind in DDL-Anweisungen nicht verfügbar.
context¶ – Optionales Wörterbuch, Standardwert ist None. Diese Werte stehen für Zeichenkettenersetzungen in der DDL-Anweisung zur Verfügung.
-
method
- class sqlalchemy.schema._CreateDropBase¶
Basisklasse für DDL-Konstrukte, die CREATE und DROP oder Entsprechungen darstellen.
Das gemeinsame Merkmal von _CreateDropBase ist ein einzelnes Attribut
element, das sich auf das zu erstellende oder zu löschende Element bezieht.Klassensignatur
class
sqlalchemy.schema._CreateDropBase(sqlalchemy.schema.ExecutableDDLElement)
- class sqlalchemy.schema.CreateTable¶
Stellt eine CREATE TABLE-Anweisung dar.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.CreateTable(sqlalchemy.schema._CreateBase)-
method
sqlalchemy.schema.CreateTable.__init__(element: Table, include_foreign_key_constraints: typing_Sequence[ForeignKeyConstraint] | None = None, if_not_exists: bool = False)¶ Erstellt eine
CreateTable-Konstruktion.- Parameter:
include_foreign_key_constraints¶ – optionale Sequenz von
ForeignKeyConstraintObjekten, die inline innerhalb der CREATE-Konstruktion enthalten sein werden; wenn weggelassen, werden alle Fremdschlüssel-Constraints enthalten, die nicht use_alter=True angeben.if_not_exists¶ –
wenn True, wird ein IF NOT EXISTS Operator auf die Konstruktion angewendet.
Neu ab Version 1.4.0b2.
-
method
- class sqlalchemy.schema.DropTable¶
Stellt eine DROP TABLE-Anweisung dar.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.DropTable(sqlalchemy.schema._DropBase)-
method
sqlalchemy.schema.DropTable.__init__(element: Table, if_exists: bool = False)¶ Erstellt eine
DropTable-Konstruktion.
-
method
- class sqlalchemy.schema.CreateColumn¶
Stellt eine
Columndar, wie sie in einer CREATE TABLE-Anweisung über dasCreateTable-Konstrukt gerendert wird.Dies dient zur Unterstützung benutzerdefinierter Spalten-DDLs bei der Generierung von CREATE TABLE-Anweisungen, indem die in Custom SQL Constructs and Compilation Extension dokumentierte Compiler-Erweiterung verwendet wird, um
CreateColumnzu erweitern.Die typische Integration besteht darin, das eingehende
Column-Objekt zu untersuchen und die Kompilierung umzuleiten, wenn ein bestimmtes Flag oder eine Bedingung gefunden wird.from sqlalchemy import schema from sqlalchemy.ext.compiler import compiles @compiles(schema.CreateColumn) def compile(element, compiler, **kw): column = element.element if "special" not in column.info: return compiler.visit_create_column(element, **kw) text = "%s SPECIAL DIRECTIVE %s" % ( column.name, compiler.type_compiler.process(column.type), ) default = compiler.get_column_default_string(column) if default is not None: text += " DEFAULT " + default if not column.nullable: text += " NOT NULL" if column.constraints: text += " ".join( compiler.process(const) for const in column.constraints ) return text
Die obige Konstruktion kann wie folgt auf eine
Tableangewendet werdenfrom sqlalchemy import Table, Metadata, Column, Integer, String from sqlalchemy import schema metadata = MetaData() table = Table( "mytable", MetaData(), Column("x", Integer, info={"special": True}, primary_key=True), Column("y", String(50)), Column("z", String(20), info={"special": True}), ) metadata.create_all(conn)
Oben werden die Direktiven, die wir der
Column.info-Sammlung hinzugefügt haben, von unserem benutzerdefinierten Kompilierungsschema erkannt.CREATE TABLE mytable ( x SPECIAL DIRECTIVE INTEGER NOT NULL, y VARCHAR(50), z SPECIAL DIRECTIVE VARCHAR(20), PRIMARY KEY (x) )
Die
CreateColumn-Konstruktion kann auch verwendet werden, um bestimmte Spalten beim Erzeugen einerCREATE TABLE-Anweisung zu überspringen. Dies wird erreicht, indem eine Kompilierungsregel erstellt wird, die bedingtNonezurückgibt. Dies ist im Wesentlichen, wie man denselben Effekt erzielt, als ob man das Argumentsystem=TrueaufColumnverwendet, das eine Spalte als implizit vorhandene "Systemspalte" kennzeichnet.Angenommen, wir möchten eine
Tableerzeugen, die das Rendern der PostgreSQLxmin-Spalte auf dem PostgreSQL-Backend überspringt, aber auf anderen Backends sie rendert, in Erwartung einer getriggerten Regel. Eine bedingte Kompilierungsregel könnte diesen Namen nur auf PostgreSQL überspringen.from sqlalchemy.schema import CreateColumn @compiles(CreateColumn, "postgresql") def skip_xmin(element, compiler, **kw): if element.element.name == "xmin": return None else: return compiler.visit_create_column(element, **kw) my_table = Table( "mytable", metadata, Column("id", Integer, primary_key=True), Column("xmin", Integer), )
Oben erzeugt eine
CreateTable-Konstruktion einCREATE TABLE, das nur die Spalteidin der Zeichenkette enthält; die Spaltexminwird weggelassen, aber nur gegen das PostgreSQL-Backend.Klassensignatur
class
sqlalchemy.schema.CreateColumn(sqlalchemy.schema.BaseDDLElement)
- class sqlalchemy.schema.CreateSequence¶
Stellt eine CREATE SEQUENCE-Anweisung dar.
Klassensignatur
class
sqlalchemy.schema.CreateSequence(sqlalchemy.schema._CreateBase)
- class sqlalchemy.schema.DropSequence¶
Stellt eine DROP SEQUENCE-Anweisung dar.
Klassensignatur
class
sqlalchemy.schema.DropSequence(sqlalchemy.schema._DropBase)
- class sqlalchemy.schema.CreateIndex¶
Stellt eine CREATE INDEX-Anweisung dar.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.CreateIndex(sqlalchemy.schema._CreateBase)-
method
sqlalchemy.schema.CreateIndex.__init__(element, if_not_exists=False)¶ Erstellt eine
Createindex-Konstruktion.
-
method
- class sqlalchemy.schema.DropIndex¶
Stellt eine DROP INDEX-Anweisung dar.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.DropIndex(sqlalchemy.schema._DropBase)
- class sqlalchemy.schema.AddConstraint¶
Repräsentiert eine ALTER TABLE ADD CONSTRAINT-Anweisung.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.AddConstraint(sqlalchemy.schema._CreateBase)-
method
sqlalchemy.schema.AddConstraint.__init__(element: Constraint, *, isolate_from_table: bool = True)¶ Erstellt eine neue
AddConstraint-Konstruktion.- Parameter:
element¶ – ein
Constraint-Objekt.isolate_from_table¶ –
optionales boolesches Argument, Standardwert ist True. Hat zur Folge, dass der eingehende Constraint von der Aufnahme in eine CREATE TABLE-Sequenz isoliert wird, wenn er mit einer
Tableassoziiert ist.Neu ab Version 2.0.39: - hinzugefügt
AddConstraint.isolate_from_table, Standardwert ist True. Zuvor war das Verhalten dieses Parameters implizit in allen Fällen eingeschaltet.
-
method
- class sqlalchemy.schema.DropConstraint¶
Repräsentiert eine ALTER TABLE DROP CONSTRAINT-Anweisung.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.DropConstraint(sqlalchemy.schema._DropBase)-
method
sqlalchemy.schema.DropConstraint.__init__(element: Constraint, *, cascade: bool = False, if_exists: bool = False, isolate_from_table: bool = True, **kw: Any)¶ Erstellt eine neue
DropConstraint-Konstruktion.- Parameter:
element¶ – ein
Constraint-Objekt.cascade¶ – optional boolean, gibt an, ob die Backend-spezifische Direktive “CASCADE CONSTRAINT” gerendert werden soll, falls verfügbar
if_exists¶ – optional boolean, gibt an, ob die Backend-spezifische Direktive “IF EXISTS” gerendert werden soll, falls verfügbar
isolate_from_table¶ –
optionales boolesches Argument, Standardwert ist True. Hat zur Folge, dass der eingehende Constraint von der Aufnahme in eine CREATE TABLE-Sequenz isoliert wird, wenn er mit einer
Tableassoziiert ist.Neu in Version 2.0.39: - hinzugefügt
DropConstraint.isolate_from_table, Standardwert ist True. Zuvor war das Verhalten dieses Parameters implizit in allen Fällen aktiviert.
-
method
- class sqlalchemy.schema.CreateSchema¶
Stellt eine CREATE SCHEMA-Anweisung dar.
Das hier übergebene Argument ist der String-Name des Schemas.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.CreateSchema(sqlalchemy.schema._CreateBase)-
method
sqlalchemy.schema.CreateSchema.__init__(name: str, if_not_exists: bool = False)¶ Erstellt ein neues
CreateSchemaKonstrukt.
-
method
- class sqlalchemy.schema.DropSchema¶
Stellt eine DROP SCHEMA-Anweisung dar.
Das hier übergebene Argument ist der String-Name des Schemas.
Mitglieder
Klassensignatur
class
sqlalchemy.schema.DropSchema(sqlalchemy.schema._DropBase)-
method
sqlalchemy.schema.DropSchema.__init__(name: str, cascade: bool = False, if_exists: bool = False)¶ Erstellt ein neues
DropSchemaKonstrukt.
-
method
Die Designs von flambé! dem Drachen und Der Alchemist wurden von Rotem Yaari erstellt und großzügig gespendet.
Erstellt mit Sphinx 7.2.6. Dokumentation zuletzt generiert: Di 11 Mär 2025 14:40:17 EDT