SQLAlchemy 2.0 Dokumentation
Häufig gestellte Fragen
- Installation
- Verbindungen / Engines
- MetaData / Schema¶
- Mein Programm hängt, wenn ich sage
table.drop()/metadata.drop_all() - Unterstützt SQLAlchemy ALTER TABLE, CREATE VIEW, CREATE TRIGGER, Schema-Upgrade-Funktionalität?
- Wie kann ich Table-Objekte nach ihrer Abhängigkeit sortieren?
- Wie bekomme ich die CREATE TABLE/ DROP TABLE Ausgabe als String?
- Wie kann ich Table/Column unterklassifizieren, um bestimmte Verhaltensweisen/Konfigurationen bereitzustellen?
- Mein Programm hängt, wenn ich sage
- SQL-Ausdrücke
- ORM-Konfiguration
- Performance
- Sessions / Abfragen
- Probleme bei der Integration von Drittanbietern
Projektversionen
- Vorher: Connections / Engines
- Nächste: SQL-Ausdrücke
- Nach oben: Startseite
- Auf dieser Seite
- MetaData / Schema
- Mein Programm hängt, wenn ich sage
table.drop()/metadata.drop_all() - Unterstützt SQLAlchemy ALTER TABLE, CREATE VIEW, CREATE TRIGGER, Schema-Upgrade-Funktionalität?
- Wie kann ich Table-Objekte nach ihrer Abhängigkeit sortieren?
- Wie bekomme ich die CREATE TABLE/ DROP TABLE Ausgabe als String?
- Wie kann ich Table/Column unterklassifizieren, um bestimmte Verhaltensweisen/Konfigurationen bereitzustellen?
- Mein Programm hängt, wenn ich sage
MetaData / Schema¶
Mein Programm hängt, wenn ich sage table.drop() / metadata.drop_all()¶
Dies entspricht normalerweise zwei Bedingungen: 1. Verwendung von PostgreSQL, das sehr streng bei Tabellensperren ist, und 2. Sie haben noch eine Verbindung geöffnet, die Sperren auf der Tabelle enthält und sich von der Verbindung unterscheidet, die für die DROP-Anweisung verwendet wird. Hier ist die minimalistischste Version des Musters
connection = engine.connect()
result = connection.execute(mytable.select())
mytable.drop(engine)Oben ist eine Verbindung aus einem Verbindungspool noch ausgecheckt; darüber hinaus behält das obige Ergebnisobjekt auch einen Link zu dieser Verbindung. Wenn "implizite Ausführung" verwendet wird, hält das Ergebnis diese Verbindung offen, bis das Ergebnisobjekt geschlossen wird oder alle Zeilen erschöpft sind.
Der Aufruf von mytable.drop(engine) versucht, DROP TABLE über eine zweite Verbindung auszugeben, die vom Engine bezogen wird, was zu Sperren führt.
Die Lösung besteht darin, alle Verbindungen zu schließen, bevor DROP TABLE ausgegeben wird
connection = engine.connect()
result = connection.execute(mytable.select())
# fully read result sets
result.fetchall()
# close connections
connection.close()
# now locks are removed
mytable.drop(engine)Unterstützt SQLAlchemy ALTER TABLE, CREATE VIEW, CREATE TRIGGER, Schema-Upgrade-Funktionalität?¶
Allgemeine ALTER-Unterstützung ist in SQLAlchemy nicht direkt vorhanden. Für spezielle DDL-Operationen auf Ad-hoc-Basis können die DDL und verwandte Konstrukte verwendet werden. Siehe Anpassen von DDL für eine Diskussion zu diesem Thema.
Eine umfassendere Option ist die Verwendung von Schema-Migrationswerkzeugen wie Alembic oder SQLAlchemy-Migrate; siehe Datenbankobjekte über Migrationen ändern für eine Diskussion hierzu.
Wie kann ich Table-Objekte nach ihrer Abhängigkeit sortieren?¶
Dies ist über die Funktion MetaData.sorted_tables verfügbar
metadata_obj = MetaData()
# ... add Table objects to metadata
ti = metadata_obj.sorted_tables
for t in ti:
print(t)Wie kann ich die CREATE TABLE/DROP TABLE-Ausgabe als Zeichenkette erhalten?¶
Modernes SQLAlchemy verfügt über Klauselkonstrukte, die DDL-Operationen darstellen. Diese können wie jeder andere SQL-Ausdruck in Zeichenketten gerendert werden
from sqlalchemy.schema import CreateTable
print(CreateTable(mytable))Um die Zeichenkette spezifisch für eine bestimmte Engine zu erhalten
print(CreateTable(mytable).compile(engine))Es gibt auch eine spezielle Form von Engine, die über create_mock_engine() verfügbar ist und es ermöglicht, eine gesamte Metadaten-Erstellungssequenz als Zeichenkette auszugeben, indem dieses Rezept verwendet wird
from sqlalchemy import create_mock_engine
def dump(sql, *multiparams, **params):
print(sql.compile(dialect=engine.dialect))
engine = create_mock_engine("postgresql+psycopg2://", dump)
metadata_obj.create_all(engine, checkfirst=False)Das Tool Alembic unterstützt auch einen "Offline"-SQL-Generierungsmodus, der Datenbankmigrationen als SQL-Skripte rendert.
Wie kann ich Table/Column unterklassifizieren, um bestimmte Verhaltensweisen/Konfigurationen bereitzustellen?¶
Table und Column sind keine guten Ziele für direkte Unterklassifizierung. Es gibt jedoch einfache Möglichkeiten, Verhaltensweisen während der Erstellung mithilfe von Erstellungsfunktionen und Verhaltensweisen im Zusammenhang mit den Verknüpfungen zwischen Schemaobjekten wie Constraint-Konventionen oder Namenskonventionen mithilfe von Anhang-Events zu erzielen. Ein Beispiel für viele dieser Techniken finden Sie unter Namenskonventionen.
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