SQLAlchemy 2.0 Dokumentation
Änderungen und Migration
- SQLAlchemy 2.0 - Major Migration Guide
- Was ist neu in SQLAlchemy 2.0?
- 2.0 Changelog¶
- 2.0.40
- 2.0.39
- 2.0.38
- 2.0.37
- 2.0.36
- 2.0.35
- 2.0.34
- 2.0.33
- 2.0.32
- 2.0.31
- 2.0.30
- 2.0.29
- 2.0.28
- 2.0.27
- 2.0.26
- 2.0.25
- 2.0.24
- 2.0.23
- 2.0.22
- 2.0.21
- 2.0.20
- 2.0.19
- 2.0.18
- 2.0.17
- 2.0.16
- 2.0.15
- 2.0.14
- 2.0.13
- 2.0.12
- 2.0.11
- 2.0.10
- 2.0.9
- 2.0.8
- 2.0.7
- 2.0.6
- 2.0.5.post1
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0rc3
- 2.0.0rc2
- 2.0.0rc1
- 2.0.0b4
- 2.0.0b3
- 2.0.0b2
- 2.0.0b1
- 1.4 Changelog
- 1.3 Changelog
- 1.2 Changelog
- 1.1 Changelog
- 1.0 Changelog
- 0.9 Changelog
- 0.8 Changelog
- 0.7 Changelog
- 0.6 Changelog
- 0.5 Changelog
- 0.4 Changelog
- 0.3 Changelog
- 0.2 Changelog
- 0.1 Changelog
- Was ist neu in SQLAlchemy 1.4?
- Was ist neu in SQLAlchemy 1.3?
- Was ist neu in SQLAlchemy 1.2?
- Was ist neu in SQLAlchemy 1.1?
- Was ist neu in SQLAlchemy 1.0?
- Was ist neu in SQLAlchemy 0.9?
- Was ist neu in SQLAlchemy 0.8?
- Was ist neu in SQLAlchemy 0.7?
- Was ist neu in SQLAlchemy 0.6?
- Was ist neu in SQLAlchemy 0.5?
- Was ist neu in SQLAlchemy 0.4?
Projektversionen
- Vorheriger: Neues in SQLAlchemy 2.0?
- Nächster: 1.4 Changelog
- Nach oben: Startseite
- Auf dieser Seite
- 2.0 Changelog
- 2.0.40
- 2.0.39
- 2.0.38
- 2.0.37
- 2.0.36
- 2.0.35
- 2.0.34
- 2.0.33
- 2.0.32
- 2.0.31
- 2.0.30
- 2.0.29
- 2.0.28
- 2.0.27
- 2.0.26
- 2.0.25
- 2.0.24
- 2.0.23
- 2.0.22
- 2.0.21
- 2.0.20
- 2.0.19
- 2.0.18
- 2.0.17
- 2.0.16
- 2.0.15
- 2.0.14
- 2.0.13
- 2.0.12
- 2.0.11
- 2.0.10
- 2.0.9
- 2.0.8
- 2.0.7
- 2.0.6
- 2.0.5.post1
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0rc3
- 2.0.0rc2
- 2.0.0rc1
- 2.0.0b4
- 2.0.0b3
- 2.0.0b2
- 2.0.0b1
2.0 Changelog¶
2.0.40¶
kein Veröffentlichungsdatum2.0.39¶
Veröffentlicht: 11. März 2025orm¶
[orm] [bug] ¶
Fehler behoben, bei dem die Verwendung von DML-Rückgaben wie
Insert.returning()mit einem ORM-Modell, dascolumn_property()-Konstrukte enthielt, die Unterabfragen enthielten, zu einem internen Fehler führte.Referenzen: #12326
[orm] [bug] ¶
Fehler in ORM-aktiviertem UPDATE (und theoretisch DELETE) behoben, bei dem die Verwendung einer Multi-Table-DML-Anweisung nicht zuließ, dass ORM-zugeordnete Spalten von Mappern, die nicht der primäre UPDATE-Mapper waren, in der RETURNING-Klausel genannt wurden; sie wurden stattdessen weggelassen und führten zu einer Ausnahme wegen nicht gefundener Spalte.
Referenzen: #12328
[orm] [bug] ¶
Problem behoben, bei dem das "ist ORM"-Flag einer
select()oder einer anderen ORM-Anweisung nicht an die ORMSessionweitergegeben wurde, die auf einem mehrteiligen Operator-Ausdruck allein basierte, z. B.Cls.attr + Cls.attr + Cls.attroder ähnlichem, was dazu führte, dass ORM-Verhaltensweisen für solche Anweisungen nicht wirksam wurden.Referenzen: #12357
[orm] [bug] ¶
Problem behoben, bei dem die Verwendung von
aliased()um einCTE-Konstrukt herum zu unangemessenen "doppelten CTE"-Fehlern führen konnte, wenn dieses aliasierte Konstrukt mehrmals in einer einzigen Anweisung vorkam.Referenzen: #12364
sql¶
[sql] [bug] ¶
Neue Parameter
AddConstraint.isolate_from_tableundDropConstraint.isolate_from_tablehinzugefügt, die standardmäßig auf True gesetzt sind und das seit langem bestehende Verhalten dieser beiden Konstrukte dokumentieren und steuerbar machen, dass die gegebene Einschränkung nicht inline in die "CREATE TABLE"-Sequenz aufgenommen wird, unter der Annahme, dass separate Add/Drop-Direktiven verwendet werden sollten.Referenzen: #12382
typing¶
[typing] [usecase] ¶
Unterstützung für generische Typen für zusammengesetzte Abfragen (
union(),union_all(),Select.union(),Select.union_all(), etc.) gibt den Typ der ersten Abfrage zurück. Pull-Request von Mingyu Park.Referenzen: #11922
asyncio¶
[asyncio] [bug] ¶
Fehler behoben, bei dem
AsyncResult.scalar(),AsyncResult.scalar_one_or_none()undAsyncResult.scalar_one()einenAttributeErroraufgrund eines fehlenden internen Attributs auslösten. Pull-Request von Allen Ho.Referenzen: #12338
postgresql¶
[postgresql] [bug] ¶
SQL-Typisierung zur Reflexionsabfrage hinzugefügt, die verwendet wird, um die Struktur von IDENTITY-Spalten abzurufen, und explizite JSON-Typisierung zur Abfrage hinzugefügt, um ungewöhnliche PostgreSQL-Treiberkonfigurationen zu unterstützen, die JSON nicht nativ unterstützen.
Referenzen: #11751
[postgresql] [bug] ¶
Problem behoben, das PostgreSQL 17.3 und höher betraf, bei dem die Reflexion von Domänen mit "NOT NULL" als Teil ihrer Definition einen ungültigen Einschränkungseintrag in den von
PGInspector.get_domains()zurückgegebenen Daten enthielt, der einer zusätzlichen "NOT NULL"-Einschränkung entsprach, die keine CHECK-Einschränkung ist; der vorhandene Eintrag"nullable"im Wörterbuch gibt bereits an, ob die Domäne eine "not null"-Einschränkung enthält. Beachten Sie, dass solche Domänen auf PostgreSQL 17.0 bis 17.2 aufgrund eines Fehlers auf der PostgreSQL-Seite nicht reflektiert werden können; wenn Fehler bei der Reflexion von Domänen auftreten, die NOT NULL enthalten, aktualisieren Sie auf PostgreSQL Server 17.3 oder höher.[postgresql] [bug] ¶
Problem bei PostgreSQL-Netzwerktypen
INET,CIDR,MACADDR,MACADDR8behoben, bei dem das Senden von Zeichenkettenwerten zum Vergleich mit diesen Typen eine explizite Umwandlung in VARCHAR ergab, was dazu führte, dass einige SQL-/Treiberkombinationen fehlschlugen. Pull-Request von Denis Laxalde.Referenzen: #12060
[postgresql] [bug] ¶
Compilerproblem im PostgreSQL-Dialekt behoben, bei dem falsche Schlüsselwörter übergeben wurden, wenn "FOR UPDATE OF" innerhalb einer Unterabfrage verwendet wurde.
Referenzen: #12417
sqlite¶
[sqlite] [bug] ¶
Problem behoben, das das Komma zwischen mehreren SQLite-Tabellenerweiterungsklauseln, aktuell
WITH ROWIDundSTRICT, wegließ, wenn beide OptionenTable.sqlite_with_rowidundTable.sqlite_strictgleichzeitig mit ihren nicht standardmäßigen Einstellungen konfiguriert waren. Pull-Request von david-fed.Referenzen: #12368
2.0.38¶
Veröffentlicht: 6. Februar 2025engine¶
[engine] [bug] ¶
Problem mit Ereignissen behoben, bei dem die mehrfache Aufrufung von
Engine.execution_options()auf eineEngineunter Verwendung von Ereignisregistrierungsparametern wieisolation_levelzu internen Fehlern bei der Ereignisregistrierung führte.Referenzen: #12289
sql¶
[sql] [bug] ¶
Die internen Mechanismen, durch die die `.c`-Sammlung auf einer
FromClausegeneriert wird, wurden neu organisiert, um gegen den gleichzeitigen Zugriff auf die Sammlung resistent zu sein. Ein Beispiel ist die Erstellung einesAliasoder einerSubqueryund der Zugriff darauf als Modulvariable. Dies betrifft den Oracle-Dialekt, der solche globalen Alias-Objekte auf Modulebene verwendet, ist aber auch allgemein nützlich.Referenzen: #12302
[sql] [bug] ¶
Problem mit der SQL-Komposition behoben, das das Caching beeinträchtigte, bei dem die Verwendung eines `None`-Werts innerhalb eines `in_()`-Ausdrucks die übliche "erweiterte Bindungsparameter"-Logik umging, die vom IN-Konstrukt verwendet wird und ein korrektes Caching ermöglicht.
Referenzen: #12314
postgresql¶
[postgresql] [usecase] [asyncio] ¶
Ein zusätzlicher Aufruf von `asyncio.shield()` wurde in den Verbindungstrennprozess des asyncpg-Treibers aufgenommen, um ein Problem zu mildern, bei dem die Trennung unter der anyio-Concurrency-Bibliothek nicht abgeschlossen werden konnte.
Referenzen: #12077
[postgresql] [bug] ¶
Der asynchronpg-Verbindungswrapper wurde angepasst, sodass der `connection.transaction()`-Aufruf an asyncpg `None` für `isolation_level` sendet, wenn dies nicht anders im SQLAlchemy-Dialekt/Wrapper eingestellt ist, wodurch asyncpg die serverseitige Einstellung für `isolation_level` in Abwesenheit einer clientseitigen Einstellung nutzen kann. Zuvor wurde dieses Verhalten von asyncpg durch ein fest kodiertes `read_committed` blockiert.
Referenzen: #12159
mariadb¶
[mariadb] [bug] [dml] [mysql] ¶
Fehler behoben, bei dem der MySQL-Anweisungskompilierer Anweisungen, bei denen
Insert.on_duplicate_key_update()Werte übergeben wurden, die ORM-zugeordnete Attribute (z. B. `InstrumentedAttribute`-Objekte) als Schlüssel enthielten, nicht korrekt kompilierte. Pull-Request von mingyu.Referenzen: #12117
sqlite¶
[sqlite] [bug] [aiosqlite] [asyncio] [pool] ¶
Standardverbindungspool des `aiosqlite`-Dialekts von `NullPool` auf `AsyncAdaptedQueuePool` geändert; diese Änderung hätte gemacht werden sollen, als 2.0 zum ersten Mal veröffentlicht wurde, da der `pysqlite`-Dialekt ähnlich zu `QueuePool` geändert wurde, wie in Der SQLite-Dialekt verwendet QueuePool für dateibasierte Datenbanken beschrieben.
Referenzen: #12285
2.0.37¶
Veröffentlicht: 9. Januar 2025orm¶
[orm] [bug] ¶
Problem mit `Union`-Typen behoben, die in der `registry.type_annotation_map` eines `registry` oder einer deklarativen Basisklasse vorhanden waren, bei denen ein `Mapped`-Element, das einen der Untertypen enthielt, die in dieser `Union` vorhanden waren, mit diesem Eintrag übereinstimmte und möglicherweise andere Einträge ignorierte, die exakt übereinstimmten. Das richtige Verhalten tritt nun ein, sodass ein Eintrag in `registry.type_annotation_map` nur exakt übereinstimmen sollte, da ein `Union`-Typ ein in sich geschlossener Typ ist. Zum Beispiel würde ein Attribut mit `Mapped[float]` zuvor mit einem `registry.type_annotation_map`-Eintrag `Union[float, Decimal]` übereinstimmen; dies wird nicht mehr übereinstimmen und wird nun nur noch mit einem Eintrag übereinstimmen, der `float` angibt. Pull-Request von Frazer McLean.
Referenzen: #11370
[orm] [bug] ¶
Fehler bei der Behandlung von Typ-Unionen in `registry.type_annotation_map` sowie in `Mapped` behoben, die das Nachschlageverhalten von `a | b` anders als das von `Union[a, b]` machte.
Referenzen: #11944
[orm] [bug] ¶
Konsistente Handhabung von `TypeAliasType` (definiert in PEP 695), die mit der Syntax `type X = int` erhalten wird, die in Python 3.12 eingeführt wurde. Nun muss in allen Fällen ein solcher Alias explizit zur Typzuordnung hinzugefügt werden, damit er innerhalb von `Mapped` verwendet werden kann. Diese Änderung überarbeitet auch den in `#11305` hinzugefügten Ansatz, der nun verlangt, dass `TypeAliasType` zur Typzuordnung hinzugefügt wird. Dokumentation zur Handhabung von Unionen und Typ-Alias-Typen durch SQLAlchemy wurde im Abschnitt Anpassung der Typenzuordnung der Dokumentation hinzugefügt.
Referenzen: #11955
[orm] [bug] ¶
Regression behoben, die durch eine interne Codeänderung als Reaktion auf neuere Mypy-Versionen verursacht wurde und den sehr ungewöhnlichen Fall, dass eine Liste von ORM-zugeordneten Attributausdrücken an `ColumnOperators.in_()` übergeben wurde, nicht mehr akzeptierte.
Referenzen: #12019
[orm] [bug] ¶
Probleme bei der Typbehandlung innerhalb des `registry.type_annotation_map`-Features behoben, die die Verwendung von Unionen (sowohl mit Pep-604- als auch mit `Union`-Syntaxen im Zukunft-Annotationen-Modus) mit mehreren generischen Typen als Elementen an einer korrekten Auflösung hinderten.
Referenzen: #12207
[orm] [bug] ¶
Problem im Ereignissystem behoben, das verhinderte, dass ein Ereignis-Listener an mehrere klassenartige Objekte angehängt und von ihnen gelöst wurde, nämlich die Ziele `sessionmaker` oder `scoped_session`, die an `Session`-Unterklassen zugewiesen werden.
Referenzen: #12216
sql¶
[sql] [bug] ¶
Problem im "Lambda SQL"-Feature behoben, bei dem die Verfolgung von gebundenen Parametern beschädigt werden konnte, wenn dasselbe Lambda über mehrere Kompilierungsphasen ausgewertet wurde, auch bei Verwendung desselben Lambdas über mehrere Engine-Instanzen hinweg oder bei deaktiviertem Statement-Caching.
Referenzen: #12084
postgresql¶
[postgresql] [usecase] ¶
Der `Range`-Typ unterstützt nun `Range.__contains__()`. Pull-Request von Frazer McLean.
Referenzen: #12093
[postgresql] [bug] ¶
Problem mit `Dialect.get_multi_indexes()` im PostgreSQL-Dialekt behoben, bei dem ein Fehler auftrat, wenn versucht wurde, Alembic mit einem Vektorindex aus der pgvecto.rs-Erweiterung zu verwenden.
Referenzen: #11724
[postgresql] [bug] ¶
Problem behoben, bei dem das Erstellen einer Tabelle mit einer Primärspalte vom Typ `SmallInteger` und der Verwendung des asyncpg-Treibers dazu führte, dass der Typ zu `SERIAL` statt `SMALLSERIAL` kompiliert wurde.
Referenzen: #12170
[postgresql] [bug] ¶
Der asyncpg-Dialekt wurde angepasst, sodass eine leere SQL-Zeichenkette, die für PostgreSQL Server gültig ist, auf Dialektebene erfolgreich verarbeitet werden kann, z. B. bei der Verwendung von `Connection.exec_driver_sql()`. Pull-Request von Andrew Jackson.
Referenzen: #12220
mysql¶
[mysql] [usecase] [mariadb] ¶
Unterstützung für die `LIMIT`-Klausel bei `DELETE` für die Dialekte MySQL und MariaDB hinzugefügt, um die bereits vorhandene Option für `UPDATE` zu ergänzen. Die Methode `Delete.with_dialect_options()` des `delete()`-Konstrukts akzeptiert Parameter für `mysql_limit` und `mariadb_limit`, wodurch Benutzer eine Begrenzung der gelöschten Zeilen angeben können. Pull-Request von Pablo Nicolás Estevez.
Referenzen: #11764
[mysql] [bug] [mariadb] ¶
Logik hinzugefügt, um sicherzustellen, dass die Parameter `mysql_limit` und `mariadb_limit` von `Update.with_dialect_options()` und `Delete.with_dialect_options()` beim Kompilieren zu Strings nur dann kompiliert werden, wenn der Parameter als Ganzzahl übergeben wird; andernfalls wird ein `ValueError` ausgelöst.
mariadb¶
sqlite¶
oracle¶
[oracle] [funktion] ¶
Neue Tabellenoption
oracle_tablespacehinzugefügt, um die OptionTABLESPACEbeim Erstellen einer Tabelle in Oracle anzugeben. Dies ermöglicht Benutzern die Definition des Tablespace, in dem die Tabelle erstellt werden soll. Pull-Request von Miguel Grillo.Referenzen: #12016
[oracle] [anwendungsfall] ¶
Das Verbindungsattribut
max_identifier_length, das in oracledb ab Version 2.5 verfügbar ist, wird bei der Bestimmung der Bezeichnerlänge im Oracle-Dialekt verwendet.Referenzen: #12032
[oracle] [fehler] ¶
Kompilierung der Funktion
TABLEkorrigiert, wenn sie in einerFROM-Klausel im Oracle Database-Dialekt verwendet wird.Referenzen: #12100
[oracle] [fehler] ¶
Problem in den Dialekten oracledb / cx_oracle behoben, bei dem Ausgabetyp-Handler für
CLOBanNVARCHARstatt anVARCHARweitergeleitet wurden, was zu einer doppelten Konvertierung führte.Referenzen: #12150
2.0.36¶
Veröffentlicht: 15. Oktober 2024orm¶
[orm] [anwendungsfall] ¶
Neuer Parameter
mapped_column.hashzu ORM-Konstrukten wiesqlalchemy.orm.mapped_column(),sqlalchemy.orm.relationship()usw. hinzugefügt, der für ORM Native Dataclasses genauso interpretiert wird wie andere datenklassen-spezifische Feldparameter.Referenzen: #11923
[orm] [fehler] ¶
Fehler bei der ORM-Massenaktualisierung/-löschung behoben, bei der die Verwendung von RETURNING mit Massenaktualisierung/-löschung in Kombination mit
populate_existingdie Optionpopulate_existingnicht berücksichtigen konnte.Referenzen: #11912
[orm] [fehler] ¶
Aufbauend auf #11912 werden Spalten, die mit
mapped_column.onupdate,mapped_column.server_onupdateoderComputedgekennzeichnet sind, nun in ORM-Instanzen aktualisiert, wenn ein ORM-fähiges UPDATE mit WHERE-Kriterien ausgeführt wird, auch wenn die Anweisung kein RETURNING oderpopulate_existingverwendet.Referenzen: #11917
[orm] [fehler] ¶
Regressionsfehler behoben, der durch Korrekturen am gestaffelten Eager Loading in #11449, veröffentlicht in 2.0.31, entstanden war, bei dem ein bestimmter Fall von joinedload nicht korrekt geprüft werden konnte. Wir haben nun ein Beispiel für diesen Fall, sodass die Überprüfung repariert wurde, um ihn zu ermöglichen.
Referenzen: #11965
[orm] [fehler] ¶
Verbesserte Fehlermeldung, die ausgegeben wird, wenn versucht wird, eine Klasse als Datenklasse zu mappen und gleichzeitig manuell das Attribut
__table__anzugeben. Diese Verwendung wird derzeit nicht unterstützt.Referenzen: #11973
[orm] [fehler] ¶
Die Prüfung, die der ORM-Lazy-Loader verwendet, um „dies würde eine Ladung nach Primärschlüssel sein und der Primärschlüssel ist NULL, Ladung überspringen“ zu erkennen, wurde verfeinert, um die aktuelle Einstellung für den Parameter
Mapper.allow_partial_pkszu berücksichtigen. Wenn dieser ParameterFalseist, sollte auch ein zusammengesetzter PK-Wert mit teilweisen NULL-Elementen übersprungen werden. Dies kann für einige zusammengesetzte überlappende Fremdschlüsselkonfigurationen gelten.Referenzen: #11995
[orm] [fehler] ¶
Fehler in der ORM-Funktion „Update mit WHERE-Klausel“ behoben, bei der ein explizites
.returning()die „fetch“-Synchronisierungsstrategie beeinträchtigte, aufgrund einer Annahme, dass die ORM-gemappte Klasse die Primärschlüsselspalten an einer bestimmten Position innerhalb von RETURNING enthielt. Dies wurde behoben, um die entsprechende ORM-Spaltenausrichtung zu verwenden.Referenzen: #11997
sql¶
[sql] [anwendungsfall] ¶
Binärbasierte Datentypen wie
VARBINARYwerden beim Aufruf der MethodeTypeEngine.as_generic()zuLargeBinaryaufgelöst.Referenzen: #11978
[sql] [fehler] [regression] ¶
Regression aus 1.4 behoben, bei der einige Datentypen, wie z. B. von
TypeDecoratorabgeleitete, nicht gepickelt werden konnten, wenn sie Teil einer größeren SQL-Ausdruckskomposition waren, da die internen unterstützenden Strukturen selbst nicht pickelbar waren.Referenzen: #12002
schema¶
[schema] [fehler] ¶
Fehler behoben, bei dem SQL-Funktionen, die an
Column.server_defaultübergeben wurden, nicht mit der spezifischen Klammerung gerendert wurden, die neuere Versionen von MySQL und MariaDB erfordern. Pull-Request von huuya.Referenzen: #11317
postgresql¶
[postgresql] [fehler] [reflection] ¶
Fehler bei der Reflexion von Tabellenkommentaren behoben, bei dem nicht zusammenhängender Text zurückgegeben wurde, wenn ein Eintrag in der Tabelle
pg_descriptionzufällig die gleiche oid (objoid) wie die zu reflektierende Tabelle teilte.Referenzen: #11961
[postgresql] [fehler] ¶
Die Datentypen
JSONundJSONBrendern nun in allen Fällen einen „Bind-Cast“ für alle PostgreSQL-Backends, einschließlich psycopg2, während dies zuvor nur für einige Backends aktiviert war. Dies ermöglicht eine höhere Genauigkeit, indem dem Datenbankserver ermöglicht wird, zu erkennen, wann ein Zeichenfolgenwert als JSON interpretiert werden soll.Referenzen: #11994
mysql¶
[mysql] [performance] ¶
Eine Abfrage für das MySQL 8-Backend zur Reflexion von Fremdschlüsseln wurde zur besseren Optimierung verbessert. Zuvor konnte die Abfrage für eine Datenbank mit Millionen von Spalten über alle Tabellen hinweg prohibitiv langsam sein; die Abfrage wurde überarbeitet, um vorhandene Indizes besser zu nutzen.
Referenzen: #11975
2.0.35¶
Veröffentlicht: 16. September 2024orm¶
[orm] [fehler] [typing] ¶
Problem behoben, bei dem
typing.LiteralmitMapped[]unter Python 3.8 und 3.9 nicht verwendet werden konnte. Pull-Request von Frazer McLean.Referenzen: #11820
[orm] [fehler] ¶
Problem im ORM-Evaluator behoben, bei dem zwei Datentypen, die mit dem SQL-Konkatenator-Operator ausgewertet wurden, nicht auf
UnevaluatableErrorbasierend auf ihrem Datentyp geprüft wurden; dies übersah den Fall, dassJSONB-Werte in einer Konkatenationsoperation verwendet wurden, die von PostgreSQL unterstützt wird, sowie wie SQLAlchemy die SQL für diese Operation rendert, aber auf Python-Ebene nicht funktioniert. Durch die Implementierung vonUnevaluatableErrorfür diese Kombination fallen ORM-Update-Anweisungen nun auf „expire“ zurück, wenn ein verknüpfter JSON-Wert, der in einer SET-Klausel verwendet wird, mit einem Python-Objekt synchronisiert werden soll.Referenzen: #11849
[orm] [fehler] ¶
Eine Warnung wird ausgegeben, wenn
joinedload()odersubqueryload()als oberste Option gegen eine Anweisung verwendet werden, die keine SELECT-Anweisung ist, z. B. mit eineminsert().returning(). Bei INSERT-Anweisungen gibt es keine JOINs, noch gibt es eine „Subquery“, die für Subquery Eager Loading wiederverwendet werden kann, und für UPDATE/DELETE unterstützen joinedload dies ebenfalls nicht, sodass diese Verwendung niemals stillschweigend akzeptabel ist.Referenzen: #11853
[orm] [fehler] ¶
Problem behoben, bei dem die Verwendung von Loader-Optionen wie
selectinload()mit zusätzlichen Kriterien in Kombination mit ORM DML wieinsert()mit RETURNING interne Kontexte, die für das korrekte Funktionieren des Caching erforderlich sind, nicht korrekt eingerichtet hat, was zu falschen Ergebnissen führte.Referenzen: #11855
mysql¶
[mysql] [fehler] ¶
Problem im mariadbconnector-Dialekt behoben, bei dem Abfragezeichenfolgenargumente, die keine Integer- oder Booleschen Argumente waren, ignoriert wurden, wie z. B. Zeichenfolgenargumente wie
unix_socketusw. Als Teil dieser Änderung wurde die Argumentenanalyse für bestimmte Elemente wieclient_flags,compress,local_infileüber alle MySQL / MariaDB-Dialekte hinweg konsistenter gestaltet, die jedes Argument akzeptieren. Pull-Request von Tobias Alex-Petersen.Referenzen: #11870
sqlite¶
[sqlite] [fehler] [regression] ¶
Die Änderungen an der Reflexion von SQLite CHECK-Constraints in den Versionen 2.0.33 und 2.0.34 (#11832 und #11677) wurden nun vollständig rückgängig gemacht, da Benutzer weiterhin Anwendungsfälle identifizierten, die nach dieser Änderung nicht mehr funktionierten. Derzeit, da SQLite keine konsistente Methode zur Bereitstellung von Informationen über CHECK-Constraints bietet, ist SQLAlchemy in Bezug auf die zu reflektierenden CHECK-Constraint-Syntaxen eingeschränkt, einschließlich der Tatsache, dass ein CHECK-Constraint in einer einzigen, unabhängigen Zeile (oder inline bei einer Spaltendefinition) ohne Zeilenumbrüche, Tabs in der Constraint-Definition oder ungewöhnliche Zeichen im Constraint-Namen angegeben werden muss. Insgesamt ist die Reflexion für SQLite darauf ausgelegt, CREATE TABLE-Anweisungen reflektieren zu können, die ursprünglich von SQLAlchemy DDL-Konstrukten erstellt wurden. Langfristige Arbeiten an einem DDL-Parser, der nicht auf regulären Ausdrücken basiert, können diese Situation möglicherweise verbessern. Eine breite Palette zusätzlicher übergreifender CHECK-Constraint-Reflexionstests wurde hinzugefügt, da es auch ein Fehler war, dass diese Änderungen keine vorhandenen Tests ausgelöst haben.
Referenzen: #11840
2.0.34¶
Veröffentlicht: 4. September 2024orm¶
[orm] [fehler] ¶
Regressionsfehler behoben, der durch Problem #11814 entstanden war und die Unterstützung für bestimmte Varianten von PEP 593
Annotatedin der type_annotation_map brach, wenn eingebaute Typen wielist,dictohne Elementtyp verwendet wurden. Obwohl dies ein unvollständiger Tippstil ist, wurden diese Typen dennoch zuvor korrekt in der type_annotation_map gefunden.Referenzen: #11831
sqlite¶
[sqlite] [fehler] ¶
Regressionsfehler in der SQLite-Reflexion behoben, der durch #11677 verursacht wurde und die Reflexion von CHECK-Constraints beeinträchtigte, die von anderen Arten von Constraints innerhalb derselben Tabellendefinition gefolgt wurden. Pull-Request von Harutaka Kawamura.
Referenzen: #11832
2.0.33¶
Veröffentlicht: 3. September 2024general¶
[general] [änderung] ¶
Die Einschränkung für
setuptools<69.3inpyproject.tomlwurde entfernt. Diese Einschränkung sollte eine plötzliche Änderung in setuptools verhindern, PEP 625 zu verwenden, die den Dateinamen der SQLAlchemy-Quelldistribution auf PyPI zu einem kleingeschriebenen Namen ändern würde, was wahrscheinlich Probleme mit verschiedenen Build-Umgebungen verursachen würde, die den früheren Benennungsstil erwarteten. Die Anwesenheit dieser Einschränkung hält jedoch Umgebungen zurück, die ansonsten ein neueres setuptools verwenden möchten, daher haben wir uns entschieden, mit dieser Änderung fortzufahren, unter der Annahme, dass Build-Umgebungen die setuptools-Änderung inzwischen weitgehend angepasst haben.Referenzen: #11818
orm¶
[orm] [fehler] [regression] ¶
Regressionsfehler aus 1.3 behoben, bei dem der für eine Hybrid-Eigenschaft verwendete Spaltenschlüssel mit dem der zugrunde liegenden Spalte gefüllt werden konnte, die sie zurückgibt, für eine Eigenschaft, die direkt eine ORM-gemappte Spalte zurückgibt, anstatt des Schlüssels, der von der Hybrid-Eigenschaft selbst verwendet wird.
Diese Änderung wird auch zurückportiert nach: 1.4.54
Referenzen: #11728
[orm] [fehler] ¶
Die interne Modulregistrierung auf oberster Ebene wird korrekt aufgeräumt, wenn keine inneren Module oder Klassen darin registriert sind.
Referenzen: #11788
[orm] [fehler] ¶
Verbesserungen bei der ORM-Erkennung des annotierten deklarativen Typen-Maps, die zusammengesetzte Typen wie
dict[str, Any]mit oder ohne „future annotations“-Modus behandeln, die auf JSON (oder andere) verweisen.Referenzen: #11814
engine¶
sql¶
[sql] [fehler] [regression] ¶
Regressionsfehler in
Select.with_statement_hint()und anderen behoben, bei denen das generative Verhalten der Methode keine Kopie des Objekts mehr erzeugte.Referenzen: #11703
schema¶
[schema] [fehler] ¶
Fehler behoben, bei dem das
metadata-Element einesEnum-Datentyps nicht an das neueMetaData-Objekt übertragen wurde, wenn der Typ über eineTable.to_metadata()-Operation kopiert worden war, was zu inkonsistenten Verhaltensweisen innerhalb von Create/Drop-Sequenzen führte.Referenzen: #11802
typing¶
[typing] [fehler] ¶
Tippfehler mit
Select.with_only_columns()behoben.Referenzen: #11782
postgresql¶
[postgresql] [fehler] ¶
Kritischer Fehler im asyncpg-Treiber behoben, bei dem ein Rollback oder Commit, das speziell für die Bedingung
MissingGreenletoder einen anderen Fehler, der nicht von asyncpg selbst ausgelöst wird, fehlschlägt, die asyncpg-Transaktion in jedem Fall verwirft, obwohl die Transaktion noch idle war, was zu einem serverseitigen Zustand mit einer idle Transaktion führte, die dann zurück in den Connection-Pool gelangte. Die Flags für „Transaktion geschlossen“ werden nun für Fehler, die außerhalb von asyncpg selbst auftreten, nicht zurückgesetzt. Wenn asyncpg selbst einen Fehler für.commit()oder.rollback()auslöst, verwirft asyncpg diese Transaktion dann.Diese Änderung wird auch zurückportiert nach: 1.4.54
Referenzen: #11819
[postgresql] [fehler] ¶
Überarbeitung der Asyncpg-Korrektur
terminate(), die erstmals in #10717 vorgenommen wurde und die Ausfallsicherheit dieses Aufrufs unter allen Umständen verbesserte.asyncio.CancelledErrorwurde zur Liste der Ausnahmen hinzugefügt, die als Fehler für ein ordnungsgemäßes.close()abgefangen werden, welches dann.terminate()aufruft.Referenzen: #11821
mysql¶
[mysql] [fehler] ¶
Problem im MySQL-Dialekt behoben, bei dem die Verwendung von INSERT..FROM SELECT in Kombination mit ON DUPLICATE KEY UPDATE auf MySQL 8 und höher fälschlicherweise die Klausel „AS new“ rendert, was zu Syntaxfehlern führt. Diese Klausel ist auf MySQL 8 erforderlich, um der VALUES-Klausel zu folgen, wenn der Alias „new“ verwendet wird, ist aber nicht zulässig, einer FROM SELECT-Klausel zu folgen.
Referenzen: #11731
sqlite¶
[sqlite] [fehler] ¶
Verbesserungen am Regex des SQLite-Dialekts zur Reflexion des Namens und Inhalts eines CHECK-Constraints. Constraints mit Zeilenumbrüchen, Tabs oder Leerzeichen in sowohl dem Constraint-Text als auch dem Constraint-Namen werden nun korrekt reflektiert. Pull-Request von Jeff Horemans.
Referenzen: #11677
[sqlite] [fehler] ¶
Verbesserungen am Regex des SQLite-Dialekts zur Reflexion des Namens und Inhalts eines UNIQUE-Constraints, der inline innerhalb einer Spaltendefinition in einer SQLite CREATE TABLE-Anweisung definiert ist, unter Berücksichtigung von Tabulatorzeichen innerhalb der Spalten-/Constraint-Zeile. Pull-Request von John A Stevenson.
Referenzen: #11746
mssql¶
[mssql] [fehler] ¶
Fehler „The server failed to resume the transaction“ zur Liste der Fehlermeldungen für den pymssql-Treiber hinzugefügt, um ein Trennungsszenario zu ermitteln. Dies wurde von einem Benutzer beobachtet, der pymssql unter sonst unbekannten Bedingungen verwendete, da eine unbrauchbare Verbindung im Connection-Pool verblieb, die nicht ordnungsgemäß gepingt werden konnte.
Referenzen: #11822
tests¶
[tests] [fehler] ¶
Fehlendes
array_type-Attribut zur Testsuite-KlasseSuiteRequirementshinzugefügt.
2.0.32¶
Veröffentlicht: 5. August 2024general¶
[general] [fehler] [regression] ¶
Alte Klassennamen aus
sqlalalchemy.orm.collections.*wiederhergestellt, einschließlichMappedCollection,mapped_collection(),column_mapped_collection(),attribute_mapped_collection(). Pull-Request von Takashi Kajinami.Referenzen: #11435
orm¶
[orm] [anwendungsfall] ¶
Der Parameter
aliased.namefüraliased()kann nun mit dem Parameteraliased.flatkombiniert werden, was tabellenbezogene Namen basierend auf einer Namenspräfix-Konvention erzeugt. Pull Request von Eric Atkin.Referenzen: #11575
[orm] [bug] [regression] ¶
Behobene Regression seit 1.4, bei der der Zugriff auf eine Sammlung mit der „dynamischen“ Strategie auf einem transienten Objekt und der Versuch einer Abfrage einen internen Fehler auslöste, anstatt der erwarteten
NoResultFound, die in 1.3 auftrat.Diese Änderung wird auch **zurückportiert** nach: 1.4.53
Referenzen: #11562
[orm] [bug] ¶
Behobenes Problem, bei dem die Methoden
Query.enable_eagerloads()undQuery.yield_per()gleichzeitig verwendet wurden, um das direkt auf dem Mapper konfigurierte Eager Loading zu deaktivieren, diese ignoriert wurden, was zu Fehlern oder unerwarteter Eager-Befüllung von Attributen führte.Referenzen: #10834
[orm] [bug] [regression] ¶
Behobene Regression, die in 2.0.21 aufgrund von #10279 auftrat, bei der die Verwendung von
delete()oderupdate()auf eine ORM-Klasse, die die Basis einer Vererbungshierarchie ist, während gleichzeitig spezifiziert wird, dass Unterklassen polymorph geladen werden sollen, die polymorphen Joins in die UPDATE- oder DELETE-Anweisung leckte und falsche SQL erzeugte.Referenzen: #11625
[orm] [bug] [regression] ¶
Behobene Regression seit Version 1.4 in
Session.bulk_insert_mappings(), bei der die Verwendung des ParametersSession.bulk_insert_mappings.return_defaultsdie übergebenen Dictionaries nicht mit neu generierten Primärschlüsselwerten befüllte.Referenzen: #11661
[orm] ¶
Warnung hinzugefügt, die darauf hinweist, wenn ein
ConnectionEvents.engine_connect()Ereignis eine Transaktion offen lässt, was das Verhalten einerSession, die eine solche Engine als Bindung verwendet, ändern kann. Auf SQLAlchemy 2.1 wirdSession.join_transaction_modestattdessen in allen Fällen ignoriert, wenn die Session-Bindung eineEngineist.Referenzen: #11163
examples¶
[examples] [bug] ¶
Behobenes Problem im history_meta-Beispiel, bei dem die „version“-Spalte in der versionierten Tabelle beim INSERT standardmäßig die neueste Versionsnummer in der Verlaufstabelle haben muss, um dem Anwendungsfall einer Tabelle gerecht zu werden, bei der Zeilen gelöscht und dann durch neue Zeilen ersetzt werden, die dieselbe Primärschlüssel-Identität wiederverwenden. Diese Korrektur fügt pro INSERT eine zusätzliche SELECT-Abfrage in der Haupttabelle hinzu, was ineffizient sein kann; für Fälle, in denen Primärschlüssel nicht wiederverwendet werden, kann die Standardfunktion weggelassen werden. Patch von Philipp H. v. Loewenfeld.
Referenzen: #10267
engine¶
[engine] [bug] ¶
Behobenes Problem bei der „insertmanyvalues“-Funktion, bei der ein bestimmter Aufruf von
cursor.fetchall()nicht in die Ausnahmebehandlung von SQLAlchemy eingeschlossen war, was anscheinend eine Datenbankausnahme während des Abrufs auslösen kann, wenn pyodbc verwendet wird.Referenzen: #11532
sql¶
[sql] [bug] ¶
Nachverfolgung von #11471 zur Behebung eines Caching-Problems, bei dem die Verwendung der Methode
CompoundSelectState.add_cte()desCompoundSelectStateKonstrukts keinen korrekten Cache-Schlüssel gesetzt hat, der zwischen verschiedenen CTE-Ausdrücken unterschieden hätte. Außerdem wurden Tests hinzugefügt, die Probleme ähnlich dem in #11544 behobenen erkennen.Referenzen: #11471
[sql] [bug] ¶
Behobener Fehler, bei dem die Modifikatoren
Operators.nulls_first()undOperators.nulls_last()nicht auf die gleiche Weise wieOperators.desc()undOperators.asc()behandelt wurden, wenn bestimmt wurde, ob eine ORDER BY-Klausel gegen einen bereits in der Anweisung vorhandenen Label-Namen erfolgt. Alle vier Modifikatoren werden nun innerhalb von ORDER BY gleich behandelt.Referenzen: #11592
schema¶
[schema] [bug] ¶
Weitere Probleme im Ereignissystem behoben, die durch das Entpickeln eines
Enum-Datentyps ausgelöst wurden, fortsetzend von #11365 und #11360, bei denen dynamisch generierte Elemente der Ereignisstruktur beim Entpickeln in einem neuen Prozess nicht vorhanden waren.Referenzen: #11530
typing¶
[typing] [bug] ¶
Interne Typisierungsprobleme behoben, um die Kompatibilität mit mypy 1.11.0 herzustellen. Beachten Sie, dass dies keine Probleme einschließt, die mit dem veralteten mypy-Plugin für SQLAlchemy 1.4-Code aufgetreten sind. Siehe die zusätzliche Änderungsnotiz für dieses Plugin, die die überarbeitete Kompatibilität angibt.
mypy¶
[mypy] [bug] ¶
Das veraltete mypy-Plugin ist mit der neuesten Version von mypy 1.11.0 nicht mehr vollständig funktionsfähig, da Änderungen im mypy-Interpreter nicht mehr mit dem vom Plugin verwendeten Ansatz kompatibel sind. Wenn Code vom mypy-Plugin mit sqlalchemy2-stubs abhängt, wird empfohlen, mypy auf Versionen unterhalb der 1.11.0-Serie zu beschränken. Streben Sie ein Upgrade auf die 2.0-Serie von SQLAlchemy und die Migration zu modernen Typannotationen an.
Diese Änderung wird auch **zurückportiert** nach: 1.4.53
postgresql¶
[postgresql] [bug] ¶
Ein „SSL SYSCALL error: Success“-Fehler, der bei abnormaler Beendigung der SSL-Verbindung zu Postgres auftreten kann, wird nun als Pool-ungültiger Trennungsereignis betrachtet.
Referenzen: #11522
[postgresql] [bug] ¶
Behobenes Problem, bei dem der
collate()-Konstrukt, das explizit eine Sortierung für einen gegebenen Ausdruck festlegt, die Sortierungseinstellungen für das zugrundeliegende Typobjekt aus dem Ausdruck beibehielt, was dazu führte, dass SQL-Ausdrücke doppelte Sortierungen enthielten, wenn sie in weiteren Ausdrücken für bestimmte Dialekte verwendet wurden, die explizite Typumwandlungen rendern, wie z. B. asyncpg. Dascollate()-Konstrukt weist nun seinen eigenen Typ zu, um die neue Sortierung explizit einzuschließen, vorausgesetzt, es handelt sich um einen Zeilentyp.Referenzen: #11576
mysql¶
sqlite¶
mssql¶
oracle¶
[oracle] [usecase] ¶
API-Unterstützung für serverseitige Cursor für den asynchronen oracledb-Dialekt hinzugefügt, wodurch die Verwendung von
AsyncConnection.stream()und ähnlichen Stream-Methoden ermöglicht wird.Referenzen: #10820
[oracle] [usecase] ¶
Implementierung von Zwei-Phasen-Transaktionen für den oracledb-Dialekt. Historisch gesehen funktionierte diese Funktion nie mit dem cx_Oracle-Dialekt, aber jüngste Verbesserungen des oracledb-Nachfolgers machen dies nun möglich. Die Zwei-Phasen-Transaktions-API ist auf Core-Ebene über die Methode
Connection.begin_twophase()verfügbar.Referenzen: #11480
[oracle] [bug] ¶
Behobene Tabellenreflexion auf Oracle 10.2 und älter, wo Kompressionsoptionen nicht unterstützt wurden.
Referenzen: #11557
[oracle] [bug] [sqlite] ¶
Implementierung von bitweisen Operatoren für Oracle, die zuvor aufgrund einer nicht standardmäßigen Syntax dieser Datenbank nicht funktionierten. Oracles Unterstützung für bitweises „oder“ und „xor“ beginnt mit Serverversion 21. Außerdem wurde die Implementierung von „xor“ für SQLite repariert.
Als Teil dieser Änderung wurde die Testsuite für die Dialektkonformität um die Unterstützung für serverseitige bitweise Tests erweitert. Drittanbieter-Dialekt-Autoren sollten sich auf die neuen Methoden „supports_bitwise“ in der Datei requirements.py beziehen, um diese Tests zu aktivieren.
Referenzen: #11663
2.0.31¶
Veröffentlicht: 18. Juni 2024general¶
[general] [bug] ¶
Vollständige Python 3.13-Unterstützung im weitestgehenden möglichen Umfang eingerichtet, wobei Probleme in internen Sprachhelfern sowie im Serialisierungs-Erweiterungsmodul behoben wurden.
Für Version 1.4 werden auch die „extras“-Namen in setup.cfg modernisiert, um Bindestriche und keine Unterstriche für zweistellige Namen zu verwenden. Unterstrichene Namen sind weiterhin vorhanden, um potenzielle Kompatibilitätsprobleme zu berücksichtigen.
Diese Änderung wird auch **zurückportiert** nach: 1.4.53
Referenzen: #11417
[general] [bug] ¶
Vollständige Python 3.13-Unterstützung im weitestgehenden möglichen Umfang eingerichtet, wobei Probleme in internen Sprachhelfern sowie im Serialisierungs-Erweiterungsmodul behoben wurden.
Referenzen: #11417
orm¶
[orm] [usecase] ¶
Fehlender Parameter
with_polymorphic.namehinzugefügt, der die Benennung der zurückgegebenenAliasedClassermöglicht.Referenzen: #11361
[orm] [bug] ¶
Behobenes Problem, bei dem eine
MetaData-Sammlung nicht serialisierbar war, wenn einEnum- oderBoolean-Datentyp vorhanden war, der angepasst worden war. Dieses spezifische Szenario konnte wiederum auftreten, wennEnumoderBooleaninnerhalb der ORM Annotated Declarative Form verwendet wurden, wo Typobjekte häufig kopiert werden.Referenzen: #11365
[orm] [bug] ¶
Behobenes Problem, bei dem die Loader-Optionen
selectinload()undsubqueryload()keine Wirkung zeigten, wenn sie auf eine geerbte Unterklasse angewendet wurden, die selbst eine unterklassenspezifischeMapper.with_polymorphic-Einstellung enthielt.Referenzen: #11446
[orm] [bug] ¶
Behobenes sehr altes Problem mit dem Parameter
joinedload.innerjoin, bei dem die Verwendung dieses Parameters in einer Abfrage, die auch joined eager loads entlang einer selbstreferenziellen oder anderen zyklischen Beziehung enthielt, zusammen mit komplizierenden Faktoren wie inner joins für Sekundärtabellen usw., die Chance hatte, einen bestimmten inner join an die falsche Stelle der Abfrage einzufügen. Zusätzlicher Zustand wurde in die interne Methode, die diese Einfügung vornimmt, aufgenommen, um eine bessere Entscheidung darüber zu treffen, wo die Einfügung erfolgen soll.Referenzen: #11449
[orm] [bug] [regression] ¶
Behobener Fehler in ORM Declarative, bei dem die Direktive
__table__nicht als Klassenfunktion mitdeclared_attr()auf einer Oberklasse, einschließlich einer__abstract__-Klasse sowie der deklarativen Basis selbst, deklariert werden konnte. Dies war eine Regression seit 1.4, wo dies funktionierte, und es gab anscheinend keine Tests für diesen speziellen Anwendungsfall.Referenzen: #11509
engine¶
[engine] [usecase] ¶
Die interne Darstellung zur Anpassung von AsyncIO-Aufrufen an Greenlets wurde geändert, um eine Duck-Typing-Kompatibilität mit Drittanbieterbibliotheken zu ermöglichen, die SQLAlchemy's „Greenlet-to-AsyncIO“-Muster direkt implementieren. Das Ausführen von Code innerhalb eines Greenlets, das das Attribut
__sqlalchemy_greenlet_provider__ = Trueaufweist, erlaubt direkte Aufrufe ansqlalchemy.util.await_only().Diese Änderung wird auch **zurückportiert** nach: 1.4.53
sql¶
[sql] [bug] ¶
Behobenes Caching-Problem, bei dem die Verwendung der Methode
TextualSelect.add_cte()desTextualSelectKonstrukts keinen korrekten Cache-Schlüssel gesetzt hat, der zwischen verschiedenen CTE-Ausdrücken unterschieden hätte.Diese Änderung wird auch **zurückportiert** nach: 1.4.53
Referenzen: #11471
[sql] [bug] ¶
Behobenes Problem beim Serialisieren einer
over()-Klausel mit unbegrenztem Bereich oder Zeilen.Referenzen: #11422
[sql] [bug] ¶
Fehlende Methoden
FunctionFilter.within_group()undWithinGroup.filter()hinzugefügtReferenzen: #11423
[sql] [bug] ¶
Behobener Fehler in
FunctionFilter.filter(), der die vorhandene Funktion inplace mutierte. Sie verhält sich nun wie der Rest der SQLAlchemy-API und gibt eine neue Instanz zurück, anstatt die ursprüngliche zu mutieren.Referenzen: #11426
schema¶
[schema] [usecase] ¶
Column.insert_defaultals Alias vonColumn.defaultfür Kompatibilität mitmapped_column()hinzugefügt.Referenzen: #11374
mysql¶
2.0.30¶
Veröffentlicht: 5. Mai 2024orm¶
[orm] [bug] ¶
Neues Attribut
ORMExecuteState.is_from_statementhinzugefügt, um Anweisungen zu erkennen, die mitSelect.from_statement()erstellt wurden, undFromStatementerweitert, umORMExecuteState.is_select,ORMExecuteState.is_insert,ORMExecuteState.is_updateundORMExecuteState.is_deleteentsprechend dem Element zu setzen, das an die MethodeSelect.from_statement()übergeben wird.Referenzen: #11220
[orm] [bug] ¶
Behobenes Problem in der Loader-Option
selectin_polymorphic(), bei der Attribute, die mitcomposite()auf einer Oberklasse definiert wurden, beim Laden einen internen Fehler verursachten.Referenzen: #11291
[orm] [bug] [regression] ¶
Behobene Regression seit 1.4, bei der die Verwendung von
defaultload()in Verbindung mit einem nicht propagierenden Loader wiecontains_eager()dennoch diecontains_eager()für eine Lazy-Load-Operation propagierte, was zu fehlerhaften Abfragen führte, da diese Option nur von einer ursprünglichen Ladung stammen sollte.Referenzen: #11292
[orm] [bug] ¶
Behobenes Problem in ORM Annotated Declarative, bei dem ein Tippfehler dazu führte, dass Literale, die mit PEP 695 Typ-Aliassen definiert wurden, nicht mit der Inferenz von
Enum-Datentypen funktionierten. Pull Request von Alc-Alc.Referenzen: #11305
[orm] [bug] ¶
Behobenes Problem bei der
selectin_polymorphic()Ladeoption, bei der die generierte SELECT-Anweisung nur für die unterste Klasse unter den zurückgegebenen Ergebniszeilen Platz bot. Dies führte dazu, dass Attribute von Zwischenklassen entladen wurden, wenn keine konkreten Instanzen dieser Zwischenklasse im Ergebnis vorhanden waren. Dieses Problem trat nur bei mehrstufigen Vererbungshierarchien auf.Referenzen: #11327
[orm] [bug] ¶
Behobenes Problem bei
Session.bulk_save_objects(), bei dem die Form des Identitätsschlüssels bei Verwendung vonreturn_defaults=Trueinkorrekt war. Dies konnte zu Fehlern beim Pickling sowie zu Abweichungen in der Identitätszuordnung führen.Referenzen: #11332
[orm] [bug] ¶
Behobenes Problem, bei dem die Attributschlüsselnamen in
Bundlebei Verwendung von ORM-aktiviertemselectim Gegensatz zuQuerynicht korrekt waren, wenn die Anweisung doppelte Spaltennamen enthielt.Referenzen: #11347
engine¶
[engine] [bug] ¶
Behobenes Problem bei der Option
Connection.execution_options.logging_token, bei der das Ändern des Werts vonlogging_tokenbei einer Verbindung, die bereits Nachrichten protokolliert hatte, nicht aktualisiert wurde, um den neuen Protokollierungstoken widerzuspiegeln. Dies verhinderte insbesondere die Verwendung vonSession.connection()zum Ändern der Option bei der Verbindung, da die BEGIN-Protokollierungsnachricht bereits ausgegeben worden war.Referenzen: #11210
[engine] [bug] ¶
Behobenes Problem bei der Cursor-Behandlung, das die Behandlung von doppelten
Columnoder ähnlichen Objekten in der Spaltenklausel vonselect()betraf, sowohl in Kombination mit beliebigentext()-Klauseln in der SELECT-Liste als auch beim Versuch,Result.mappings()für das Objekt abzurufen, was zu einem internen Fehler geführt hätte.Referenzen: #11306
typing¶
[typing] [bug] [regression] ¶
Behobene Tippfehler-Regression, die durch #11055 in Version 2.0.29 verursacht wurde. Diese fügte
ParamSpeczu denrun_sync()-Methoden für asyncio hinzu, was bei Verwendung vonAsyncConnection.run_sync()mitMetaData.reflect()zu einem Fehler bei mypy führte, aufgrund eines mypy-Problems. Pull Request von Francisco R. Del Roio.Referenzen: #11200
[typing] [bug] ¶
Behobenes Problem bei der Typisierung von
Bundle, bei dem die Erstellung einer verschachteltenBundle-Struktur nicht erlaubt war.
misc¶
[bug] [test] ¶
Sichergestellt, dass die Variable
PYTHONPATHkorrekt initialisiert wird, wennsubprocess.runin den Tests verwendet wird.Referenzen: #11268
[bug] [installation] ¶
Behobene interne Klasse, die auf unerwartete Attribute prüfte, um unter dem kommenden Python 3.13 korrekt zu funktionieren. Pull Request von Edgar Ramírez-Mondragón.
Referenzen: #11334
2.0.29¶
Veröffentlicht: 23. März 2024orm¶
[orm] [usecase] ¶
Unterstützung für den PEP 695
TypeAliasType-Konstrukt sowie das native Python 3.12type-Schlüsselwort hinzugefügt, um mit der ORM Annotated Declarative Form zu arbeiten. Dies ermöglicht die Verknüpfung mit einem PEP 593Annotated-Container, was die Auflösung vonAnnotatedermöglicht, wenn diese Konstrukte in einemMapped-Typcontainer verwendet werden.Referenzen: #11130
[orm] [bug] ¶
Behobenes Deklarationsproblem, bei dem die Typisierung einer Beziehung mit
Relationshipanstelle vonMappedunbeabsichtigt die "dynamische" Beziehungs-Ladefunktion für dieses Attribut zog.Referenzen: #10611
[orm] [bug] ¶
Behobenes Problem bei ORM-annotierter Deklaration, bei dem die Verwendung von
mapped_column()mit einer Einstellung vonmapped_column.indexodermapped_column.uniqueauf False durch ein eingehendesAnnotated-Element überschrieben wurde, das diesen Parameter aufTruegesetzt hatte, obwohl das unmittelbaremapped_column()-Element spezifischer ist und Vorrang haben sollte. Die Logik zur Abgleichung der Booleans wurde verbessert, um einem lokalen Wert vonFalseVorrang vor einem eingehendenTrue-Wert aus dem annotierten Element zu geben.Referenzen: #11091
[orm] [bug] [regression] ¶
Behobene Regression aus Version 2.0.28, die durch die Behebung von #11085 verursacht wurde, bei der die neuere Methode zur Anpassung von nach dem Cache gebundenen Parameterwerten die Implementierung für die
subqueryload()Ladeoption beeinträchtigte. Diese hatte einige ältere Muster intern in Verwendung, wenn die zusätzlichen Lade-Kriterien-Features mit dieser Ladeoption verwendet wurden.Referenzen: #11173
engine¶
[engine] [bug] ¶
Behobenes Problem bei der Funktion "Insert Many Values"-Verhalten für INSERT-Anweisungen, bei der die Verwendung einer Primärschlüsselspalte mit einem "Inline Execute"-Standardgenerator wie einer expliziten
Sequencemit einem expliziten Schemanamen, während gleichzeitig die FunktionConnection.execution_options.schema_translate_mapverwendet wurde, dazu führte, dass die Sequenz oder die Parameter nicht richtig gerendert wurden, was zu Fehlern führte.Referenzen: #11157
[engine] [bug] ¶
Änderung der in Version 2.0.10 vorgenommenen Anpassung für #9618, die das Verhalten der Abgleichung von RETURNING-Zeilen von einem Massen-INSERT mit den übergebenen Parametern hinzufügte. Dieses Verhalten beinhaltete einen Vergleich von bereits von der Datenbank konvertierten gebundenen Parameterwerten mit zurückgegebenen Zeilenwerten, der nicht immer "symmetrisch" für SQL-Spaltentypen wie UUIDs war, abhängig von den spezifischen Details, wie verschiedene DBAPIs solche Werte empfangen im Vergleich dazu, wie sie sie zurückgeben. Dies erforderte die Notwendigkeit zusätzlicher "Sentinel-Wert-Resolver"-Methoden für diese Spaltentypen. Leider brach dies Drittanbieter-Spaltentypen wie UUID/GUID-Typen in Bibliotheken wie SQLModel, die diese spezielle Methode nicht implementierten, und löste den Fehler "Can’t match sentinel values in result set to parameter sets" aus. Anstatt zu versuchen, dieses Implementierungsdetail der "insertmanyvalues"-Funktion weiter zu erklären und zu dokumentieren, einschließlich einer öffentlichen Version der neuen Methode, wird der Ansatz stattdessen überarbeitet, sodass dieser zusätzliche Konvertierungsschritt nicht mehr erforderlich ist. Die Logik, die den Vergleich durchführt, arbeitet nun mit dem vor der Konvertierung gebundenen Parameterwert im Vergleich zum nach der Verarbeitung des Ergebnisses stehenden Wert, der immer vom gleichen Datentyp sein sollte. In dem ungewöhnlichen Fall, dass ein benutzerdefinierter SQL-Spaltentyp, der zufällig auch in einer "Sentinel"-Spalte für Massen-INSERT verwendet wird, nicht denselben Werttyp empfängt und zurückgibt, wird der Fehler "Can’t match" ausgelöst. Die Abhilfe ist jedoch einfach: derselbe Python-Datentyp sollte als der zurückgegebene übergeben werden.
Referenzen: #11160
sql¶
[sql] [bug] [regression] ¶
Behobene Regression aus der 1.4-Serie, bei der die Umstrukturierung der Methode
TypeEngine.with_variant(), die unter „with_variant()“ klont die ursprüngliche TypeEngine anstelle des Änderns des Typs eingeführt wurde, die Methode.copy()nicht berücksichtigte, was die eingerichteten Variantenzuordnungen verlieren würde. Dies wird zu einem Problem für den sehr spezifischen Fall eines "Schema"-Typs, der Typen wieEnumundARRAYumfasst, wenn sie dann im Kontext einer ORM Declarative-Zuordnung mit Mixins verwendet werden, bei denen das Kopieren von Typen eine Rolle spielt. Die Variantenzuordnung wird nun ebenfalls kopiert.Referenzen: #11176
typing¶
postgresql¶
[postgresql] [usecase] ¶
Das PostgreSQL-Dialekt gibt nun
DOMAIN-Instanzen zurück, wenn eine Spalte mit einem Domänentyp reflektiert wird. Zuvor wurde der Domänen-Datentyp zurückgegeben. Als Teil dieser Änderung wurde die Domänenreflexion verbessert, um auch die Kollation der Texttypen zurückzugeben. Pull Request von Thomas Stephenson.Referenzen: #10693
tests¶
[tests] [bug] ¶
Zurückportierung einer Verbesserung der Testsuite auf SQLAlchemy 2.0 bezüglich der Ausführung von asyncio-bezogenen Tests. Nun wird der neuere Python 3.11
asyncio.Runneroder ein zurückportiertes Äquivalent verwendet, anstatt sich auf die vorherige Implementierung basierend aufasyncio.get_running_loop()zu verlassen. Dies soll hoffentlich Probleme bei großen Testlauf-Suiten auf CPU-belasteter Hardware verhindern, bei denen die Ereignisschleife beschädigt zu werden scheint, was zu kaskadierenden Fehlern führt.Referenzen: #11187
2.0.28¶
Veröffentlicht: 4. März 2024orm¶
[orm] [bug] [regression] ¶
Behobene Regression, die durch #9779 verursacht wurde, bei der die Verwendung der "sekundären" Tabelle in einem Beziehungs-Ausdruck
and_()fehlschlug, diese zu aliasieren, um sie an die Art und Weise anzupassen, wie die "sekundäre" Tabelle normalerweise in einemSelect.join()-Ausdruck gerendert wird, was zu einer ungültigen Abfrage führte.Referenzen: #11010
[orm] [bug] [performance] [regression] ¶
Angepasste Korrektur aus #10570, veröffentlicht in 2.0.23, bei der neue Logik zur Abgleichung möglicherweise sich ändernder gebundener Parameterwerte über Cache-Schlüssel-Generationen hinweg hinzugefügt wurde, die innerhalb des
with_expression()-Konstrukts verwendet werden. Die neue Logik ändert den Ansatz, wie die neuen gebundenen Parameterwerte der Anweisung zugeordnet werden, und vermeidet die Notwendigkeit, die Anweisung tief zu kopieren, was zu einer erheblichen Leistungsbeeinträchtigung bei sehr tiefen/komplexen SQL-Konstrukten führen kann. Der neue Ansatz erfordert diesen Schritt des tiefen Kopierens nicht mehr.Referenzen: #11085
engine¶
[engine] [usecase] ¶
Neue Kern-Ausführungsoption
Connection.execution_options.preserve_rowcounthinzugefügt. Wenn diese gesetzt ist, wird das Attributcursor.rowcountdes DBAPI-Cursors bei der Anweisungsausführung bedingungslos gespeichert, so dass der vom DBAPI für jede Art von Anweisung angebotene Wert über das AttributCursorResult.rowcountdesCursorResultverfügbar ist. Dies ermöglicht den Zugriff auf rowcount für Anweisungen wie INSERT und SELECT, soweit dies vom verwendeten DBAPI unterstützt wird. Das "Insert Many Values"-Verhalten für INSERT-Anweisungen unterstützt ebenfalls diese Option und stellt sicher, dassCursorResult.rowcountfür einen Massen-INSERT von Zeilen korrekt gesetzt wird, wenn diese Option gesetzt ist.Referenzen: #10974
asyncio¶
[asyncio] [bug] ¶
Es wird ein Fehler ausgelöst, wenn eine
QueuePooloder eine andere nicht-asyncio-Poolklasse ancreate_async_engine()übergeben wird. Diese Engine akzeptiert nur asyncio-kompatible Poolklassen, einschließlichAsyncAdaptedQueuePool. Andere Poolklassen wieNullPoolsind sowohl mit synchronen als auch mit asynchronen Engines kompatibel, da sie keine Sperren durchführen.Referenzen: #8771
tests¶
[tests] [change] ¶
Die Pytest-Unterstützung in der Datei tox.ini wurde aktualisiert, um Pytest 8.1 zu unterstützen.
2.0.27¶
Veröffentlicht: 13. Februar 2024postgresql¶
[postgresql] [bug] [regression] ¶
Behobene Regression, die durch die gerade veröffentlichte Korrektur für #10863 verursacht wurde, bei der eine ungültige Ausnahmeklasse zum "except"-Block hinzugefügt wurde, die nicht ausgeführt wird, es sei denn, ein solcher Catch tritt tatsächlich ein. Ein Mock-ähnlicher Test wurde hinzugefügt, um sicherzustellen, dass dieser Catch in den Unit-Tests ausgeführt wird.
Referenzen: #11005
2.0.26¶
Veröffentlicht: 11. Februar 2024orm¶
[orm] [bug] ¶
Die Warnung "loader depth is excessively deep" (Ladetiefe ist exzessiv tief) wurde durch eine kürzere Meldung ersetzt, die dem Caching-Badge innerhalb der SQL-Protokollierung hinzugefügt wird, für Anweisungen, bei denen das ORM den Cache aufgrund einer zu tiefen Kette von Ladeoptionen deaktiviert hat. Die Bedingung, die diese Warnung hervorhebt, ist schwer zu beheben und stellt im Allgemeinen nur eine Einschränkung der ORM-Anwendung des SQL-Cachings dar. Eine zukünftige Funktion könnte die Möglichkeit bieten, den Schwellenwert für die Deaktivierung des Cachings einzustellen, aber vorerst wird die Warnung keine Belästigung mehr darstellen.
Referenzen: #10896
[orm] [bug] ¶
Behobenes Problem, bei dem es nicht möglich war, einen Typ (wie z. B. ein Enum) innerhalb eines
Mapped-Container-Typs zu verwenden, wenn dieser Typ lokal innerhalb des Klassenkörpers deklariert wurde. Der Gültigkeitsbereich der für die Auswertung verwendeten lokalen Variablen umfasst nun den Klassenkörper selbst. Darüber hinaus kann der Ausdruck innerhalb vonMappedauf den Klassennamen selbst verweisen, wenn er als Zeichenkette oder im Modus für zukünftige Annotationen verwendet wird.Referenzen: #10899
[orm] [bug] ¶
Behobenes Problem, bei dem die Verwendung von
Session.delete()zusammen mit der FunktionMapper.version_id_coldazu führte, dass der korrekte Versionsidentifikator nicht verwendet wurde, falls eine zusätzliche UPDATE-Anweisung gegen das Zielobjekt gesendet wurde, als Ergebnis der Verwendung vonrelationship.post_updateauf dem Objekt. Das Problem ist ähnlich zu #10800, das gerade in Version 2.0.25 für den Fall von reinen Updates behoben wurde.Referenzen: #10967
[orm] [bug] ¶
Behobenes Problem, bei dem eine Assertion innerhalb der Implementierung für
with_expression()ausgelöst wurde, wenn ein nicht-cachebarer SQL-Ausdruck verwendet wurde; dies war eine 2.0-Regression seit 1.4.Referenzen: #10990
examples¶
[examples] [bug] ¶
Behobene Regression im Beispiel history_meta, bei der die Verwendung von
MetaData.to_metadata()zum Kopieren der Verlaufstabelle auch Indizes kopierte (was gut ist), aber Namenskonflikte verursachte, unabhängig vom verwendeten Benennungsschema für diese Indizes. Ein "_history"-Suffix wird nun zu diesen Indizes hinzugefügt, genauso wie es für den Tabellennamen geschieht.Referenzen: #10920
[examples] [bug] ¶
Behobene Performance-Beispielskripte in examples/performance, damit sie größtenteils mit der Oracle-Datenbank funktionieren. Hierzu wurde das Konstrukt
Identityzu allen Tabellen hinzugefügt und die Primärgenerierung auf diesem Backend erlaubt. Einige der "rohen DBAPI"-Fälle sind mit Oracle immer noch nicht kompatibel.
sql¶
[sql] [bug] ¶
Behobene Probleme mit
case(), bei denen die Logik zur Bestimmung des Typs des Ausdrucks zuNullTypeführen konnte, wenn das letzte Element in den "whens" keinen Typ hatte, oder in anderen Fällen, in denen der Typ zuNoneaufgelöst werden konnte. Die Logik wurde aktualisiert, um alle gegebenen Ausdrücke zu scannen, so dass der erste Nicht-Null-Typ verwendet wird, sowie um immer sicherzustellen, dass ein Typ vorhanden ist. Pull Request von David Evans.Referenzen: #10843
typing¶
[typing] [bug] ¶
behoben: Typsignatur für das Ereignis
PoolEvents.checkin()korrigiert, um anzuzeigen, dass das übergebeneDBAPIConnectionArgument im Falle einer ungültigen VerbindungNonesein kann.
postgresql¶
[postgresql] [usecase] [reflection] ¶
Unterstützung für die Reflexion von PostgreSQL CHECK-Constraints mit „NO INHERIT“ hinzugefügt. Der Schlüssel
no_inherit=Truewird in den reflektierten Daten gesetzt. Pull-Request von Ellis Valentiner.Referenzen: #10777
[postgresql] [usecase] ¶
Unterstützung für die Option
USING <method>für PostgreSQLCREATE TABLEhinzugefügt, um die Zugriffsmethode für die Speicherung der Inhalte der neuen Tabelle anzugeben. Pull-Request von Edgar Ramírez-Mondragón.Siehe auch
Referenzen: #10904
[postgresql] [usecase] ¶
PostgreSQL RANGE- und MULTIRANGE-Typen werden korrekt als
Range[T]undSequence[Range[T]]typisiert. Die HilfssequenzMultiRangewurde eingeführt, um die Interoperabilität von MULTIRANGE-Typen zu verbessern.Referenzen: #9736
[postgresql] [usecase] ¶
Bei der Ableitung des Datenbanktyps aus einer
Range- oderMultiRange-Instanz wird nun zwischen INT4- und INT8-Bereichs- und Mehrbereichstypen unterschieden, wobei INT4 bevorzugt wird, wenn die Werte hineinpassen.[postgresql] [bug] [regression] ¶
Regression im asyncpg-Dialekt behoben, die durch #10717 in Version 2.0.24 verursacht wurde. Die Änderung, die nun versucht, die asyncpg-Verbindung vor dem Beenden ordnungsgemäß zu schließen, fiel für andere mögliche verbindungsbezogene Ausnahmen als einen Timeout-Fehler nicht auf
terminate()zurück, wobei Fälle, in denen der ordnungsgemäße.close()-Versuch aus anderen Gründen wie Verbindungsfehlern fehlschlägt, nicht berücksichtigt wurden.Referenzen: #10863
[postgresql] [bug] ¶
Ein Problem im Zusammenhang mit der Verwendung des
Uuid-Datentyps mit dem ParameterUuid.as_uuidauf False gesetzt, bei Verwendung von PostgreSQL-Dialekten, behoben. ORM-optimierte INSERT-Anweisungen (z. B. die Funktion „insertmanyvalues“) richteten UUID-Primärschlüsselwerte für Bulk-INSERT-Anweisungen nicht korrekt aus, was zu Fehlern führte. Ähnliche Probleme wurden auch für den pymssql-Treiber behoben.
mysql¶
[mysql] [bug] ¶
Behoben, dass NULL/NOT NULL nicht ordnungsgemäß von einer MySQL-Spalte reflektiert wurde, die auch die Direktiven VIRTUAL oder STORED angab. Pull-Request von Georg Wicke-Arndt.
Referenzen: #10850
[mysql] [bug] ¶
Behoben, dass die
.close()-Methode in den Asyncio-Dialekten asyncmy und aiomysql offenbar kein ordnungsgemäßes Schließen ist. Ersetzt durch die nicht standardmäßige, awaitable.ensure_closed()-Methode und.close()in den sogenannten „terminate“-Fall verschoben.Referenzen: #10893
mssql¶
[mssql] [bug] ¶
Ein Problem im Zusammenhang mit der Verwendung des
Uuid-Datentyps mit dem ParameterUuid.as_uuidauf False gesetzt, bei Verwendung des pymssql-Dialekts, behoben. ORM-optimierte INSERT-Anweisungen (z. B. die Funktion „insertmanyvalues“) richteten UUID-Primärschlüsselwerte für Bulk-INSERT-Anweisungen nicht korrekt aus, was zu Fehlern führte. Ähnliche Probleme wurden auch für die PostgreSQL-Treiber behoben.
oracle¶
[oracle] [bug] [performance] ¶
Die Standard-Arraysize der Oracle-Dialekte wurde geändert, so dass der vom Treiber gesetzte Wert verwendet wird, der zum Zeitpunkt der Erstellung für cx_oracle und oracledb 100 beträgt. Zuvor war der Wert standardmäßig auf 50 gesetzt. Die Einstellung von 50 konnte im Vergleich zur alleinigen Verwendung von cx_oracle/oracledb zum Abrufen vieler Hunderter von Zeilen über langsamere Netzwerke erhebliche Leistungsregressionen verursachen.
Referenzen: #10877
2.0.25¶
Veröffentlicht: 2. Januar 2024orm¶
[orm] [usecase] ¶
Vorläufige Unterstützung für Python 3.12 pep-695 Typ-Alias-Strukturen beim Auflösen benutzerdefinierter Typ-Mappings für ORM Annotated Declarative-Mappings hinzugefügt.
Referenzen: #10807
[orm] [bug] ¶
Behoben, dass die gleichzeitige Verwendung des
relationship.post_update-Features mit einer Mapper-Version-ID-Spalte zu einer Situation führen konnte, in der die zweite von der Post-Update-Funktion ausgegebene UPDATE-Anweisung den korrekten Versionsbezeichner nicht nutzte, da angenommen wurde, dass in diesem Flush bereits ein UPDATE ausgegeben wurde, das den Versionszähler bereits erhöht hatte.Referenzen: #10800
[orm] [bug] ¶
Behoben, dass ORM Annotated Declarative die linke Seite einer Beziehung ohne angegebene Sammlung als uselist=True fehlinterpretierte, wenn der linke Typ als Klasse und nicht als Zeichenkette angegeben wurde, ohne zukünftige Annotationen zu verwenden.
Referenzen: #10815
sql¶
[sql] [bug] ¶
Kompilierung von
any_()/all_()im Kontext einer Negation einer booleschen Vergleichung verbessert. Es wird nunNOT (expr)anstelle der Umkehrung des Gleichheitsoperators zu ungleich gerendert, was eine feinere Steuerung von Negationen für diese untypischen Operatoren ermöglicht.Referenzen: #10817
typing¶
[typing] [bug] ¶
Regressionen behoben, die durch Typisierungen im Modul
sqlalchemy.sql.functionsin Version 2.0.24 als Teil von #6810 verursacht wurden.Weitere Verbesserungen der pep-484-Typisierung, um SQL-Funktionen aus von
sqlalchemy.sql.expression.funcabgeleiteten Elementen besser mit ORM-gemappten Attributen arbeiten zu lassen (#10801)Die an Funktionen übergebenen Argumenttypen wurden korrigiert, damit Literal-Ausdrücke wie Strings und Integers wieder korrekt interpretiert werden (#10818)
asyncio¶
[asyncio] [bug] ¶
Kritische Fehler in der Asyncio-Version des Connection-Pools behoben. Das Aufrufen von
AsyncEngine.dispose()erzeugte einen neuen Connection-Pool, der die Verwendung von Asyncio-kompatiblen Mutexen nicht vollständig wiederherstellte, was zur Verwendung eines einfachenthreading.Lock()führte. Dies verursachte in einem Asyncio-Kontext bei der Verwendung von Nebenläufigkeitsfunktionen wieasyncio.gather()Deadlocks.Diese Änderung ist auch zurückportiert zu: 1.4.51
Referenzen: #10813
oracle¶
[oracle] [asyncio] ¶
Unterstützung für python-oracledb im Asyncio-Modus hinzugefügt, unter Verwendung der neu veröffentlichten Version des
oracledbDBAPI, die Asyncio-Unterstützung enthält. Für die 2.0-Serie ist dies eine Vorschauversion, bei der die aktuelle Implementierung noch keine Unterstützung fürAsyncConnection.stream()enthält. Verbesserte Unterstützung ist für die 2.1-Version von SQLAlchemy geplant.Referenzen: #10679
2.0.24¶
Veröffentlicht: 28. Dezember 2023orm¶
[orm] [bug] ¶
Eine Korrektur, die erstmals für #3208 in Version 0.9.8 veröffentlicht wurde, verbessert, bei der das interne Verzeichnis von Klassen, das von der Deklaration verwendet wird, bei gleichzeitiger Garbage Collection einzelner gemappter Klassen und Konstruktion neuer gemappter Klassen einem Wettlauf unterliegen konnte, wie es in einigen Testsuiten-Konfigurationen oder dynamischen Klassenerstellungsumgebungen vorkommt. Zusätzlich zur bereits hinzugefügten Weakref-Prüfung wird auch die Liste der iterierten Elemente zuerst kopiert, um Fehler wie „Liste während der Iteration geändert“ zu vermeiden. Pull-Request von Yilei Yang.
Diese Änderung ist auch zurückportiert zu: 1.4.51
Referenzen: #10782
[orm] [bug] ¶
Behoben, dass die Annotation
foreign()auf einem nicht initialisiertenmapped_column()-Konstrukt ein Ausdruck ohne Typ erzeugte, der dann zur Initialisierungszeit der tatsächlichen Spalte nicht aktualisiert wurde, was zu Problemen führte, wie z. B. dass Beziehungenuse_getnicht richtig bestimmten.Referenzen: #10597
[orm] [bug] ¶
Fehlermeldung verbessert, die ausgegeben wird, wenn der Unit-of-Work-Prozess den Wert einer Primärschlüsselspalte aufgrund des Löschens eines verknüpften Objekts mit einer Abhängigkeitsregel auf dieser Spalte auf NULL setzt. Die Meldung enthält nun nicht nur das Zielobjekt und den Spaltennamen, sondern auch die Quellspalte, von der der NULL-Wert stammt. Pull-Request von Jan Vollmer.
Referenzen: #10668
[orm] [bug] ¶
Die Methode
__init_subclass__(), die vonMappedAsDataclass,DeclarativeBaseundDeclarativeBaseNoMetaverwendet wird, wurde so geändert, dass sie beliebige**kwakzeptiert und diese an densuper()-Aufruf weitergibt. Dies ermöglicht eine größere Flexibilität bei der Anordnung benutzerdefinierter Oberklassen und Mixins, die__init_subclass__()-Schlüsselwortargumente verwenden. Pull-Request von Michael Oliver.Referenzen: #10732
[orm] [bug] ¶
Der Anwendungsfall von
Bundle-Objekten, die imreturning()-Teil von ORM-aktivierten INSERT-, UPDATE- und DELETE-Anweisungen verwendet werden, wurde getestet und funktioniert nun vollständig. Dies wurde zuvor nie explizit implementiert oder getestet und funktionierte in der 1.4er-Serie nicht korrekt. In der 2.0er-Serie fehlte eine Implementierungsmethode für ORM UPDATE/DELETE mit WHERE-Kriterien, was die Funktionsweise vonBundle-Objekten verhinderte.Referenzen: #10776
[orm] [bug] ¶
2.0-Regression in
MutableListbehoben, bei der eine Routine zur Erkennung von Sequenzen Zeichenketten- oder Byte-Instanzen nicht korrekt herausfilterte, was die Zuweisung eines Zeichenkettenwerts zu einem bestimmten Index unmöglich machte (während Nicht-Sequenzwerte einwandfrei funktionierten).Referenzen: #10784
engine¶
[engine] [bug] ¶
URL-Codierung der Benutzername- und Passwortkomponenten von
URL-Objekten beim Konvertieren in Zeichenketten mit der MethodeURL.render_as_string()korrigiert. Dabei wird die Python-Standardbibliothekurllib.parse.quoteverwendet, wobei Pluszeichen und Leerzeichen unverändert bleiben, wie von der nicht standardmäßigen URL-Analyse von SQLAlchemy unterstützt, anstelle der alten, selbst entwickelten Routine von vor vielen Jahren. Pull-Request von Xavier NUNN.Referenzen: #10662
sql¶
[sql] [bug] ¶
Fehler in der Stringifizierung für SQL-Elemente behoben, bei dem ein spezifischer Dialekt nicht übergeben wurde, ein dialektspezifisches Element wie die PostgreSQL „on conflict do update“-Konstruktion angetroffen wurde und dann kein Dialekt für die Stringifizierung mit dem entsprechenden Zustand zum Rendern der Konstruktion bereitgestellt werden konnte, was zu internen Fehlern führte.
Referenzen: #10753
[sql] [bug] ¶
Fehler behoben, bei dem die Stringifizierung oder Kompilierung eines
CTE, der sich gegen eine DML-Konstruktion wie eineinsert()-Konstruktion richtete, fehlschlug, da eine Fehlklassifizierung stattfand, dass die gesamte Anweisung eine INSERT-Anweisung ist, was zu internen Fehlern führte.
schema¶
[schema] [bug] ¶
Behoben, dass die Fehlerberichterstattung für unerwartete Schemaelemente beim Erstellen von Objekten wie
Tableein Argument, das selbst als Tupel übergeben wurde, falsch behandelte, was zu einem Formatierungsfehler führte. Die Fehlermeldung wurde durch die Verwendung von f-Strings modernisiert.Referenzen: #10654
typing¶
asyncio¶
[asyncio] [change] ¶
Das Dialektargument
async_fallbackist nun veraltet und wird in SQLAlchemy 2.1 entfernt. Dieses Flag wurde seit einiger Zeit nicht mehr für die Testsuite von SQLAlchemy verwendet. Asyncio-Dialekte können immer noch synchron ausgeführt werden, indem Code innerhalb eines Greenlets mitgreenlet_spawn()ausgeführt wird.
postgresql¶
[postgresql] [bug] ¶
Der asyncpg-Dialekt wurde angepasst, so dass beim Aufruf der Methode
terminate()zum Verwerfen einer ungültigen Verbindung der Dialekt zuerst versucht, die Verbindung ordnungsgemäß mit.close()und einem Timeout zu schließen, wenn die Operation nur innerhalb eines Async-Event-Loop-Kontextes durchgeführt wird. Dies ermöglicht es dem asyncpg-Treiber, die Beendigung einesTimeoutErrorzu verarbeiten, einschließlich der Möglichkeit, eine langlaufende Abfrage serverseitig zu schließen, die sonst nach Beendigung des Programms weiterlaufen könnte.Referenzen: #10717
mysql¶
tests¶
[tests] [bug] ¶
Verbesserungen an der Testsuite, um ihre Fähigkeit, ohne installierte Python
greenletzu laufen, weiter zu stärken. Es gibt nun ein Tox-Ziel, das das Token „nogreenlet“ enthält und die Suite ohne Greenlet ausführt (beachten Sie jedoch, dass Greenlet als Teil der Tox-Konfiguration temporär installiert wird).Referenzen: #10747
2.0.23¶
Veröffentlicht: 2. November 2023orm¶
[orm] [usecase] ¶
Implementierung des Parameters
Session.bulk_insert_mappings.render_nullsfür neue Bulk-ORM-Inserts, wodurchrender_nulls=Trueals Ausführungsoption zulässig ist. Dies ermöglicht Bulk-ORM-Inserts mit einer Mischung ausNone-Werten in den Parameterwörterbüchern, um eine einzige Zeilengruppe für eine gegebene Menge von Wörterbuchschlüsseln zu verwenden, anstatt in Gruppen aufzuteilen, die die NULL-Spalten aus jedem INSERT weglassen.Referenzen: #10575
[orm] [bug] ¶
Behoben, dass die Direktive
__allow_unmapped__das Zulassen von LegacyColumn- /deferred()-Mappings, die dennoch Annotationen wieAnyoder einen spezifischen Typ ohneMapped[]als Typ hatten, nicht zuließ, ohne Fehler im Zusammenhang mit der Suche nach dem Attributnamen.Referenzen: #10516
[orm] [bug] ¶
Caching-Fehler behoben, bei dem die Verwendung des
with_expression()-Konstrukts in Verbindung mit den Loader-Optionenselectinload(),lazyload()gebundene Parameterwerte bei nachfolgenden Caching-Läufen nicht korrekt substituierte.Referenzen: #10570
[orm] [bug] ¶
Fehler im ORM Annotated Declarative behoben, bei dem die Verwendung einer
ClassVar, die sich dennoch auf irgendeine Weise auf eine ORM-gemappte Klassenbezeichnung bezog, nicht alsClassVar, die nicht gemappt ist, interpretiert wurde.Referenzen: #10472
sql¶
[sql] [usecase] ¶
Implementierung der „Literalwertverarbeitung“ für den
Interval-Datentyp für die PostgreSQL- und Oracle-Dialekte, die eine literale Darstellung von Intervallwerten ermöglicht. Pull-Request von Indivar Mishra.Referenzen: #9737
[sql] [bug] ¶
Behoben, dass die Verwendung desselben gebundenen Parameters mehr als einmal mit
literal_execute=Truein einigen Kombinationen mit anderen Literal-Rendering-Parametern dazu führte, dass die falschen Werte aufgrund eines Iterationsproblems gerendert wurden.Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10142
[sql] [bug] ¶
NULL/NULL-Handhabung auf Compiler-Ebene für die „Literal-Prozessoren“ aller Datentypen, die eine Literal-Verarbeitung beinhalten, d. h. wenn ein Wert inline in einer SQL-Anweisung anstelle eines gebundenen Parameters gerendert wird, hinzugefügt für all jene Typen, die keine explizite „Nullwert“-Handhabung aufweisen. Zuvor war dieses Verhalten undefiniert und inkonsistent.
Referenzen: #10535
[sql] ¶
Entferntes, ungenutztes Platzhalterverfahren
TypeEngine.compare_against_backend(). Diese Methode wurde von sehr alten Versionen von Alembic verwendet. Siehe https://github.com/sqlalchemy/alembic/issues/1293 für Details.
asyncio¶
[asyncio] [bug] ¶
Fehler bei der Methode
AsyncSession.close_all()behoben, die nicht korrekt funktionierte. Außerdem wurde die Funktionclose_all_sessions()hinzugefügt, die dem Äquivalent vonclose_all_sessions()entspricht. Pull-Request von Bryan不可思议.Referenzen: #10421
postgresql¶
[postgresql] [bug] ¶
2.0-Regression behoben, die durch #7744 verursacht wurde, bei der Ausdrucksketten, die PostgreSQL JSON-Operatoren mit anderen Operatoren wie Zeichenkettenkonkatenation kombinierten, die korrekte Klammerung verloren, aufgrund eines Implementierungsdetails, das spezifisch für den PostgreSQL-Dialekt ist.
Referenzen: #10479
[postgresql] [bug] ¶
SQL-Handhabung für „insertmanyvalues“ bei Verwendung des
BIT-Datentyps mit dem asyncpg-Backend behoben. DasBITunter asyncpg erfordert offenbar die Verwendung eines asyncpg-spezifischenBitString-Typs, der derzeit bei Verwendung dieses DBAPI verfügbar ist, was ihn inkompatibel mit anderen PostgreSQL-DBAPIs macht, die alle mit einfachen Bitstrings arbeiten. Eine zukünftige Korrektur in Version 2.1 wird diesen Datentyp für alle PG-Backends normalisieren. Pull-Request von Sören Oldag.Referenzen: #10532
mysql¶
[mysql] [bug] ¶
Eine neue Inkompatibilität in der MySQL „pre-ping“-Routine wurde repariert, bei der das an
connection.ping()übergebeneFalse-Argument, das eine unerwünschte „automatische Wiederverbindung“-Funktion deaktivieren soll, in MySQL-Treibern und Backends als veraltet markiert ist und bei einigen Versionen von MySQLs nativen Client-Treibern Warnungen erzeugt. Es wurde für mysqlclient entfernt, während es für PyMySQL und auf PyMySQL basierende Treiber irgendwann veraltet sein wird, so dass eine API-Introspektion verwendet wird, um gegen diese verschiedenen Entfernungsstufen zukunftssicher zu sein.Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10492
mariadb¶
[mariadb] [bug] ¶
Angepasste die MySQL/MariaDB-Dialekte, um eine generierte Spalte unter MariaDB standardmäßig auf NULL zu setzen, wenn
Column.nullablenicht mit einem explizitenTrueoderFalseWert angegeben wurde, da MariaDB die Phrase „NOT NULL“ mit einer generierten Spalte nicht unterstützt. Pull-Request von Indivar.Referenzen: #10056
[mariadb] [bug] [regression] ¶
Es wurde ein Workaround für ein scheinbar intrinsisches Problem bei MySQL/MariaDB-Treibern etabliert, bei dem ein RETURNING-Ergebnis für DELETE DML, das keine Zeilen mit den „leeren IN“-Kriterien von SQLAlchemy zurückgibt, keinen Cursor bereitstellt. Dies führt zu einem Ergebnis, das keine Zeilen zurückgibt, was zu Regressionen für das ORM führt, das in der 2.0-Serie RETURNING für Massen-DELETE-Anweisungen für die Funktion „synchronize session“ verwendet. Zur Behebung wird, wenn der spezifische Fall „keine Beschreibung bei gegebenem RETURNING“ erkannt wird, ein „leeres Ergebnis“ mit einer korrekten Cursor-Beschreibung generiert und anstelle des nicht funktionierenden Cursors verwendet.
Referenzen: #10505
mssql¶
[mssql] [usecase] ¶
Unterstützung für den
aioodbc-Treiber für SQL Server hinzugefügt, der auf pyodbc und der allgemeinen aio*-Dialektarchitektur aufbaut.Siehe auch
aioodbc - in der Dokumentation des SQL Server-Dialekts.
Referenzen: #6521
[mssql] [bug] [reflection] ¶
Problem behoben, bei dem die Reflexion von Identitätsspalten für eine BigInt-Spalte mit einem großen Startwert für die Identität (mehr als 18 Ziffern) fehlschlug.
Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10504
oracle¶
[oracle] [bug] ¶
Problem im
Interval-Datentyp behoben, bei dem die Oracle-Implementierung nicht für die DDL-Generierung verwendet wurde, was dazu führte, dass die Parameterday_precisionundsecond_precisionignoriert wurden, obwohl sie von diesem Dialekt unterstützt werden. Pull-Request von Indivar.Referenzen: #10509
[oracle] [bug] ¶
Problem behoben, bei dem der cx_Oracle-Dialekt eine niedrigere cx_Oracle-Version (7.x) beanspruchte als tatsächlich in der 2.0-Serie von SQLAlchemy unterstützt wurde. Der Dialekt importiert Symbole, die nur in cx_Oracle 8 oder höher vorhanden sind. Daher wurden Laufzeit-Dialektprüfungen sowie die setup.cfg-Anforderungen aktualisiert, um diese Kompatibilität widerzuspiegeln.
Referenzen: #10470
2.0.22¶
Veröffentlicht: 12. Oktober 2023orm¶
[orm] [usecase] ¶
Methode
Session.get_one()hinzugefügt, die sich wieSession.get()verhält, aber eine Ausnahme auslöst, anstattNonezurückzugeben, wenn keine Instanz mit dem angegebenen Primärschlüssel gefunden wurde. Pull-Request von Carlos Sousa.Referenzen: #10202
[orm] [usecase] ¶
Option zum permanenten Schließen von Sessions hinzugefügt. Wenn der neue Parameter
Session.close_resets_onlyaufFalsegesetzt ist, wird verhindert, dass eineSessionnach dem Aufruf vonSession.close()weitere Operationen durchführt.Neue Methode
Session.reset()hinzugefügt, die eineSessionin ihren Anfangszustand zurückversetzt. Dies ist ein Alias fürSession.close(), es sei denn,Session.close_resets_onlyist aufFalsegesetzt.Referenzen: #7787
[orm] [bug] ¶
Eine breite Palette von
mapped_column()-Parametern, die nicht übertragen wurden, wenn das Objektmapped_column()innerhalb eines pep-593Annotated-Objekts verwendet wurde, wurde behoben. Dazu gehörenmapped_column.sort_order,mapped_column.deferred,mapped_column.autoincrement,mapped_column.system,mapped_column.infousw.Zusätzlich bleibt es nicht unterstützt, Dataclass-Argumente wie
mapped_column.kw_only,mapped_column.default_factoryusw. innerhalb desmapped_column(), das vonAnnotatedempfangen wird, anzugeben, da dies mit pep-681 Dataclass Transforms nicht unterstützt wird. Eine Warnung wird nun ausgegeben, wenn diese Parameter auf diese Weise innerhalb vonAnnotatedverwendet werden (und sie werden weiterhin ignoriert).[orm] [bug] ¶
Problem behoben, bei dem das Aufrufen von
Result.unique()mit einer neuen SELECT-Abfrage im ORM, bei der eine oder mehrere Spalten Werte von „unbekannter Hashbarkeit“ ergeben, typischerweise bei Verwendung von JSON-Funktionen wiefunc.json_build_object()ohne Typangabe, intern fehlschlagen würde, wenn die zurückgegebenen Werte tatsächlich nicht hashbar wären. Das Verhalten wurde repariert, um die Objekte in diesem Fall auf Hashbarkeit zu testen und eine informative Fehlermeldung auszugeben, falls nicht. Beachten Sie, dass für Werte von „bekannter Unhashbarkeit“, wie z. B. bei direkter Verwendung der TypenJSONoderARRAY, bereits eine informative Fehlermeldung ausgegeben wurde.Die „Hashbarkeitsprüfung“-Korrektur hier wird auch auf die Legacy-Klasse
Queryangewendet. Im Legacy-Fall wirdResult.unique()jedoch für fast alle Abfragen verwendet, daher wird hier keine neue Warnung ausgegeben; das Legacy-Verhalten, in diesem Fall auf die Verwendung vonid()zurückzugreifen, wird beibehalten, mit der Verbesserung, dass ein unbekannter Typ, der sich als hashbar erweist, nun eindeutig gemacht wird, während dies früher nicht der Fall war.Referenzen: #10459
[orm] [bug] ¶
Regression in der kürzlich überarbeiteten „insertmanyvalues“-Funktion (wahrscheinlich Problem #9618) behoben, bei der das ORM versehentlich versuchte, ein Nicht-RETURNING-Ergebnis als RETURNING zu interpretieren. Dies geschah im Fall, in dem der Parameter
implicit_returning=Falseauf die gemappteTableangewendet wurde, was darauf hinweist, dass „insertmanyvalues“ nicht verwendet werden kann, wenn die Primärschlüsselwerte nicht angegeben sind.Referenzen: #10453
[orm] [bug] ¶
Bug behoben, bei dem
with_loader_criteria()im ORM nicht auf einSelect.join()angewendet wurde, bei dem die ON-Klausel als Plain-SQL-Vergleich angegeben wurde, anstatt als Beziehungsziel oder Ähnliches.Update - dies behob auch ein Problem, bei dem Einzelvererbungs-Kriterien nicht korrekt auf eine Unterklassen-Entität angewendet wurden, die nur in der
select_from()-Liste erschien, siehe #11412[orm] [bug] ¶
Problem behoben, bei dem
Mapped-Symbole wieWriteOnlyMappedundDynamicMappednicht korrekt aufgelöst werden konnten, wenn sie als Element eines Untermoduls in der angegebenen Annotation referenziert wurden, unter Annahme von Zeichenketten-basierten oder „Future Annotations“-Stil-Annotationen.Referenzen: #10412
[orm] [bug] ¶
Problem mit der Deklarationsoption
__allow_unmapped__behoben, bei der Typen, die mit Kollektionstypen wielist[SomeClass]im Gegensatz zum Typing-KonstruktList[SomeClass]deklariert wurden, nicht korrekt erkannt wurden. Pull-Request von Pascal Corpet.Referenzen: #10385
engine¶
[engine] [bug] ¶
Problem in einigen Dialekten behoben, bei denen der Dialekt fälschlicherweise ein leeres Ergebnis für eine INSERT-Anweisung zurückgeben konnte, die tatsächlich keine Zeilen zurückgibt, aufgrund von Artefakten aus dem Pre- oder Post-Fetching des Primärschlüssels der Zeile oder noch vorhandener Zeilen. Betroffene Dialekte waren asyncpg, alle mssql-Dialekte.
[engine] [bug] ¶
Problem behoben, bei dem unter bestimmten Garbage-Collection-/Ausnahmeszenarien die Bereinigungsroutine des Connection-Pools aufgrund eines unerwarteten Zustands einen Fehler auslöste, der unter bestimmten Bedingungen reproduzierbar ist.
Referenzen: #10414
sql¶
[sql] [bug] ¶
Problem behoben, bei dem die Referenzierung eines FROM-Eintrags in der SET-Klausel einer UPDATE-Anweisung diesen nicht in die FROM-Klausel der UPDATE-Anweisung aufnahm, wenn dieser Eintrag nirgendwo sonst in der Anweisung vorkam; dies tritt derzeit für CTEs auf, die mit
Update.add_cte()hinzugefügt wurden, um die gewünschte CTE am Anfang der Anweisung bereitzustellen.Referenzen: #10408
[sql] [bug] ¶
Die 2.0-Regression, bei der die
DDL-Konstruktion nicht mehr__repr__()wurde, da das entfernteon-Attribut nicht berücksichtigt wurde, wurde behoben. Pull-Request von Iuri de Silvio.Referenzen: #10443
typing¶
asyncio¶
[asyncio] [bug] ¶
Der Parameter
AsyncSession.get.execution_optionswurde korrigiert, der nicht an die zugrunde liegendeSessionweitergegeben und stattdessen ignoriert wurde.
mariadb¶
[mariadb] [bug] ¶
Der mariadb-connector-Treiber wurde modifiziert, um den Wert von
cursor.rowcountfür alle Abfragen vorzuladen, um Tools wie Pandas entgegenzukommen, dieResult.rowcountauf diese Weise hartkodiert aufrufen. SQLAlchemy lädt normalerweisecursor.rowcountnur für UPDATE/DELETE-Anweisungen vor und leitet ansonsten an den DBAPI weiter, wo er -1 zurückgeben kann, wenn kein Wert verfügbar ist. Der mariadb-connector unterstützt jedoch nicht den Aufruf voncursor.rowcount, nachdem der Cursor selbst geschlossen wurde, und löst stattdessen einen Fehler aus. Generische Testunterstützung wurde hinzugefügt, um sicherzustellen, dass alle Backends das Zulassen vonResult.rowcount(d. h. Rückgabe eines Integer-Werts mit -1 für „nicht verfügbar“) nach dem Schließen des Ergebnisses unterstützen.Referenzen: #10396
[mariadb] [bug] ¶
Weitere Korrekturen für den mariadb-connector-Dialekt zur Unterstützung von UUID-Datumsangaben in den Ergebnissen von INSERT..RETURNING-Anweisungen.
mssql¶
[mssql] [bug] ¶
Bug behoben, bei dem die Regel, die die Ausgabe von ORDER BY innerhalb von Unterabfragen auf SQL Server verhindert, nicht deaktiviert wurde, wenn die Methode
select.fetch()verwendet wurde, um Zeilen in Verbindung mit WITH TIES oder PERCENT zu begrenzen. Dies verhinderte die Verwendung gültiger Unterabfragen mit TOP/ORDER BY.Referenzen: #10458
2.0.21¶
Veröffentlicht: 18. September 2023orm¶
[orm] [bug] ¶
Die Interpretation des „Ziel“-Entitäts durch das ORM, die innerhalb von
UpdateundDeleteverwendet wird, wurde angepasst, um das Ziel „from“-Objekt, das an die Anweisung übergeben wird, nicht zu beeinträchtigen, wie z. B. bei der Übergabe eines ORM-gemapptenaliased-Konstrukts, das in einer Phrase wie „UPDATE FROM“ beibehalten werden sollte. Fälle wie die ORM-Session-Synchronisierung unter Verwendung von „SELECT“-Anweisungen, wie bei MySQL/MariaDB, haben weiterhin Probleme mit UPDATE/DELETE dieser Form, daher ist es am besten, synchonize_session zu deaktivieren, wenn DML-Anweisungen dieser Art verwendet werden.Referenzen: #10279
[orm] [bug] ¶
Neue Funktionalität für die Loader-Option
selectin_polymorphic()hinzugefügt, die es ermöglicht, andere Loader-Optionen als Geschwister zu bündeln und sich auf eine ihrer Unterklassen innerhalb der Unteroptionen einer übergeordneten Loader-Option zu beziehen. Zuvor wurde dieses Muster nur unterstützt, wennselectin_polymorphic()auf der obersten Ebene der Optionen für die Abfrage stand. Siehe neuer Dokumentationsabschnitt für ein Beispiel.Als Teil dieser Änderung wurde das Verhalten der Methode
Load.selectin_polymorphic()/ Loader-Strategie verbessert, sodass die Unterklassenladung nicht die meisten bereits geladenen Spalten aus der Elterntabelle lädt, wenn die Option auf eine Klasse angewendet wird, die bereits beziehungsweise geladen wird. Zuvor funktionierte die Logik zum Laden nur der Unterklassenspalten nur für eine Klassenladung auf oberster Ebene.Referenzen: #10348
engine¶
sql¶
[sql] [usecase] ¶
Der
Enum-Datentyp wurde angepasst, um ein Argument vonNonefür den ParameterEnum.lengthzu akzeptieren, was zu einem VARCHAR oder einem anderen Texttyp ohne Länge in der resultierenden DDL führt. Dies ermöglicht, dass neue Elemente beliebiger Länge zum Typ hinzugefügt werden können, nachdem er im Schema vorhanden ist. Pull-Request von Eugene Toder.Referenzen: #10269
[sql] [usecase] ¶
Neue generische SQL-Funktion
aggregate_stringshinzugefügt, die einen SQL-Ausdruck und ein Trennzeichen akzeptiert und Zeichenketten über mehrere Zeilen zu einem einzigen aggregierten Wert verkettet. Die Funktion wird pro Backend in Funktionen wiegroup_concat(),string_agg()oderLISTAGG()kompiliert. Pull-Request von Joshua Morris.Referenzen: #9873
[sql] [bug] ¶
Die Operatorrangfolge für den Zeichenketten-Verkettungsoperator wurde so angepasst, dass sie gleich der von Zeichenketten-Abgleichsoperatoren ist, wie z. B.
ColumnElement.like(),ColumnElement.regexp_match(),ColumnElement.match()usw., sowie einfache==, die dieselbe Rangfolge wie Zeichenketten-Vergleichsoperatoren hat. Dadurch werden Klammern auf einen Zeichenketten-Verkettungsausdruck angewendet, der einem Zeichenketten-Abgleichsoperator folgt. Dies dient Backends wie PostgreSQL, bei denen der Operator „regexp match“ anscheinend eine höhere Rangfolge hat als der Zeichenketten-Verkettungsoperator.Referenzen: #9610
[sql] [bug] ¶
Die Verwendung von
hashlib.md5()im DDL-Compiler, die zur Erzeugung deterministischer vierstelliger Suffixe für lange Index- und Bezeichnungsnamen in DDL-Anweisungen verwendet wird, wurde qualifiziert, um den Python 3.9+-Parameterusedforsecurity=Falseeinzuschließen, damit Python-Interpreter, die für eingeschränkte Umgebungen wie FIPS erstellt wurden, diesen Aufruf nicht als sicherheitsrelevant betrachten.Referenzen: #10342
[sql] [bug] ¶
Die
Values-Konstruktion erstellt nun automatisch einen Proxy (d. h. eine Kopie) einercolumn, wenn die Spalte bereits mit einer vorhandenen FROM-Klausel verbunden war. Dies ermöglicht, dass ein Ausdruck wievalues_obj.c.colnamedie korrekte FROM-Klausel ergibt, auch wenncolnamealscolumnübergeben wurde, die bereits mit einer früherenValuesoder einer anderen Tabellenkonstruktion verwendet wurde. Ursprünglich galt dies als Kandidat für einen Fehlerzustand, aber dieses Muster ist wahrscheinlich bereits weit verbreitet, daher wird es nun zur Unterstützung hinzugefügt.Referenzen: #10280
schema¶
[schema] [bug] ¶
Die Darstellung des nur für Oracle geltenden Parameters
Identity.order, der sowohl zuSequenceals auch zuIdentitygehört, wurde so modifiziert, dass er nur für den Oracle-Backend stattfindet und nicht für andere Backends wie PostgreSQL. Eine zukünftige Version wird die ParameterIdentity.order,Sequence.orderundIdentity.on_nullin Oracle-spezifische Namen umbenennen und die alten Namen veralten lassen. Diese Parameter gelten nur für Oracle.Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10207
typing¶
[typing] [usecase] ¶
Der enthaltene Typ für
Mappedwurde kovariant gemacht; dies dient einer größeren Flexibilität für Endbenutzer-Typisierungsszenarien, wie z. B. die Verwendung von Protokollen zur Darstellung bestimmter gemappter Klassenstrukturen, die an andere Funktionen übergeben werden. Als Teil dieser Änderung wurde der enthaltene Typ auch für abhängige und verwandte Typen wieSQLORMOperations,WriteOnlyMappedundSQLColumnExpressionkovariant gemacht. Pull-Request von Roméo Després.Referenzen: #10288
[typing] [bug] ¶
Regression, die in 2.0.20 durch die Behebung von #9600 eingeführt wurde, wurde behoben, die versuchte, eine formalere Typisierung zu
MetaData.naming_conventionhinzuzufügen. Diese Änderung verhinderte, dass einfache Benennungskonventionswörterbücher die Typisierung bestanden, und wurde angepasst, damit einfache Wörterbücher aus Zeichenketten für Schlüssel sowie Wörterbücher, die Beschränkungstypen als Schlüssel verwenden, oder eine Mischung aus beidem, wieder akzeptiert werden.Als Teil dieser Änderung werden auch weniger gebräuchliche Formen des Benennungskonventionswörterbuchs typisiert, einschließlich der Tatsache, dass es derzeit
Constraint-Typobjekte als Schlüssel zulässt.[typing] [bug] ¶
Behobene Typannotation für
__class_getitem__(), angewendet auf dieVisitable-Klasse am Ende von Expression-Konstrukten, umAnyfür einen Schlüssel anstelle vonstrzu akzeptieren. Dies hilft bei einigen IDEs wie PyCharm beim Versuch, Typannotationen für SQL-Konstrukte mit generischen Selektoren zu schreiben. Pull-Request von Jordan Macdonald.Referenzen: #9878
[typing] [bug] ¶
Die Kernklasse „SQL-Element“
SQLCoreOperationswurde repariert, um die__hash__()-Methode aus einer Typisierungs-Perspektive zu unterstützen, da Objekte wieColumnund ORMInstrumentedAttributehashbar sind und als Schlüssel in Wörterbüchern in der öffentlichen API für dieUpdate- undInsert-Konstrukte verwendet werden. Zuvor wussten Typchecker nicht, dass das Wurzel-SQL-Element hashbar war.Referenzen: #10353
[typing] [bug] ¶
Typisierungsproblem mit
Existing.select_from()behoben, das die Verwendung mit ORM-Klassen verhinderte.Referenzen: #10337
[typing] [bug] ¶
Aktualisierte Typannotationen für ORM-Ladeoptionen, die auf die Akzeptanz von nur „*“ anstelle von beliebigen Zeichenketten für Zeichenkettenargumente beschränkt sind. Pull-Request von Janek Nouvertné.
Referenzen: #10131
postgresql¶
[postgresql] [bug] ¶
Behobene Regression, die in Version 2.0 aufgrund von #8491 auftrat, bei der der überarbeitete „Ping“ für PostgreSQL-Dialekte, wenn der Parameter
create_engine.pool_pre_pingverwendet wurde, die Verwendung von asyncpg mit PGBouncer im „Transaktions“-Modus beeinträchtigte, da die mehreren PostgreSQL-Befehle, die von asyncpg ausgegeben wurden, über mehrere Verbindungen verteilt werden konnten, was zu Fehlern führte. Dies lag an der fehlenden Transaktion um diesen neu überarbeiteten „Ping“. Der Ping wird jetzt innerhalb einer Transaktion aufgerufen, genauso wie es bei allen anderen Backends implizit ist, die auf der pep-249 DBAPI basieren. Dies garantiert, dass die von asyncpg für diesen Befehl gesendete Befehlsreihe auf derselben Backend-Verbindung aufgerufen wird, ohne dass sie mitten im Befehl zu einer anderen Verbindung springt. Die Transaktion wird nicht verwendet, wenn der asyncpg-Dialekt im „AUTOCOMMIT“-Modus verwendet wird, der mit dem PGBouncer-Transaktionsmodus weiterhin inkompatibel ist.Referenzen: #10226
misc¶
[bug] [setup] ¶
Behobenes sehr altes Problem, bei dem die vollständige Ausdehnung von SQLAlchemy-Modulen, einschließlich
sqlalchemy.testing.fixtures, außerhalb eines Pytest-Laufs nicht importiert werden konnte. Dies eignet sich für Inspektionswerkzeuge wiepkgutil, die versuchen, alle installierten Module in allen Paketen zu importieren.Referenzen: #10321
2.0.20¶
Veröffentlicht: 15. August 2023orm¶
[orm] [usecase] ¶
Implementierung des „RETURNING ‚*‘“-Anwendungsfalls für ORM-aktivierte DML-Anweisungen. Dies wird in so vielen Fällen wie möglich gerendert und gibt die ungefilterte Ergebnismenge zurück, wird jedoch nicht für mehr-Parameter „ORM Bulk INSERT“-Anweisungen unterstützt, die spezifische Rendering-Anforderungen für Spalten haben.
Referenzen: #10192
[orm] [bug] ¶
Behobenes grundlegendes Problem, das einige Formen von ORM-„Annotationen“ für Unterabfragen, die
Select.join()gegen ein Beziehungsziel verwendeten, verhinderte. Diese Annotationen werden immer dann verwendet, wenn eine Unterabfrage in speziellen Situationen wie innerhalb vonPropComparator.and_()und anderen ORM-spezifischen Szenarien verwendet wird.Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10223
[orm] [bug] ¶
Behobenes Problem, bei dem die ORM-Generierung eines SELECT aus einem verknüpften Vererbungsmodell mit gleichnamigen Spalten in Oberklasse und Unterklasse irgendwie nicht die richtige Liste von Spaltennamen an den
CTE-Konstrukt sendete, als die RECURSIVE-Spaltenlisten generiert wurden.Referenzen: #10169
[orm] [bug] ¶
Behobenes recht großes Problem, bei dem Ausführungsoptionen, die an
Session.execute()übergeben wurden, sowie Ausführungsoptionen, die lokal für die ORM-ausgeführte Anweisung selbst waren, nicht an Eager-Loader wieselectinload(),immediateload()undsqlalchemy.orm.subqueryload()weitergegeben wurden. Dies machte es unmöglich, Dinge wie das Deaktivieren des Caches für eine einzelne Anweisung oder die Verwendung vonschema_translate_mapfür eine einzelne Anweisung, sowie die Verwendung benutzerdefinierter Ausführungsoptionen. Eine Änderung wurde vorgenommen, bei der **alle** benutzerseitigen Ausführungsoptionen fürSession.execute()an zusätzliche Lader weitergegeben werden.Als Teil dieser Änderung kann die Warnung vor „übertrieben tiefen“ Eager-Ladern, die zur Deaktivierung des Cachings führt, pro Anweisung unterdrückt werden, indem
execution_options={"compiled_cache": None}anSession.execute()übergeben wird, was das Caching für die gesamte Reihe von Anweisungen in diesem Geltungsbereich deaktiviert.Referenzen: #10231
[orm] [bug] ¶
Behobenes Problem, bei dem das interne Klonen, das vom ORM für Ausdrücke wie
Comparator.any()zur Erzeugung korrelierter EXISTS-Konstrukte verwendet wird, die Funktion zur Warnung vor „kartesischen Produkten“ des SQL-Kompilierers beeinträchtigte. Dies führte dazu, dass der SQL-Kompilierer warnte, obwohl alle Elemente der Anweisung korrekt verknüpft waren.Referenzen: #10124
[orm] [bug] ¶
Behobenes Problem, bei dem die Ladefunktion
lazy="immediateload"unter Umständen, unter denen der Ladevorgang nicht stattfinden sollte (z. B. bei rekursiven, selbstreferenziellen Ladevorgängen), ein internes Lade-Token in das ORM-abgebildete Attribut einfügte. Als Teil dieser Änderung berücksichtigt die Ladefunktionlazy="immediateload"jetzt den Parameterrelationship.join_depthfür selbstreferenzielle Eager-Ladevorgänge auf dieselbe Weise wie bei anderen Eager-Ladern. Wenn er nicht gesetzt oder auf Null gesetzt ist, findet kein selbstreferenzieller Immediateload statt; ein Wert von eins oder höher führt zum Immediateload bis zu dieser Tiefe.Referenzen: #10139
[orm] [bug] ¶
Behobenes Problem, bei dem Wörterbuch-basierte Sammlungen wie
attribute_keyed_dict()nicht vollständig gepickelt/entpickelt wurden, was zu Problemen beim Versuch führte, eine solche Sammlung nach dem Entpickeln zu verändern.Referenzen: #10175
[orm] [bug] ¶
Behobenes Problem, bei dem das Verketten von
load_only()oder die Wildcard-Verwendung vondefer()aus einem anderen Eager-Lader mittels einesaliased()gegen eine verknüpfte Vererbungsunterklasse dazu führte, dass die Spalten, die lokal zur Oberklasse gehörten, nicht wirksam wurden.Referenzen: #10125
[orm] [bug] ¶
Behobenes Problem, bei dem ein ORM-aktivierter
select()-Konstrukt keine CTEs rendert, die nur über die MethodeSelect.add_cte()hinzugefügt wurden und die sonst nicht in der Anweisung referenziert wurden.Referenzen: #10167
examples¶
[examples] [bug] ¶
Die dogpile_caching-Beispiele wurden für 2.0-Style-Abfragen aktualisiert. Innerhalb der „Caching Query“-Logik selbst wurde eine Bedingung hinzugefügt, um zwischen
Queryundselect()bei der Invalidierung zu unterscheiden.
engine¶
[engine] [bug] ¶
Behobenes kritisches Problem, bei dem das Setzen von
create_engine.isolation_levelaufAUTOCOMMIT(im Gegensatz zur Verwendung der MethodeEngine.execution_options()) dazu führte, dass „autocommit“ für eine gepoolte Verbindung nicht wiederhergestellt wurde, wenn eine alternative Isolationsstufe temporär mitConnection.execution_options.isolation_levelausgewählt wurde.Referenzen: #10147
sql¶
[sql] [bug] ¶
Behobenes Problem, bei dem das Entpickeln einer
Columnoder eines anderenColumnElementdas korrekte „Comparator“-Objekt, das zur Generierung von SQL-Ausdrücken verwendet wird, die spezifisch für das Typobjekt sind, nicht wiederherstellte.Diese Änderung ist auch zurückportiert zu: 1.4.50
Referenzen: #10213
typing¶
[typing] [usecase] ¶
Hinzugefügte neue, nur für die Typisierung bestimmte Hilfsfunktionen
Nullable()undNotNullable(), um eine Spalte oder ORM-Klasse als nullable bzw. nicht nullable zu typisieren. Diese Funktionen sind zur Laufzeit No-Ops und geben die Eingabe unverändert zurück.Referenzen: #10173
[typing] [bug] ¶
Typisierungsverbesserungen
CursorResultwird für einige Formen vonSession.execute()zurückgegeben, wenn DML ohne RETURNING verwendet wirdKorrigierter Typ für den Parameter
Query.with_for_update.ofinnerhalb vonQuery.with_for_update()Verbesserungen an
_DMLColumnArgument, einem Typ, der von einigen DML-Methoden zum Übergeben von Spaltenausdrücken verwendet wirdÜberladung zu
literal()hinzugefügt, damit der Rückgabetyp alsBindParameter[NullType]abgeleitet wird, wenn derliteral.type_-Parameter None istÜberladungen zu
ColumnElement.op()hinzugefügt, damit der abgeleitete Typ, wennColumnElement.op.return_typenicht angegeben ist,Callable[[Any], BinaryExpression[Any]]istFehlende Überladung zu
ColumnElement.__add__()hinzugefügt
Pull-Request von Mehdi Gmira.
Referenzen: #9185
[typing] [bug] ¶
Behobenes Problem in den Methoden von
SessionundAsyncSessionwieSession.connection(), bei denen der ParameterSession.connection.execution_optionsauf einen internen, nicht benutzerseitigen Typ hartkodiert war.Referenzen: #10182
asyncio¶
[asyncio] [usecase] ¶
Hinzugefügte neue Methoden
AsyncConnection.aclose()als Synonym fürAsyncConnection.close()undAsyncSession.aclose()als Synonym fürAsyncSession.close()zu den ObjektenAsyncConnectionundAsyncSession, um die Kompatibilität mit dem Konstrukt@contextlib.aclosingder Python-Standardbibliothek zu gewährleisten. Pull-Request von Grigoriev Semyon.Referenzen: #9698
mysql¶
[mysql] [usecase] ¶
Aktualisierter aiomysql-Dialekt, da der Dialekt anscheinend wieder gepflegt wird. Wieder in die CI-Tests aufgenommen mit Version 0.2.0.
Diese Änderung ist auch zurückportiert zu: 1.4.50
2.0.19¶
Veröffentlicht: 15. Juli 2023orm¶
[orm] [bug] ¶
Behobenes Problem, bei dem das direkte Setzen einer Beziehungsammlung, bei der ein Objekt aus der neuen Sammlung bereits vorhanden war, kein Kaskadenereignis für dieses Objekt auslöste, was dazu führte, dass es nicht zur
Sessionhinzugefügt wurde, wenn es noch nicht vorhanden war. Dies ähnelt in der Natur #6471 und ist aufgrund der Entfernung voncascade_backrefsin der 2.0-Serie ein offensichtlicheres Problem. Das EreignisAttributeEvents.append_wo_mutation(), das im Rahmen von #6471 hinzugefügt wurde, wird nun auch für vorhandene Mitglieder einer Sammlung emittiert, die in einer Bulk-Menge derselben Sammlung vorhanden sind.Referenzen: #10089
[orm] [bug] ¶
Behobenes Problem, bei dem Objekte, die über Backref mit einer nicht geladenen Sammlung assoziiert waren, aber nicht in die
Sessiongemerged wurden, aufgrund der Entfernung voncascade_backrefsin der 2.0-Serie, keine Warnung ausgaben, dass diese Objekte nicht in einen Flush einbezogen wurden, obwohl sie ausstehende Mitglieder der Sammlung waren. In anderen solchen Fällen wird eine Warnung ausgegeben, wenn eine zu flushende Sammlung nicht angehängte Objekte enthält, die im Wesentlichen verworfen werden. Die Hinzufügung der Warnung für Backref-Pending-Sammlungsmitglieder schafft mehr Konsistenz mit Sammlungen, die zu unterschiedlichen Zeiten basierend auf unterschiedlichen Relationship-Lade-Strategien vorhanden oder nicht vorhanden und möglicherweise geflusht oder nicht geflusht sind.Referenzen: #10090
[orm] [bug] [regression] ¶
Behobene zusätzliche Regression, die durch #9805 verursacht wurde, bei der die aggressivere Weitergabe des „ORM“-Flags auf Anweisungen zu einem internen Attributfehler führen konnte, wenn eine ORM
Query-Konstrukt eingebettet war, das dennoch keine ORM-Entitäten enthielt, in einer Core SQL-Anweisung, in diesem Fall ORM-aktivierte UPDATE- und DELETE-Anweisungen.Referenzen: #10098
engine¶
[engine] [bug] ¶
Umbenannt
Row.tundRow.tuple()inRow._tundRow._tuple(). Dies geschieht gemäß der Richtlinie, dass alle Methoden und vordefinierten Attribute vonRowim Stil dernamedtupleder Python-Standardbibliothek sein sollen, bei der alle festen Namen mit einem führenden Unterstrich versehen sind, um Namenskonflikte mit vorhandenen Spaltennamen zu vermeiden. Die vorherige Methode/Attribut ist nun veraltet und gibt eine Deprecation-Warnung aus.Referenzen: #10093
[engine] [bug] ¶
Erkennung von Nicht-String-, Nicht-
URL-Objekten in der Funktionmake_url()hinzugefügt. Dies ermöglicht, dassArgumentErrorsofort ausgelöst wird, anstatt später zu Fehlern zu führen. Spezielle Logik stellt sicher, dass Mock-Formen vonURLdurchgelassen werden. Pull-Request von Grigoriev Semyon.Referenzen: #10079
postgresql¶
[postgresql] [bug] ¶
Behobene Regression, die durch Verbesserungen bei der PostgreSQL-URL-Analyse in #10004 verursacht wurde, bei der „host“-Query-String-Argumente mit Doppelpunkten zur Unterstützung verschiedener Drittanbieter-Proxy-Server und/oder Dialekte nicht korrekt analysiert wurden, da diese als
host:port-Kombinationen interpretiert wurden. Die Analyse wurde aktualisiert, um einen Doppelpunkt nur dann als Angabe eineshost:port-Wertes zu betrachten, wenn der Hostname nur alphanumerische Zeichen mit Punkten oder Bindestrichen enthält (z. B. keine Schrägstriche), gefolgt von genau einem Doppelpunkt, gefolgt von einem rein numerischen Token von null oder mehr Ziffern. In allen anderen Fällen wird die vollständige Zeichenkette als Host übernommen.Referenzen: #10069
[postgresql] [bug] ¶
Behobenes Problem, bei dem Vergleiche mit dem Datentyp
CITEXTdie rechte Seite zuVARCHARkonvertierten, was dazu führte, dass die rechte Seite nicht alsCITEXT-Datentyp interpretiert wurde, für die Dialekte asyncpg, psycopg3 und pg80000. Dies führte dazu, dass derCITEXT-Typ praktisch unbrauchbar war; dies ist nun behoben und die Testsuite wurde korrigiert, um ordnungsgemäß zu überprüfen, dass Ausdrücke korrekt gerendert werden.Referenzen: #10096
2.0.18¶
Veröffentlicht: 5. Juli 2023engine¶
[engine] [bug] ¶
Die Funktion
create_engine.schema_translate_mapwurde so angepasst, dass nun **alle** Schemanamen in der Anweisung tokenisiert werden, unabhängig davon, ob ein bestimmter Name in der unmittelbaren Schematransformationskarte enthalten ist oder nicht. Außerdem wird im Falle einer fehlenden Entsprechung im aktuellen Transformationskarteneintrag auf die ursprüngliche Bezeichnung zurückgegriffen, was die wiederholte Verwendung eines kompilierten Objekts mit unterschiedlichen Schematransformationskarten zur Laufzeit ermöglicht, ohne dass es zu Fehlern kommt. Zusätzlich wurde die Erkennung vonschema_translate_map-Dictionaries hinzugefügt, die über Aufrufe hinweg einenNone-Schlüssel hinzufügen oder verlieren. Dies wirkt sich auf die Kompilierung der Anweisung aus und ist nicht mit dem Caching vereinbar. In diesen Fällen wird eine Ausnahme ausgelöst.Referenzen: #10025
sql¶
[sql] [bug] ¶
Behobenes Problem, bei dem die Methode
ColumnOperators.regexp_match()bei Verwendung von „flags“ keinen „stabilen“ Cache-Schlüssel erzeugte, d. h. der Cache-Schlüssel änderte sich jedes Mal, was zu Cache-Verschmutzung führte. Das gleiche Problem bestand fürColumnOperators.regexp_replace()mit sowohl den Flags als auch dem eigentlichen Ersetzungsausdruck. Die Flags werden nun als feste Modifikator-Zeichenketten dargestellt, die als SafeStrings gerendert werden, anstatt als gebundene Parameter, und der Ersetzungsausdruck wird im primären Teil des „binären“ Elements festgelegt, damit er einen geeigneten Cache-Schlüssel erzeugt.Beachten Sie, dass im Rahmen dieser Änderung die Parameter
ColumnOperators.regexp_match.flagsundColumnOperators.regexp_replace.flagsso geändert wurden, dass sie nur als literale Strings gerendert werden, während sie zuvor als vollständige SQL-Ausdrücke, typischerweise gebundene Parameter, gerendert wurden. Diese Parameter sollten immer als einfache Python-Strings und nicht als SQL-Ausdruckskonstrukte übergeben werden; es wird nicht erwartet, dass SQL-Ausdruckskonstrukte für diesen Parameter in der Praxis verwendet wurden, daher handelt es sich um eine rückwärts inkompatible Änderung.Die Änderung modifiziert auch die interne Struktur des generierten Ausdrucks für
ColumnOperators.regexp_replace()mit oder ohne Flags und fürColumnOperators.regexp_match()mit Flags. Drittanbieter-Dialekte, die möglicherweise eigene Regex-Implementierungen hatten (keine solchen Dialekte konnten bei einer Suche gefunden werden, daher wird die Auswirkung als gering eingeschätzt), müssten die Traversierung der Struktur anpassen, um dies zu berücksichtigen.Diese Änderung wird auch zurückportiert nach: 1.4.49
Referenzen: #10042
[sql] [bug] ¶
Behobenes Problem im meist internen Konstrukt
CacheKey, bei dem der Operator__ne__()nicht korrekt implementiert war, was zu unsinnigen Ergebnissen beim Vergleich vonCacheKey-Instanzen untereinander führte.Diese Änderung wird auch zurückportiert nach: 1.4.49
extensions¶
[extensions] [usecase] ¶
Neue Option zu
association_proxy()hinzugefügt:association_proxy.create_on_none_assignment; wenn einem Assoziationsproxy, der auf eine skalare Beziehung verweist, der WertNonezugewiesen wird und das referenzierte Objekt nicht vorhanden ist, wird ein neues Objekt über den Ersteller erstellt. Dies war anscheinend ein undefiniertes Verhalten in der Serie 1.2, das stillschweigend entfernt wurde.Referenzen: #10013
typing¶
[typing] [usecase] ¶
Verbesserte Typisierung bei der Verwendung von eigenständigen Operatorfunktionen aus
sqlalchemy.sql.operatorswiesqlalchemy.sql.operators.eq.Referenzen: #10054
[typing] [bug] ¶
Einige Typisierungen im Konstrukt
aliased()wurden korrigiert, sodass ein mitTable.alias()aliasierterTable-Objekt korrekt akzeptiert wird, sowie allgemeine Unterstützung fürFromClause-Objekte als "selectable"-Argument, da dies alles unterstützt wird.Referenzen: #10061
postgresql¶
[postgresql] [usecase] ¶
Unterstützung für mehrere Hosts für den asyncpg-Dialekt hinzugefügt. Allgemeine Verbesserungen und Fehlerprüfungen wurden zu den PostgreSQL-URL-Routinen für den "Multihost"-Anwendungsfall hinzugefügt. Pull-Request von Ilia Dmitriev.
Siehe auch
Referenzen: #10004
[postgresql] [bug] ¶
Neuer Parameter
native_inet_types=Falsezu allen PostgreSQL-Dialekten hinzugefügt, der angibt, dass Konverter, die vom DBAPI zur Konvertierung von Zeilen aus PostgreSQLINETundCIDR-Spalten in Pythonipaddress-Datentypen verwendet werden, deaktiviert werden sollten, und stattdessen Strings zurückgegeben werden. Dies ermöglicht die Migration von Code, der für diese Datentypen Strings verwendet, zu asyncpg, psycopg oder pg8000 ohne Codeänderungen, abgesehen vom Hinzufügen dieses Parameters zur Funktioncreate_engine()odercreate_async_engine().Siehe auch
Referenzen: #9945
mariadb¶
mssql¶
[mssql] [usecase] ¶
Unterstützung für die Erstellung und Reflexion von COLUMNSTORE-Indizes im MSSQL-Dialekt hinzugefügt. Kann bei Indizes mit
mssql_columnstore=Trueangegeben werden.Referenzen: #7340
[mssql] [bug] [sql] ¶
Behobenes Problem, bei dem das Casten zu einem String-Typ mit einer expliziten Kollation die COLLATE-Klausel innerhalb der CAST-Funktion gerendert hat, was zu einem Syntaxfehler führte.
Referenzen: #9932
2.0.17¶
Veröffentlicht: 23. Juni 2023orm¶
[orm] [bug] [regression] ¶
Behobene Regression in der Serie 2.0, bei der eine Abfrage, die
undefer_group()mitselectinload()odersubqueryload()verwendete, einenAttributeErrorauslöste. Pull-Request von Matthew Martin.Referenzen: #9870
[orm] [bug] ¶
Behobenes Problem in der ORM Annotated Declarative, das die Verwendung eines
declared_attrin einem Mixin verhinderte, das keinenMapped-Datentyp zurückgab, sondern stattdessen einen ergänzenden ORM-Datentyp wieAssociationProxyzurückgab. Die Declarative-Laufzeit versuchte fälschlicherweise, diese Annotation als zu mappend zu interpretieren und löste einen Fehler aus.Referenzen: #9957
[orm] [bug] [typing] ¶
Behobenes Typisierungs Problem, bei dem der Rückgabetyp von
AssociationProxyaus einerdeclared_attr-Funktion nicht zulässig war.Referenzen: #9957
[orm] [bug] [regression] ¶
Behobene Regression, die in 2.0.16 durch #9879 eingeführt wurde, bei der die Übergabe eines Callables an den Parameter
mapped_column.defaultvonmapped_column, während gleichzeitiginit=Falsegesetzt war, diesen Wert als Dataclass-Standardwert interpretierte, der direkt neuen Instanzen des Objekts zugewiesen wurde und dabei den Standardgenerator umging, der als Wert vonColumn.defaultauf der zugrunde liegendenColumnwirkte. Diese Bedingung wird nun erkannt, sodass das vorherige Verhalten beibehalten wird; es wird jedoch eine Deprecation-Warnung für diese mehrdeutige Verwendung ausgegeben; um den Standardgenerator für eineColumnzu füllen, sollte der Parametermapped_column.insert_defaultverwendet werden, der vom Parametermapped_column.default, dessen Name gemäß pep-681 korrigiert wurde, abgegrenzt wird.Referenzen: #9936
[orm] [bug] ¶
Zusätzliche Absicherung und Dokumentation für das "state change"-System der ORM
Session, das die gleichzeitige Verwendung vonSession- undAsyncSession-Objekten erkennt; eine zusätzliche Prüfung wird im Prozess zur Beschaffung von Verbindungen aus der zugrunde liegenden Engine hinzugefügt, was ein kritischer Abschnitt in Bezug auf das interne Verbindungsmanagement ist.Referenzen: #9973
[orm] [bug] ¶
Behobenes Problem in der ORM-Lade-Strategie, das längere Ketten von
contains_eager()-Ladeoptionen über komplexe, vererbende, polymorphe / aliasierte / of_type()-Beziehungsketten hinweg ermöglicht, damit diese in Abfragen korrekt wirksam werden.Referenzen: #10006
[orm] [bug] ¶
Behobenes Problem bei der Unterstützung des
Enum-Datentyps in derregistry.type_annotation_map, die erstmals im Rahmen von #8859 hinzugefügt wurde. Dabei schlug die Verwendung eines benutzerdefiniertenEnummit fester Konfiguration in der Map fehl, denEnum.name-Parameter zu übertragen, was unter anderem dazu führte, dass PostgreSQL-Enums nicht funktionierten, wenn die Enum-Werte als einzelne Werte übergeben wurden. Die Logik wurde aktualisiert, sodass "name" übertragen wird, aber auch, dass der Standard-Enum, der gegen die reine Python-Klasse enum.Enum oder eine andere "leere" Enum gerichtet ist, keinen hartkodierten Namen von"enum"setzt.Referenzen: #9963
orm declarative¶
[orm] [declarative] [bug] ¶
Eine Warnung wird ausgegeben, wenn ein ORM
relationship()und andereMapperProperty-Objekte gleichzeitig zwei verschiedenen Klassenattributen zugewiesen werden; nur eines der Attribute wird gemappt. Eine Warnung für diesen Zustand gab es bereits fürColumnundmapped_column-Objekte.Referenzen: #3532
extensions¶
[extensions] [bug] ¶
Behobenes Problem im mypy-Plugin für die Verwendung mit mypy 1.4.
Diese Änderung wird auch zurückportiert nach: 1.4.49
typing¶
[typing] [bug] ¶
Behobenes Typisierungs Problem, das die vollständige Verwendung von
WriteOnlyMapped- undDynamicMapped-Attributen in ORM-Abfragen verhinderte.Referenzen: #9985
postgresql¶
[postgresql] [usecase] ¶
Der pg8000-Dialekt unterstützt nun RANGE- und MULTIRANGE-Datentypen, wobei die vorhandene RANGE-API verwendet wird, die unter Range and Multirange Types beschrieben ist. Bereichs- und Multibereichstypen werden im pg8000-Treiber ab Version 1.29.8 unterstützt. Pull-Request von Tony Locke.
Referenzen: #9965
2.0.16¶
Veröffentlicht: 10. Juni 2023platform¶
[platform] [usecase] ¶
Kompatibilitätsverbesserungen, die es dem vollständigen Test-Suite ermöglichen, auf Python 3.12.0b1 zu bestehen.
orm¶
[orm] [usecase] ¶
Verbesserte `DeferredReflection.prepare()` so, dass sie beliebige `**kw`-Argumente akzeptiert, die an `MetaData.reflect()` übergeben werden, was Anwendungsfälle wie die Reflexion von Views sowie Dialekt-spezifische Argumente ermöglicht. Zusätzlich wurde das Argument `DeferredReflection.prepare.bind` modernisiert, sodass entweder eine `Engine` oder `Connection` als "bind"-Argument akzeptiert werden.
Referenzen: #9828
[orm] [bug] ¶
Behobenes Problem, bei dem die deklarative Basisklasse `DeclarativeBaseNoMeta` nicht mit nicht gemappten Mixins oder abstrakten Klassen funktionierte und stattdessen einen `AttributeError` auslöste.
Referenzen: #9862
[orm] [bug] [regression] ¶
Behobene Regression in der Serie 2.0, bei der der Standardwert von `validates.include_backrefs` für die Funktion `validates()` auf `False` geändert wurde. Dieser Standardwert wird nun wieder auf `True` gesetzt.
Referenzen: #9820
[orm] [bug] ¶
Behobener Fehler in der neuen Funktion, die es ermöglicht, eine WHERE-Klausel mit dem ORM Bulk UPDATE nach Primärschlüssel zu verwenden, das in Version 2.0.11 im Rahmen von #9583 hinzugefügt wurde. Zuvor wurden Dictionaries, die nicht die Primärschlüsselwerte für jede Zeile enthielten, über den Bulk-Prozess ausgeführt und schlossen "pk=NULL" für die Zeilen ein, was stillschweigend fehlschlug. Nun wird eine Ausnahme ausgelöst, wenn keine Primärschlüsselwerte für Bulk-UPDATE angegeben werden.
Referenzen: #9917
[orm] [bug] [dataclasses] ¶
Behobenes Problem, bei dem die Generierung von Dataclass-Feldern, die einen `default`-Wert angaben und `init=False` gesetzt hatten, nicht funktionierte. Das Verhalten von Dataclasses in diesem Fall ist, den Standardwert auf der Klasse zu setzen, was nicht mit den von SQLAlchemy verwendeten Deskriptoren kompatibel ist. Um diesen Fall zu unterstützen, wird der Standardwert bei der Generierung des Dataclass in einen `default_factory` umgewandelt.
Referenzen: #9879
[orm] [bug] ¶
Eine Deprecation-Warnung wird ausgegeben, wenn eine Eigenschaft zu einem `Mapper` hinzugefügt wird, bei dem bereits eine ORM-gemappte Eigenschaft konfiguriert ist oder ein Attribut bereits auf der Klasse vorhanden ist. Zuvor gab es für diesen Fall eine nicht-Deprecation-Warnung, die nicht konsistent ausgegeben wurde. Die Logik für diese Warnung wurde verbessert, sodass sie das Ersetzen von Attributen durch Endbenutzer erkennt, ohne falsche positive Ergebnisse für interne Declarative und andere Fälle zu haben, in denen das Ersetzen von Deskriptoren durch neue erwartet wird.
Referenzen: #9841
[orm] [bug] ¶
Verbesserte Argumentprüfung für den Parameter `map_imperatively.local_table` der Methode `registry.map_imperatively()`, um sicherzustellen, dass nur eine `Table` oder eine andere `FromClause` übergeben wird und keine bereits gemappte Klasse, was zu undefiniertem Verhalten führen würde, da das Objekt für eine neue Mappung weiter interpretiert wird.
Referenzen: #9869
[orm] [bug] ¶
Das Attribut `InstanceState.unloaded_expirable` ist ein Synonym für `InstanceState.unloaded` und ist nun veraltet; dieses Attribut war schon immer implementierungsspezifisch und hätte nicht öffentlich sein sollen.
Referenzen: #9913
asyncio¶
[asyncio] [usecase] ¶
Neuer Parameter `create_async_engine.async_creator` zu `create_async_engine()` hinzugefügt, der denselben Zweck erfüllt wie der Parameter `create_engine.creator` von `create_engine()`. Dies ist ein aufrufloser Aufruf, der eine neue asyncio-Verbindung bereitstellt und den asynchronen Treiber auf Treiberebene direkt verwendet. Die Funktion `create_async_engine()` wird die treiberseitige Verbindung in die entsprechenden Strukturen verpacken. Pull-Request von Jack Wotherspoon.
Referenzen: #8215
postgresql¶
[postgresql] [usecase] [reflection] ¶
NAME-Spalten werden beim Verwenden von `ARRAY_AGG` in der PostgreSQL-Reflexion auf `TEXT` gecastet. Dies scheint die Kompatibilität mit einigen PostgreSQL-Derivaten zu verbessern, die Aggregationen auf dem NAME-Typ möglicherweise nicht unterstützen.
Referenzen: #9838
[postgresql] [usecase] ¶
Die benutzerdefinierten PostgreSQL-Operatordefinitionen wurden vereinheitlicht, da sie zwischen mehreren verschiedenen Datentypen geteilt werden.
Referenzen: #9041
[postgresql] [usecase] ¶
Unterstützung für die PostgreSQL 10 `NULLS NOT DISTINCT`-Funktion von eindeutigen Indizes und eindeutigen Constraints wurde über die Dialektoption `postgresql_nulls_not_distinct` hinzugefügt. Die Reflexionslogik wurde aktualisiert, um diese Option ebenfalls korrekt zu berücksichtigen. Pull-Request von Pavel Siarchenia.
Referenzen: #8240
[postgresql] [bug] ¶
Korrekte Präzedenz für PostgreSQL-spezifische Operatoren wie `@>` verwendet. Zuvor war die Präzedenz falsch, was zu falschen Klammern bei der Wiedergabe gegen eine `ANY`- oder `ALL`-Konstruktion führte.
Referenzen: #9836
[postgresql] [bug] ¶
Behobenes Problem, bei dem die Parameter `ColumnOperators.like.escape` und ähnliche Parameter keinen leeren String als Argument zuließen, der als "escape"-Zeichen weitergegeben würde; dies ist eine von PostgreSQL unterstützte Syntax. Pull-Request von Martin Caslavsky.
Referenzen: #9907
2.0.15¶
Veröffentlicht: 19. Mai 2023orm¶
[orm] [bug] ¶
Da immer mehr Projekte die neuen "2.0"-ORM-Abfragen verwenden, wird deutlich, dass die bedingte Natur von "autoflush", die darauf basiert, ob die gegebene Anweisung ORM-Entitäten referenziert, immer wichtiger wird. Bis jetzt basierte das "ORM"-Flag für eine Anweisung lose darauf, ob die Anweisung Zeilen zurückgibt, die ORM-Entitäten oder -Spalten entsprechen; der ursprüngliche Zweck des "ORM"-Flags war es, ORM-Entitäts-Fetching-Regeln zu ermöglichen, die Post-Processing auf Core-Ergebnis-Sets sowie ORM-Lader-Strategien auf die Anweisung anwenden. Für Anweisungen, die nicht auf Zeilen basieren, die ORM-Entitäten enthalten, galt das "ORM"-Flag als weitgehend unnötig.
Es mag immer noch der Fall sein, dass "autoflush" für *alle* Verwendungen von `Session.execute()` und verwandten Methoden besser greifen würde, selbst für rein Core-SQL-Konstrukte. Dies könnte jedoch immer noch Legacy-Fälle beeinträchtigen, bei denen dies nicht erwartet wird und eher eine Sache für 2.1 ist. Vorerst wurden jedoch die Regeln für das "ORM-Flag" erweitert, sodass eine Anweisung, die ORM-Entitäten oder -Attribute irgendwo enthält, einschließlich allein in der WHERE- / ORDER-BY- / GROUP-BY-Klausel, in skalar-Subqueries usw., dieses Flag aktiviert. Dies bewirkt, dass "autoflush" für solche Anweisungen auftritt und auch über das Ereignisattribut `ORMExecuteState.is_orm_statement` sichtbar ist.
Referenzen: #9805
postgresql¶
[postgresql] [bug] [regression] ¶
Reparierte den Basis-Datentyp
Uuidfür das PostgreSQL-Dialekt, um den PG-spezifischenUUID-Datentyp vollständig zu nutzen, wenn "native_uuid" ausgewählt ist, sodass PG-Treiberverhalten einbezogen werden. Dieses Problem wurde durch die Verbesserung von insertmanyvalues im Rahmen von #9618 deutlich, bei der der asyncpg-Treiber, ähnlich wie bei #9739, sehr empfindlich auf das Vorhandensein oder Nichtvorhandensein von Datentyp-K överläufen reagiert. Der nativeUUID-Datentyp des PostgreSQL-Treibers muss aufgerufen werden, wenn dieser generische Typ verwendet wird, damit diese K överläufe stattfinden.Referenzen: #9808
2.0.14¶
Veröffentlicht: 18. Mai 2023orm¶
[orm] [bug] ¶
Die Implementierung von
JoinedLoaderwurde modifiziert, um einen einfacheren Ansatz in einem bestimmten Bereich zu verwenden, in dem zuvor eine zwischengespeicherte Struktur verwendet wurde, die zwischen Threads geteilt wurde. Das Ziel ist, eine potenzielle Race Condition zu vermeiden, die vermutlich die Ursache für einen bestimmten Absturz ist, der mehrfach gemeldet wurde. Die betreffende zwischengespeicherte Struktur wird über den kompilierten SQL-Cache letztendlich weiterhin "zwischengespeichert", sodass keine Leistungseinbußen erwartet werden.Referenzen: #9777
[orm] [bug] [regression] ¶
Regression behoben, bei der die Verwendung von
update()oderdelete()innerhalb einerCTE-Konstruktion, die dann in einemselect()verwendet wurde, einenCompileErrorauslöste. Dies war auf ORM-bezogene Regeln für die Ausführung von UPDATE/DELETE-Anweisungen auf ORM-Ebene zurückzuführen.Referenzen: #9767
[orm] [bug] ¶
Problem behoben, bei dem bei Verwendung einer
ForeignKey(oder einer anderen Constraint auf Spaltenebene) innerhalb vonmapped_column()im neuen ORM Annotated Declarative, die dann über pep-593Annotatedin Modelle kopiert wurde, Duplikate jeder Constraint auf dieColumnangewendet wurden, wie sie in der Ziel-Tableerstellt wurde. Dies führte zu fehlerhaftem CREATE TABLE DDL sowie zu Migrationsanweisungen unter Alembic.Referenzen: #9766
[orm] [bug] ¶
Problem behoben, bei dem zusätzliche Kriteriën für Beziehungen mit der Ladeoption
joinedload(), wobei die zusätzlichen Kriteriën selbst korrelierte Unterabfragen enthielten, die sich auf die geladenen Entitäten bezogen und daher auch eine "Anpassung" an aliasierte Entitäten erforderten, von dieser Anpassung ausgeschlossen wurden, was zu einer falschen ON-Klausel für joinedload führte.Referenzen: #9779
sql¶
[sql] [usecase] ¶
Die MSSQL-Funktion
try_cast()wurde in den Import-Namensraumsqlalchemy.verallgemeinert, damit sie auch von Drittanbieter-Dialekten implementiert werden kann. Innerhalb von SQLAlchemy bleibt die Funktiontry_cast()ein reines SQL Server-Konstrukt, das einenCompileErrorauslöst, wenn es mit Backends verwendet wird, die es nicht unterstützen.try_cast()implementiert eine CAST, bei der nicht konvertierbare Konvertierungen als NULL zurückgegeben werden, anstatt einen Fehler auszulösen. Theoretisch könnte das Konstrukt von Drittanbieter-Dialekten für Google BigQuery, DuckDB und Snowflake sowie möglicherweise andere implementiert werden.Pull-Request dank Nick Crews.
Referenzen: #9752
[sql] [bug] ¶
Problem im
values()-Konstrukt behoben, bei dem ein interner Kompilierungsfehler auftrat, wenn das Konstrukt innerhalb einer skalaren Unterabfrage verwendet wurde.Referenzen: #9772
postgresql¶
[postgresql] [bug] ¶
Ein offenbar sehr altes Problem behoben, bei dem der Parameter
ENUM.create_type, wenn er auf seinen Nicht-StandardwertFalsegesetzt war, nicht weitergegeben wurde, wenn dieColumn, zu der er gehörte, kopiert wurde, wie es bei der Verwendung von ORM Declarative Mixins üblich ist.Referenzen: #9773
tests¶
2.0.13¶
Veröffentlicht: 10. Mai 2023orm¶
[orm] [bug] ¶
Problem behoben, bei dem ORM Annotated Declarative Vorwärtsreferenzen nicht in allen Fällen korrekt auflöste; insbesondere bei Verwendung von
from __future__ import annotationsin Kombination mit Pydantic Dataclasses.Referenzen: #9717
[orm] [bug] ¶
Problem in der neuen Verwendung von RETURNING mit Upsert-Anweisungen behoben, bei der die Ausführungsoption
populate_existingnicht an die Ladeoption weitergegeben wurde, was verhinderte, dass bestehende Attribute vor Ort aktualisiert wurden.Referenzen: #9746
[orm] [bug] ¶
Probleme mit dem Pfad von Lade-Strategien behoben, bei denen Eager-Loader wie
joinedload()/selectinload()bei vielen verschachtelten Ebenen nach einem Ladevorgang, derwith_polymorphic()oder ähnliche Konstrukte als Zwischenmitglied hatte, nicht vollständig durchlaufen konnten, was zu fehlerhaften ON-Klauseln für joinedload führte.Referenzen: #9715
[orm] [bug] ¶
Problem im Konstrukt
mapped_column()behoben, bei dem die korrekte Warnung für "Spalte X mehrmals direkt benannt" nicht ausgegeben wurde, wenn ORM-zugeordnete Attribute auf dieselbeColumnverwiesen, wenn das Konstruktmapped_column()beteiligt war, stattdessen eine interne Assertion ausgelöst wurde.Referenzen: #9630
sql¶
[sql] [usecase] ¶
Die "Cartesian Product Warning" für UPDATE- und DELETE-Anweisungen implementiert, die mehrere Tabellen enthalten, die nicht auf irgendeine Weise miteinander korreliert sind.
Referenzen: #9721
[sql] [bug] ¶
Die Basisklasse für dialektspezifische Float/Double-Typen behoben; Oracle
BINARY_DOUBLEerbt nun vonDouble, und interne Typen fürFloatfür asyncpg und pg8000 erben nun korrekt vonFloat.[sql] [bug] ¶
Problem behoben, bei dem ein
update()-Konstrukt, das mehrere Tabellen und keine VALUES-Klausel enthielt, mit einem internen Fehler ausgelöst wurde. Das aktuelle Verhalten fürUpdateohne Werte ist die Generierung einer SQL UPDATE-Anweisung mit einer leeren "set"-Klausel, sodass dies für diesen speziellen Unterfall konsistent gemacht wurde.
schema¶
typing¶
[typing] [bug] ¶
Typisierung für den Parameter
Session.get.with_for_updatevonSession.get()undSession.refresh()(sowie entsprechende Methoden aufAsyncSession) verbessert, um booleschesTrueund alle anderen Argumentformen zu akzeptieren, die der Parameter zur Laufzeit akzeptiert.Referenzen: #9762
[typing] [sql] ¶
Der Typ
ColumnExpressionArgumentwurde als öffentlich zugänglicher Typ hinzugefügt, der spaltenorientierte Argumente angibt, die an SQLAlchemy-Konstrukte übergeben werden, wie z. B.Select.where(),and_()und andere. Dies kann verwendet werden, um benutzerdefinierte Funktionen, die diese Methoden aufrufen, mit Typen zu versehen.Referenzen: #9656
asyncio¶
[asyncio] [usecase] ¶
Ein neuer Hilfs-Mixin
AsyncAttrswurde hinzugefügt, der die Verwendung von Lazy-Loadern und anderen abgelaufenen oder verzögerten ORM-Attributen mit asyncio verbessern soll. Er bietet einen einfachen Attribut-Accessor, der eineawait-Schnittstelle zu jedem ORM-Attribut bietet, unabhängig davon, ob SQL emittiert werden muss oder nicht.Siehe auch
Referenzen: #9731
[asyncio] [bug] ¶
Problem in den semi-privaten Concurrency-Funktionen
await_only()undawait_fallback()behoben, bei denen das gegebene Awaitable nicht awaited wurde, wenn die Funktion einenGreenletErrorauslöste, was später zu Warnungen über "nicht awaited" führen konnte, wenn das Programm fortgesetzt wurde. In diesem Fall wird das gegebene Awaitable nun abgebrochen, bevor die Ausnahme ausgelöst wird.
postgresql¶
[postgresql] [bug] [regression] ¶
Eine weitere Regression aufgrund der Änderung "insertmanyvalues" in 2.0.10 im Rahmen von #9618 behoben. Ähnlich wie bei der Regression #9701 müssen
LargeBinary-Datentypen bei Verwendung des asyncpg-Treibers speziell zusätzliche K överläufe aufweisen, um mit dem neuen Bulk-INSERT-Format zu funktionieren.Referenzen: #9739
oracle¶
misc¶
2.0.12¶
Veröffentlicht: 30. April 2023orm¶
[orm] [bug] ¶
Kritische Caching-Problematik behoben, bei der die Kombination aus
aliased()undhybrid_property()-Ausdruckskombinationen zu einem Cache-Schlüssel-Mismatch führten, was dazu führte, dass Cache-Schlüssel das eigentlichealiased()-Objekt enthielten und gleichzeitig nicht mit äquivalenten Konstrukten übereinstimmten, was den Cache auffüllte.Diese Änderung wird auch zurückportiert auf: 1.4.48
Referenzen: #9728
mysql¶
[mysql] [bug] [mariadb] ¶
Probleme bei der Reflexion von Kommentaren für
Table- undColumn-Objekten behoben, bei denen die Kommentare Steuerzeichen wie Zeilenumbrüche enthielten. Zusätzliche Testunterstützung für diese Zeichen sowie für erweiterte Unicode-Zeichen in Tabellen- und Spaltenkommentaren (letztere werden von MySQL/MariaDB nicht unterstützt) wurde zum Testen insgesamt hinzugefügt.Referenzen: #9722
2.0.11¶
Veröffentlicht: 26. April 2023orm¶
[orm] [usecase] ¶
Die Funktionen für ORM Bulk INSERT und UPDATE fügen nun diese Möglichkeiten hinzu
Die Anforderung, dass keine zusätzlichen Parameter übergeben werden, wenn ORM INSERT mit der Einstellung "orm" für dml_strategy verwendet wird, ist aufgehoben.
Die Anforderung, dass keine zusätzlichen WHERE-Kriterien übergeben werden, wenn ORM UPDATE mit der Einstellung "bulk" für dml_strategy verwendet wird, ist aufgehoben. Beachten Sie, dass in diesem Fall die Prüfung auf die erwartete Zeilenanzahl deaktiviert ist.
[orm] [bug] ¶
2.0-Regression behoben, bei der die Verwendung von
bindparam()innerhalb vonInsert.values()nicht korrekt interpretiert wurde, wenn dieInsert-Anweisung über die ORMSessionausgeführt wurde. Dies lag daran, dass das neue Feature ORM-fähiger Insert diesen Anwendungsfall nicht implementierte.
engine¶
[engine] [performance] ¶
Eine Reihe von Leistungsverbesserungen für
RowDie Leistung von
__getattr__des "Named Tuple"-Interfaces der Zeile wurde verbessert; innerhalb dieser Änderung wurde die Implementierung vonRowgestrafft, indem Konstrukte und Logik entfernt wurden, die spezifisch für die 1.4er und frühere SQLAlchemy-Versionen waren. Als Teil dieser Änderung wurde das Serialisierungsformat vonRowleicht modifiziert, wobei Zeilen, die mit früheren SQLAlchemy 2.0-Releases gepickelt wurden, im neuen Format erkannt werden. Pull-Request dank J. Nick Koston.Die Leistung der Zeilenverarbeitung für "binäre" Datentypen wurde verbessert, indem der "bytes"-Handler treiberseitig bedingt gemacht wurde. Als Ergebnis wurde der "bytes"-Ergebnisbehandler für fast alle Treiber außer psycopg2 entfernt, die alle in modernen Formen Python-"bytes" direkt zurückgeben können. Pull-Request dank J. Nick Koston.
Weitere Refaktorierungen innerhalb von
Rowzur Leistungsverbesserung durch Federico Caselli.
[engine] [bug] [regression] ¶
Regression behoben, die die Funktionalität des Attributs
URL.normalized_queryvonURLverhinderte.Referenzen: #9682
sql¶
[sql] [usecase] ¶
Unterstützung für Slice-Zugriff mit
ColumnCollectionhinzugefügt, z.B.table.c[0:5],subquery.c[:-1]etc. Slice-Zugriff gibt eine Unter-ColumnCollectionauf dieselbe Weise zurück wie die Übergabe eines Tupels von Schlüsseln. Dies ist eine natürliche Fortsetzung des Schlüssel-Tupel-Zugriffs, der für #8285 hinzugefügt wurde, wobei es ein Versehen zu sein scheint, dass der Slice-Zugriffs-Anwendungsfall ausgelassen wurde.Referenzen: #8285
typing¶
[typing] [bug] ¶
Typisierung von
RowMappingverbessert, um anzuzeigen, dass sie auchColumnals Indexobjekte unterstützt, nicht nur Zeichenkettennamen. Pull-Request dank Andy Freeland.Referenzen: #9644
postgresql¶
[postgresql] [bug] [regression] ¶
Kritische Regression behoben, die durch #9618 verursacht wurde, welche die Architektur des insertmanyvalues Features für 2.0.10 modifizierte. Dies führte dazu, dass Gleitkommazahlen alle Dezimalstellen verloren, wenn sie mit dem insertmanyvalues-Feature mit den Treibern psycopg2 oder psycopg eingefügt wurden.
Referenzen: #9701
mssql¶
[mssql] [bug] ¶
Der Typ
Doublefür SQL Server implementiert, wo er zur DDL-Zeit alsDOUBLE PRECISIONgerendert wird. Dies wird unter Verwendung eines neuen MSSQL-DatentypsDOUBLE_PRECISIONimplementiert, der auch direkt verwendet werden kann.
oracle¶
[oracle] [bug] ¶
Problem in Oracle-Dialekten behoben, bei dem von
Decimalzurückgebende Typen wieNumericGleitkommazahlen zurückgaben, anstattDecimal-Objekte, wenn diese Spalten in der KlauselInsert.returning()verwendet wurden, um eingefügte Werte zurückzugeben.
2.0.10¶
Veröffentlicht: 21. April 2023orm¶
[orm] [bug] ¶
Behobener Fehler, bei dem verschiedene ORM-spezifische Getter wie
ORMExecuteState.is_column_load,ORMExecuteState.is_relationship_load,ORMExecuteState.loader_strategy_pathusw. einenAttributeErrorauslösten, wenn die SQL-Anweisung selbst ein „zusammengesetztes Select“ wie UNION war.Diese Änderung wird auch zurückportiert auf: 1.4.48
Referenzen: #9634
[orm] [bug] ¶
Behobenes Problem, bei dem der Modifikator
declared_attr.directive()für Unterklassen nicht korrekt beachtet wurde, wenn er auf den speziellen Methodennamen__mapper_args__angewendet wurde, im Gegensatz zur direkten Verwendung vondeclared_attr. Die beiden Konstrukte sollten identisches Laufzeitverhalten aufweisen.Referenzen: #9625
[orm] [bug] ¶
Verbesserung an der Loader-Option
with_loader_criteria(), um sie in der MethodeExecutable.options()einer übergeordneten Anweisung angeben zu können, die selbst keine ORM-Anweisung ist. Beispiele hierfür sindselect(), das in zusammengesetzten Anweisungen wieunion()eingebettet ist, innerhalb einesInsert.from_select()-Konstrukts sowie innerhalb von CTE-Ausdrücken, die auf oberster Ebene nicht ORM-bezogen sind.Referenzen: #9635
[orm] [bug] ¶
Behobener Fehler bei der ORM-Massen-Einfügung, bei dem zusätzliche unnötige Spalten in der INSERT-Anweisung gerendert wurden, wenn das Zurückgeben einzelner Spalten angefordert wurde.
Referenzen: #9685
[orm] [bug] ¶
Behobener Fehler bei ORM Declarative Dataclasses, bei dem die Konstrukte
query_expression()undcolumn_property(), die im Kontext eines Declarative-Mappings als schreibgeschützte Konstrukte dokumentiert sind, nicht mit einerMappedAsDataclass-Klasse verwendet werden konnten, ohneinit=Falsehinzuzufügen, was im Fall vonquery_expression()nicht möglich war, da keininit-Parameter enthalten war. Diese Konstrukte wurden aus Sicht von Dataclasses so geändert, dass sie standardmäßig als „schreibgeschützt“ gelten,init=Falsestandardmäßig setzen und nicht mehr in den pep-681-Konstruktor aufgenommen werden. Die Dataclass-Parameter fürcolumn_property()init,default,default_factory,kw_onlysind nun veraltet; diese Felder gelten nicht fürcolumn_property()in einer Declarative-Dataclasses-Konfiguration, in der das Konstrukt schreibgeschützt wäre. Außerdem wurde der schreibgeschützte Parameterquery_expression.comparezuquery_expression()hinzugefügt;query_expression.reprwar bereits vorhanden.Referenzen: #9628
[orm] [bug] ¶
Fehlender Parameter
mapped_column.active_historyzum Konstruktmapped_column()hinzugefügt.
engine¶
[engine] [usecase] ¶
Hinzugefügt wurden
create_pool_from_url()undcreate_async_pool_from_url(), um einePool-Instanz aus einer als String oderURLübergebenen Eingabe-URL zu erstellen.Referenzen: #9613
[engine] [bug] ¶
Behobener erheblicher Mangel, der bei der Leistungsoptimierungsfunktion „Insert Many Values“-Verhalten für INSERT-Anweisungen für INSERT-Anweisungen festgestellt wurde, die zuerst in der 2.0-Serie eingeführt wurde. Dies war eine Fortsetzung der Änderung in 2.0.9, die die SQL Server-Version der Funktion deaktivierte, da sie sich auf eine scheinbare Zeilenreihenfolge im ORM verließ, die nicht garantiert ist. Die Korrektur wendet eine neue Logik auf alle „insertmanyvalues“-Operationen an, die wirksam wird, wenn ein neuer Parameter
Insert.returning.sort_by_parameter_orderin den MethodenInsert.returning()oderUpdateBase.return_defaults(), die durch eine Kombination aus alternativen SQL-Formen, direkter Entsprechung von Client-seitigen Parametern und in einigen Fällen Downgrading auf zeilenweises Ausführen, die Sortierung jeder Charge von zurückgegebenen Zeilen unter Verwendung der Entsprechung mit Primärschlüsseln oder anderen eindeutigen Werten in jeder Zeile, die mit den Eingabedaten korreliert werden kann, anwenden wird.Die Leistungsauswirkungen werden voraussichtlich minimal sein, da fast alle gängigen Primärschlüsselszenarien für die parametergeordnete Stapelverarbeitung für alle Backends außer SQLite geeignet sind, während der „zeilenweise“-Modus mit einem Mindestmaß an Python-Overhead im Vergleich zu den sehr aufwändigen Ansätzen der 1.x-Serie arbeitet. Für SQLite gibt es keine Leistungsunterschiede, wenn der „zeilenweise“-Modus verwendet wird.
Es wird erwartet, dass mit einer effizienten zeilenweisen INSERT-mit-RETURNING-Stapelverarbeitung die „insertmanyvalues“-Funktion später einfacher auf Drittanbieter-Backends verallgemeinert werden kann, die RETURNING-Unterstützung bieten, aber nicht unbedingt einfache Möglichkeiten, eine Entsprechung mit der Parameterreihenfolge zu gewährleisten.
typing¶
[typing] [bug] ¶
Typisierungsinformationen für kürzlich hinzugefügte Operatoren
ColumnOperators.icontains(),ColumnOperators.istartswith(),ColumnOperators.iendswith()und bitweise OperatorenColumnOperators.bitwise_and(),ColumnOperators.bitwise_or(),ColumnOperators.bitwise_xor(),ColumnOperators.bitwise_not(),ColumnOperators.bitwise_lshift()ColumnOperators.bitwise_rshift()hinzugefügt. Pull Request von Martijn Pieters.Referenzen: #9650
[typing] [bug] ¶
Aktualisierungen des Codebestands, um die Typisierung mit Mypy 1.2.0 zu bestehen.
[typing] [bug] ¶
Behobenes Typisierungsproblem, bei dem
PropComparator.and_()-Ausdrücke innerhalb von Loader-Optionen wieselectinload()nicht korrekt typisiert wurden.Referenzen: #9669
postgresql¶
[postgresql] [usecase] ¶
Option für das Verbindungsargument
prepared_statement_name_funcim asyncpg-Dialekt hinzugefügt. Diese Option ermöglicht die Übergabe eines aufrufbaren Objekts, das zur Anpassung des Namens der vorbereiteten Anweisung verwendet wird, die vom Treiber beim Ausführen von Abfragen erstellt wird. Pull Request von Pavel Sirotkin.Referenzen: #9608
[postgresql] [usecase] ¶
Fehlende Methode
Range.intersection()hinzugefügt. Pull Request von Yurii Karabas.Referenzen: #9509
[postgresql] [bug] ¶
Wiederherstellung des Parameters
ENUM.nameals optional in der Signatur fürENUM, da dieser automatisch aus einem gegebenen pep-435Enum-Typ abgeleitet wird.Referenzen: #9611
[postgresql] [bug] ¶
Behobenes Problem, bei dem der Vergleich von
ENUMmit einem einfachen String den Typ der rechten Seite als VARCHAR umwandelte, was aufgrund expliziterer Umwandlungen, die in Dialekten wie asyncpg hinzugefügt wurden, zu einem PostgreSQL-Typenkonfliktfehler führte.Referenzen: #9621
[postgresql] [bug] ¶
Behobenes Problem, das die Reflexion von ausdrucksbasierten Indizes mit langen Ausdrücken in PostgreSQL verhinderte. Der Ausdruck wurde fälschlicherweise auf die Identifikatorlänge (standardmäßig 63 Bytes) gekürzt.
Referenzen: #9615
mssql¶
[mssql] [bug] ¶
Die SQLAlchemy-Funktion „insertmanyvalues“, die schnelles INSERT von vielen Zeilen ermöglicht und auch RETURNING unterstützt, wurde vorübergehend für SQL Server deaktiviert. Da die Unit of Work derzeit auf dieser Funktion beruht, um vorhandene ORM-Objekte mit zurückgegebenen Primärschlüsselidentitäten abzugleichen, funktioniert dieses spezielle Anwendungsmuster nicht immer mit SQL Server, da die Reihenfolge der von „OUTPUT inserted“ zurückgegebenen Zeilen möglicherweise nicht immer mit der Reihenfolge übereinstimmt, in der die Tupel gesendet wurden, was dazu führt, dass das ORM falsche Entscheidungen über diese Objekte in nachfolgenden Operationen trifft.
oracle¶
2.0.9¶
Veröffentlicht: 5. April 2023orm¶
[orm] [bug] ¶
Behobene Endlosschleife, die auftreten konnte, wenn die Funktion „Beziehung zu alias-Klasse“ verwendet wurde und gleichzeitig ein rekursiver Eager-Loader wie
lazy="selectinload"im Loader angegeben wurde, in Kombination mit einem anderen Eager-Loader auf der gegenüberliegenden Seite. Die Prüfung auf Zyklen wurde korrigiert, um alias-Klassen-Beziehungen einzuschließen.Diese Änderung wird auch zurückportiert auf: 1.4.48
Referenzen: #9590
mariadb¶
mssql¶
[mssql] [bug] ¶
Die SQLAlchemy-Funktion „insertmanyvalues“, die schnelle INSERT von vielen Zeilen ermöglicht und auch RETURNING unterstützt, ist vorübergehend für SQL Server deaktiviert. Da die Unit of Work derzeit auf dieser Funktion beruht, um vorhandene ORM-Objekte mit zurückgegebenen Primärschlüsselidentitäten abzugleichen, funktioniert dieses spezielle Anwendungsmuster nicht immer mit SQL Server, da die Reihenfolge der von „OUTPUT inserted“ zurückgegebenen Zeilen möglicherweise nicht immer mit der Reihenfolge übereinstimmt, in der die Tupel gesendet wurden, was dazu führt, dass das ORM falsche Entscheidungen über diese Objekte in nachfolgenden Operationen trifft.
Die Funktion wird in einer zukünftigen Version wieder aktiviert und gilt wieder für Multi-Row-INSERT-Anweisungen, jedoch wird die Verwendung der Funktion durch die Unit-of-Work deaktiviert, möglicherweise für alle Dialekte, es sei denn, ORM-gemappte Tabellen enthalten auch eine „Sentinel“-Spalte, damit die zurückgegebenen Zeilen auf die ursprünglichen übergebenen Daten zurückgeführt werden können.
Referenzen: #9603
[mssql] [bug] ¶
Die Bulk-INSERT-Strategie für SQL Server „executemany“ mit pyodbc wurde geändert, wenn
fast_executemanyaufTruegesetzt ist, indemfast_executemany/cursor.executemany()für Bulk-INSERTs ohne RETURNING verwendet wurde, wodurch das gleiche Verhalten wie in SQLAlchemy 1.4 wiederhergestellt wurde, wenn dieser Parameter gesetzt war.Neue Leistungsdetails von Endbenutzern haben gezeigt, dass
fast_executemanyfür sehr große Datensätze immer noch wesentlich schneller ist, da es ODBC-Befehle verwendet, die alle Zeilen in einem einzigen Roundtrip empfangen können, was deutlich größere Datengrößen als die Batches ermöglicht, die von „insertmanyvalues“ gesendet werden können, wie es für SQL Server implementiert war.Obwohl diese Änderung vorgenommen wurde, damit „insertmanyvalues“ weiterhin für INSERTs mit RETURNING verwendet wird, sowie wenn
fast_executemanynicht gesetzt war, wurde aufgrund von #9603 die „insertmanyvalues“-Strategie für SQL Server ohnehin generell deaktiviert.Referenzen: #9586
2.0.8¶
Veröffentlicht: 31. März 2023orm¶
[orm] [usecase] ¶
Ausnahmen wie
TypeErrorundValueError, die von Python-Dataclasses beim Verwenden der Mixin-KlasseMappedAsDataclassoder des Dekoratorsregistry.mapped_as_dataclass()ausgelöst werden, werden nun in einenInvalidRequestError-Wrapper verpackt, zusammen mit informativen Kontexten zur Fehlermeldung, die auf die Dokumentation der Python-Dataclasses als maßgebliche Quelle für Hintergrundinformationen zur Ursache des Auslösens verweisen.Siehe auch
Beim Erstellen einer Dataclass für <classname> aufgetretener Fehler bei Python-Dataclasses
Referenzen: #9563
[orm] [bug] ¶
Behobenes Problem bei ORM Annotated Declarative, bei dem die Verwendung eines rekursiven Typs (z. B. eines verschachtelten Dict-Typs) zu einem Rekursionsüberlauf in der Annotationsauflösungslogik des ORM führen konnte, selbst wenn dieser Datentyp nicht zum Mappen der Spalte erforderlich war.
Referenzen: #9553
[orm] [bug] ¶
Behobenes Problem, bei dem das Konstrukt
mapped_column()einen internen Fehler auslöste, wenn es auf einer Declarative-Mixin verwendet und der Parametermapped_column.deferredeingeschlossen wurde.Referenzen: #9550
[orm] [bug] ¶
Die Warnung, die ausgegeben wird, wenn ein einfacher
column()-Objekt in einem Declarative-Mapping vorhanden ist, wurde erweitert, um beliebige SQL-Ausdrücke einzuschließen, die nicht innerhalb eines geeigneten Eigenschaftstyps wiecolumn_property(),deferred()usw. deklariert sind. Diese Attribute werden ansonsten überhaupt nicht gemappt und verbleiben unverändert im Klassenwörterbuch. Da es wahrscheinlich ist, dass ein solcher Ausdruck normalerweise nicht beabsichtigt ist, warnt dieser Fall nun für alle solchen ansonsten ignorierten Ausdrücke, anstatt nur für den Fall voncolumn().Referenzen: #9537
[orm] [bug] ¶
Behobene Regression, bei der der Zugriff auf den Ausdruckswert einer Hybrid-Eigenschaft einer Klasse, die entweder nicht gemappt oder noch nicht gemappt war (wie z. B. ein Aufruf innerhalb einer
declared_attr()-Methode), einen internen Fehler auslöste, da ein interner Abruf des Mappers der übergeordneten Klasse fehlschlug und eine Anweisung zur Ignorierung dieses Fehlers in 2.0 versehentlich entfernt wurde.Referenzen: #9519
[orm] [bug] ¶
Felder, die auf Declarative-Mixins deklariert und dann mit Klassen kombiniert werden, die
MappedAsDataclassverwenden, wobei diese Mixin-Felder selbst keine Dataclass sind, geben nun eine Verwarnung aus, da diese Felder in einer zukünftigen Version ignoriert werden, da Python-Dataclasses-Verhalten diese Felder ignoriert. Typ-Checker sehen diese Felder unter pep-681 nicht.Siehe auch
Beim Umwandeln von <cls> in eine Dataclass stammen Attribute von der Oberklasse <cls>, die keine Dataclass ist. - Hintergrund der Begründung
Referenzen: #9350
[orm] [bug] ¶
Behobenes Problem, bei dem die Methode
BindParameter.render_literal_execute()fehlschlug, wenn sie auf einem Parameter aufgerufen wurde, der auch ORM-Annotationen zugeordnet hatte. In der Praxis würde sich dies als Kompilierungsfehler von SQL bemerkbar machen, wenn eine Kombination aus einem Dialekt, der „FETCH FIRST“ wie Oracle verwendet, zusammen mit einemSelect-Konstrukt verwendet wird, dasSelect.limit()verwendet, innerhalb einiger ORM-Kontexte, einschließlich, wenn die Anweisung in einem Beziehung Primärschlüssel-Ausdruck eingebettet wäre.Referenzen: #9526
[orm] [bug] ¶
Zur Beibehaltung der Konsistenz mit den Unit-of-Work-Änderungen für #5984 und #8862, die beide das „lazy='raise'“-Handling in
Session-Prozessen deaktivieren, die nicht durch Attributzugriff ausgelöst werden, deaktiviert die MethodeSession.delete()nun auch das „lazy='raise'“-Handling, wenn sie Beziehungspfade durchläuft, um die Kaskadenregeln „delete“ und „delete-orphan“ zu verarbeiten. Zuvor gab es keine einfache Möglichkeit,Session.delete()auf ein Objekt anzuwenden, das „lazy='raise'“ gesetzt hatte, sodass nur die notwendigen Beziehungen geladen würden. Da „lazy='raise'“ hauptsächlich dazu dient, SQL-Ladevorgänge zu erkennen, die beim Attributzugriff ausgelöst werden, verhält sichSession.delete()nun wie andereSession-Methoden, einschließlichSession.merge()sowieSession.flush()zusammen mit autoflush.Referenzen: #9549
[orm] [bug] ¶
Behobenes Problem, bei dem eine reine Annotations-
Mapped-Direktive nicht in einer Declarative-Mixin-Klasse verwendet werden konnte, ohne dass das Attribut für Einfach- oder Joined-Vererbungs-Unterklassen von gemappten Klassen, die das Attribut bereits auf einer Oberklasse gemappt hatten, wirksam wurde, was zu widersprüchlichen Spaltenfehlern und/oder Warnungen führte.Referenzen: #9564
[orm] [bug] [typing] ¶
Korrekte Typisierung von
Insert.from_select.names, um eine Liste von Zeichenketten oder Spalten oder gemappten Attributen zu akzeptieren.Referenzen: #9514
examples¶
[examples] [bug] ¶
Behobenes Problem im Beispiel „versioned history“, bei dem die Verwendung einer deklarativen Basis, die von
DeclarativeBaseabgeleitet ist, nicht gemappt werden konnte. Außerdem wurde die gegebene Testsuite repariert, sodass die dokumentierten Anweisungen zum Ausführen des Beispiels mit Python unittest wieder funktionieren.
typing¶
[typing] [bug] ¶
Typisierung für
deferred()undquery_expression()korrigiert, um korrekt mit 2.0-Style-Mappings zu funktionieren.Referenzen: #9536
postgresql¶
[postgresql] [bug] ¶
Behobene kritische Regression in PostgreSQL-Dialekten wie asyncpg, die auf explizite Casts in SQL angewiesen sind, damit Datentypen korrekt an den Treiber übergeben werden. Dabei wurde ein
String-Datentyp zusammen mit der exakten Spaltenlänge beim Vergleich maskiert, was zu einer impliziten Kürzung führte, wenn einVARCHARmit kürzerer Länge mit einem String größerer Länge verglichen wurde, unabhängig vom verwendeten Operator (z. B. LIKE, MATCH usw.). Der PostgreSQL-Dialekt verzichtet nun auf die Länge vonVARCHARbei der Darstellung dieser Casts.Referenzen: #9511
mysql¶
misc¶
2.0.7¶
Veröffentlicht: 18. März 2023typing¶
[typing] [bug] ¶
Typisierungsproblem behoben, bei dem
composite()keinen beliebigen Callable als Quelle der Composite-Klasse zuließ.Referenzen: #9502
postgresql¶
[postgresql] [usecase] ¶
Neuer PostgreSQL-Typ
CITEXThinzugefügt. Pull-Request von Julian David Rath.Referenzen: #9416
[postgresql] [usecase] ¶
Änderungen am Basis-PostgreSQL-Dialekt zur besseren Integration mit dem externen sqlalchemy-redshift-Dialekt für SQLAlchemy 2.0. Pull-Request von matthewgdv.
Referenzen: #9442
2.0.6¶
Veröffentlicht: 13. März 2023orm¶
[orm] [bug] ¶
Fehler behoben, bei dem die Funktion "aktive Historie" für zusammengesetzte Attribute nicht vollständig implementiert war, was den Empfang von Ereignissen, die den "alten" Wert enthielten, unmöglich machte. Dies schien auch bei älteren SQLAlchemy-Versionen der Fall zu sein, bei denen "active_history" an die zugrundeliegenden spaltenbasierten Attribute weitergegeben wurde, ein Ereignis-Handler, der das zusammengesetzte Attribut selbst überwachte, jedoch nicht den ersetzten "alten" Wert erhielt, selbst wenn composite() mit active_history=True konfiguriert war.
Zusätzlich wurde eine Regression behoben, die auf 2.0 beschränkt war und active_history für zusammengesetzte Attribute am impl mit
attr.impl.active_history=Truenicht zuließ.Referenzen: #9460
[orm] [bug] ¶
Regression beim Pickling von Python-Zeilen zwischen den Cython- und reinen Python-Implementierungen von
Rowbehoben, die als Teil der Refaktorisierung von Code für Version 2.0 mit Typisierung auftrat. Eine bestimmte Konstante wurde für die reine Python-Version vonRowin ein stringbasiertesEnumumgewandelt, während die Cython-Version weiterhin eine ganzzahlige Konstante verwendete, was zu Deserialisierungsfehlern führte.Referenzen: #9418
sql¶
[sql] [bug] [regression] ¶
Regression behoben, bei der die Korrektur für #8098, die in der 1.4-Serie veröffentlicht wurde und eine Schicht von nebenläufigkeitssicheren Prüfungen für die Lambda-SQL-API bereitstellte, zusätzliche Korrekturen im Patch enthielt, die nicht auf den Haupt-Branch angewendet wurden. Diese zusätzlichen Korrekturen wurden angewendet.
Referenzen: #9461
[sql] [bug] ¶
Regression behoben, bei der die
select()-Konstruktion nicht gerendert werden konnte, wenn sie keine Spalten erhielt und dann im Kontext eines EXISTS verwendet wurde, was stattdessen eine interne Ausnahme auslöste. Obwohl ein leeres "SELECT" normalerweise kein gültiges SQL ist, erlauben Datenbanken wie PostgreSQL dies im Kontext von EXISTS, und in jedem Fall löst die Bedingung nun keine interne Ausnahme mehr aus.Referenzen: #9440
typing¶
[typing] [bug] ¶
Typisierungsproblem behoben, bei dem
ColumnElement.cast()keinTypeEngine-Argument unabhängig vom Typ desColumnElementselbst zuließ, was der Zweck vonColumnElement.cast()ist.Referenzen: #9451
[typing] [bug] ¶
Probleme behoben, damit Typisierungstests unter Mypy 1.1.1 erfolgreich sind.
oracle¶
[oracle] [bug] ¶
Reflektionsfehler behoben, bei dem die "Namensnormalisierung" von Oracle für die Reflexion von Symbolen im Schema "PUBLIC" (wie Synonyme) nicht korrekt funktionierte, was bedeutete, dass der PUBLIC-Name auf der Python-Seite für das Argument
Table.schemanicht als Kleinbuchstabe angegeben werden konnte. Die Verwendung von Großbuchstaben "PUBLIC" hätte funktioniert, aber zu umständlichen SQL-Abfragen geführt, einschließlich eines zitierten"PUBLIC"-Namens sowie der Indizierung der Tabelle unter Großbuchstaben "PUBLIC", was inkonsistent war.Referenzen: #9459
2.0.5.post1¶
Veröffentlicht: 5. März 2023orm¶
[orm] [bug] ¶
Konstruktorargumente zu den integrierten Mapping-Sammlungstypen hinzugefügt, darunter
KeyFuncDict,attribute_keyed_dict(),column_keyed_dict(), damit diese Dictionary-Typen direkt mit den vorhandenen Daten konstruiert werden können. Dies bietet weitere Kompatibilität mit Tools wie Python-Datenklassen.asdict(), die auf der direkten Verwendung dieser Klassen als normale Dictionary-Klassen beruhen.Referenzen: #9418
[orm] [bug] [regression] ¶
Mehrere Regressionen aufgrund von #8372 behoben, die
attribute_mapped_collection()(jetztattribute_keyed_dict()genannt) betrafen.Erstens war die Sammlung mit "Schlüssel"-Attributen, die keine einfachen zugeordneten Attribute waren, nicht mehr verwendbar; Attribute, die mit Deskriptoren und/oder Assoziationsproxy-Attributen verknüpft waren, wurden korrigiert.
Zweitens würde ein Ereignis oder eine andere Operation, die den "Schlüssel" zum Befüllen des Wörterbuchs aus einem nicht geladenen zugeordneten Attribut benötigte, ebenfalls unangemessen einen Fehler auslösen, anstatt zu versuchen, das Attribut zu laden, wie es in 1.4 der Fall war. Dies ist ebenfalls behoben.
In beiden Fällen wurde das Verhalten von #8372 erweitert. #8372 führte einen Fehler ein, der ausgelöst wurde, wenn der abgeleitete Schlüssel, der als zugeordneter Dictionary-Schlüssel verwendet würde, effektiv nicht zugewiesen war. In dieser Änderung wird nur eine Warnung ausgegeben, wenn der effektive Wert des ".key"-Attributs
Noneist, wo nicht eindeutig bestimmt werden kann, ob diesesNonebeabsichtigt war oder nicht.Nonewird in Zukunft nicht mehr als Schlüssel für zugeordnete Sammlungen unterstützt (da es typischerweise NULL bedeutet, was "unbekannt" heißt). Das Setzen vonattribute_keyed_dict.ignore_unpopulated_attributeignoriert nun auch solcheNone-Schlüssel.Referenzen: #9424
[orm] [bug] ¶
Identifiziert, dass die Dialekte
sqliteundmssql+pyodbcnun mit dem "versioned rows"-Feature des SQLAlchemy ORM kompatibel sind, da SQLAlchemy nun die Zeilenanzahl für eine RETURNING-Anweisung in diesem speziellen Fall durch Zählen der zurückgegebenen Zeilen berechnet, anstatt sich aufcursor.rowcountzu verlassen. Insbesondere der ORM-Anwendungsfall "versioned rows" (dokumentiert unter Konfigurieren eines Version-Counters) sollte nun mit dem SQL Server pyodbc-Dialekt vollständig unterstützt werden.[orm] [bug] ¶
Unterstützung für den Parameter
Mapper.polymorphic_loadhinzugefügt, um ihn auf jeden Mapper einer Vererbungshierarchie anzuwenden, die mehr als eine Ebene tief ist. Dies ermöglicht das Laden von Spalten für alle Klassen in der Hierarchie, die"selectin"angeben, mit einer einzigen Anweisung, anstatt Elemente auf diesen Zwischenklassen zu ignorieren, die dennoch angeben, dass sie auch an"selectin"-Laden teilnehmen und nicht Teil der untersten SELECT-Anweisung waren.Referenzen: #9373
[orm] [bug] ¶
Fortsetzung der Korrektur für #8853, wodurch der
Mapped-Name vollständig qualifiziert werden kann, unabhängig davon, obfrom __annotations__ import futurevorhanden war oder nicht. Dieses Problem, das erstmals in 2.0.0b3 behoben wurde, bestätigte, dass dieser Fall über die Testsuite funktionierte. Die Testsuite testete jedoch offenbar nicht das Verhalten für den NamenMapped, der nicht lokal vorhanden war. Die String-Auflösung wurde aktualisiert, um sicherzustellen, dass dasMapped-Symbol auffindbar ist, so wie es vom ORM für diese Funktionen verwendet wird.
orm declarative¶
[bug] [orm declarative] ¶
Problem behoben, bei dem die neue Funktion
mapped_column.use_existing_columnnicht funktionierte, wenn die beiden gleichnamigen Spalten unter Attributnamen zugeordnet waren, die sich von einem expliziten Namen für die Spalte selbst unterschieden. Die Attributnamen können nun unterschiedlich benannt sein, wenn dieser Parameter verwendet wird.Referenzen: #9332
engine¶
[engine] [performance] ¶
Eine kleine Optimierung der Cython-Implementierung von
Resultdurch Verwendung eines cdef für einen bestimmten int-Wert zur Vermeidung von Python-Overhead. Pull-Request von Matus Valo.Referenzen: #9343
[engine] [bug] ¶
Fehler behoben, bei dem
Row-Objekte aufgrund einer versehentlichen Abhängigkeit von einem instabilen Hashwert nicht zuverlässig über Prozesse hinweg entpickelt werden konnten.Referenzen: #9423
sql¶
[sql] [bug] [regression] ¶
Wiederherstellung der Legacy-Funktionen
nullslast()undnullsfirst()im Import-Namensraumsqlalchemy. Zuvor waren die neueren Funktionennulls_last()undnulls_first()verfügbar, aber die Legacy-Funktionen wurden versehentlich entfernt.Referenzen: #9390
schema¶
[schema] ¶
Validierung, dass das Argument
MetaData.schemavonMetaDataein String ist, wenn es angegeben wird.
typing¶
[typing] [usecase] ¶
Der von
scoped_session.query_property()zurückgegebene Typ wurde mit einem neuen öffentlichen TypQueryPropertyDescriptorexportiert.Referenzen: #9338
[typing] [bug] ¶
Fehler behoben, bei dem die Methode
Connection.scalars()nicht als zulässig für eine Liste mit mehreren Parametern typisiert war, was nun bei insertmanyvalues-Operationen unterstützt wird.[typing] [bug] ¶
Verbesserte Typisierung für das an
Insert.values()undUpdate.values()übergebene Mapping, um flexibler bei der Sammlungsart zu sein, indem ein schreibgeschütztesMappinganstelle eines beschreibbarenDictangegeben wird, was bei zu eingeschränkter Schlüsselart zu Fehlern geführt hätte.Referenzen: #9376
[typing] [bug] ¶
Fehlende Init-Überladung für den
Numeric-Typ-Objekt hinzugefügt, damit PEP-484-Typprüfer den vollständigen Typ korrekt auflösen können, indem sie vom ParameterNumeric.asdecimalableiten, obDecimal- oderfloat-Objekte dargestellt werden.Referenzen: #9391
[typing] [bug] ¶
Typisierungsfehler behoben, bei dem
Select.from_statement()text()- oderTextualSelect-Objekte nicht als gültigen Typ akzeptierte. Zusätzlich wurde die Methodecolumnsrepariert, um einen Rückgabetyp zu haben, der fehlte.Referenzen: #9398
[typing] [bug] ¶
Typisierungsproblem behoben, bei dem
with_polymorphic()den Klassentyp nicht korrekt aufzeichnete.Referenzen: #9340
postgresql¶
[postgresql] [bug] ¶
Problem in PostgreSQL
ExcludeConstraintbehoben, bei der Literalwerte als gebundene Parameter und nicht als direkte Inline-Werte kompiliert wurden, wie es für DDL erforderlich ist.Referenzen: #9349
[postgresql] [bug] ¶
Problem behoben, bei dem die PostgreSQL
ExcludeConstraint-Konstruktion in Operationen wieTable.to_metadata()sowie in einigen Alembic-Szenarien nicht kopierbar war, wenn die Einschränkung Textausdruckselemente enthielt.Referenzen: #9401
mysql¶
[mysql] [bug] [postgresql] ¶
Die Unterstützung für Pool-Ping-Listener zur Empfang von Ausnahmeereignissen über das Ereignis
DialectEvents.handle_error(), das in 2.0.0b1 für #5648 hinzugefügt wurde, berücksichtigte keine dialektspezifischen Ping-Routinen wie die von MySQL und PostgreSQL. Das Dialekt-Feature wurde überarbeitet, sodass alle Dialekte an der Ereignisbehandlung teilnehmen. Zusätzlich wird ein neues boolesches ElementExceptionContext.is_pre_pinghinzugefügt, das angibt, ob diese Operation während der Vor-Ping-Operation erfolgt.Für diese Veröffentlichung können externe Dialekte, die eine benutzerdefinierte Methode
Dialect.do_ping()implementieren, sich für das neu verbesserte Verhalten entscheiden, indem sie ihre Methode nicht mehr abfangen oder Ausnahmen auf "is_disconnect" prüfen, sondern stattdessen alle Ausnahmen nach außen weiterleiten. Die Prüfung der Ausnahme auf "is_disconnect" wird nun von einer umschließenden Methode des Standard-Dialekts durchgeführt, die sicherstellt, dass der Ereignishaken für alle Ausnahmeszenarien aufgerufen wird, bevor die Ausnahme als "disconnect"-Ausnahme geprüft wird. Wenn eine vorhandene Methodedo_ping()weiterhin Ausnahmen abfängt und "is_disconnect" prüft, wird sie wie bisher funktionieren, aberhandle_error-Hooks haben keinen Zugriff auf die Ausnahme, wenn sie nicht nach außen weitergeleitet wird.Referenzen: #5648
sqlite¶
[sqlite] [bug] [regression] ¶
Regression für SQLite-Verbindungen behoben, bei der die Verwendung des Parameters
deterministicbeim Einrichten von Datenbankfunktionen bei älteren SQLite-Versionen (vor Version 3.8.3) fehlschlug. Die Versionsprüflogik wurde verbessert, um diesen Fall zu berücksichtigen.Referenzen: #9379
mssql¶
[mssql] [bug] ¶
Problem mit dem neuen
Uuid-Datentyp behoben, der verhinderte, dass er mit dem pymssql-Treiber funktionierte. Da pymssql anscheinend wieder gepflegt wird, wurde die Testunterstützung für pymssql wiederhergestellt.Referenzen: #9414
[mssql] [bug] ¶
Der pymssql-Dialekt wurde angepasst, um RETURNING für INSERT-Anweisungen besser zu nutzen, um die zuletzt eingefügten Primärschlüsselwerte abzurufen, ähnlich wie es derzeit für den mssql+pyodbc-Dialekt geschieht.
misc¶
[bug] [ext] ¶
Problem bei der Automap behoben, bei der das Aufrufen von
AutomapBase.prepare()von einer bestimmten zugeordneten Klasse anstelle direkt vonAutomapBasenicht die korrekte Basisklasse verwendete, wenn Automap neue Tabellen erkannte, sondern die angegebene Klasse verwendete, was dazu führte, dass Mapper Vererbung konfigurieren wollten. Obwohl manAutomapBase.prepare()ohnehin von der Basis aufrufen sollte, sollte es sich bei Aufruf von einer Unterklasse nicht so stark falsch verhalten.Referenzen: #9367
[bug] [ext] [regression] ¶
Behobene Regression, verursacht durch Typisierung, die zu
sqlalchemy.ext.mutablefür #8667 hinzugefügt wurde, wobei sich die Semantik der.pop()Methode änderte und die Methode dadurch nicht mehr funktionierte. Pull Request freundlicherweise von Nils Philippsen.Referenzen: #9380
2.0.4¶
Veröffentlicht: 17. Februar 2023orm¶
[orm] [usecase] ¶
Um eine Änderung in der Spaltenreihenfolge, die von ORM Declarative in SQLAlchemy 2.0 verwendet wird, zu berücksichtigen, wurde ein neuer Parameter
mapped_column.sort_orderhinzugefügt. Dieser kann verwendet werden, um die Reihenfolge der Spalten zu steuern, die von der ORM in der Tabelle definiert werden. Dies ist nützlich für gängige Anwendungsfälle wie Mixins mit Primärschlüsselspalten, die zuerst in Tabellen erscheinen sollen. Die Änderungsnotizen unter ORM Declarative wendet Spaltenreihenfolgen anders an; Steuern des Verhaltens mit sort_order veranschaulichen die standardmäßige Änderung im Reihenfolgeverhalten (das Teil aller SQLAlchemy 2.0-Releases ist) sowie die Verwendung vonmapped_column.sort_orderzur Steuerung der Spaltenreihenfolge bei Verwendung von Mixins und mehreren Klassen (neu in 2.0.4).Siehe auch
ORM Declarative wendet Spaltenreihenfolgen anders an; Steuern des Verhaltens mit sort_order
Referenzen: #9297
[orm] [usecase] ¶
Die Methode
Session.refresh()lädt nun sofort ein beziehungsgebundenes Attribut, das explizit im ParameterSession.refresh.attribute_namesaufgeführt ist, auch wenn es derzeit mit dem "select"-Loader verknüpft ist, der normalerweise ein "lazy" Loader ist, der während eines Refreshs nicht ausgelöst wird. Die "lazy loader"-Strategie erkennt nun, dass die Operation speziell eine vom Benutzer initiierteSession.refresh()-Operation ist, die dieses Attribut explizit benannt hat, und ruft dann die "immediateload"-Strategie auf, um tatsächlich SQL auszugeben, um das Attribut zu laden. Dies sollte insbesondere für einige asyncio-Situationen hilfreich sein, in denen das Laden eines nicht geladenen, lazy geladenen Attributs erzwungen werden muss, ohne das eigentliche lazy-loading-Attributmuster zu verwenden, das in asyncio nicht unterstützt wird.Referenzen: #9298
[orm] [bug] [regression] ¶
Behobene Regression, eingeführt in Version 2.0.2 aufgrund von #9217, bei der die Verwendung von DML RETURNING-Anweisungen sowie
Select.from_statement()-Konstrukten, wie sie in #9217 "behoben" wurden, in Verbindung mit ORM-gemappten Klassen, die Ausdrücke wie beicolumn_property()verwendeten, zu einem internen Fehler in Core führen würde, wo versucht wurde, den Ausdruck anhand des Namens abzugleichen. Die Korrektur behebt das Core-Problem und passt auch die Korrektur in #9217 an, um für den DML RETURNING-Anwendungsfall, wo sie unnötigen Overhead verursacht, nicht wirksam zu werden.Referenzen: #9273
[orm] [bug] ¶
Das interne Modul
EvaluatorCompilerwurde als privat für die ORM markiert und in_EvaluatorCompilerumbenannt. Für Benutzer, die sich möglicherweise darauf verlassen haben, ist der NameEvaluatorCompilernoch vorhanden, diese Verwendung wird jedoch nicht unterstützt und wird in einer zukünftigen Version entfernt.
orm declarative¶
[usecase] [orm declarative] ¶
Neuer Parameter
dataclasses_callablewurde sowohl zur KlasseMappedAsDataclassals auch zur Methoderegistry.mapped_as_dataclass()hinzugefügt. Dieser Parameter erlaubt die Verwendung eines alternativen Aufrufs an Pythondataclasses.dataclass, um Dataclasses zu erzeugen. Der Anwendungsfall hier ist, stattdessen Pydantic's Dataclass-Funktion einzufügen. Anpassungen wurden an der Mixin-Unterstützung vorgenommen, die für #9179 in Version 2.0.1 hinzugefügt wurde, damit die__annotations__Sammlung des Mixins umgeschrieben wird, um denMappedContainer nicht zu enthalten, so wie es bei gemappten Klassen geschieht, damit der Pydantic-Dataclass-Konstruktor nicht unbekannten Typen ausgesetzt wird.Referenzen: #9266
sql¶
[sql] [bug] ¶
Behobenes Problem, bei dem Elementtypen eines Tupelwerts fest kodiert waren, um die Typen von einem verglichenen Tupel zu übernehmen, wenn der Vergleich den Operator
ColumnOperators.in_()verwendete. Dies war inkonsistent mit der üblichen Art und Weise, wie Typen für einen binären Ausdruck bestimmt werden, nämlich dass zuerst der tatsächliche Elementtyp auf der rechten Seite betrachtet wird, bevor der Typ der linken Seite angewendet wird.Referenzen: #9313
[sql] ¶
Öffentliche Eigenschaft
Table.autoincrement_columnhinzugefügt, die die als autoincrement identifizierte Spalte in der Spalte zurückgibt.Referenzen: #9277
typing¶
[typing] [usecase] ¶
Verbesserte Typunterstützung für die Hybrid Attributes-Erweiterung, aktualisierte Dokumentation zur Verwendung von ORM Annotated Declarative-Mappings und ein neuer Modifikator namens
hybrid_property.inplace. Dieser Modifikator bietet eine Möglichkeit, den Zustand eineshybrid_property**in place** zu ändern, was im Wesentlichen dem entsprach, was sehr frühe Versionen von Hybriden taten, bevor SQLAlchemy Version 1.2.0 #3912 dies zur Entfernung von In-place-Mutationen änderte. Diese In-place-Mutation wird nun auf **Opt-in**-Basis wiederhergestellt, um einem einzelnen Hybrid mehrere Methoden zur Verfügung zu stellen, ohne alle Methoden gleich benennen zu müssen und ohne sorgfältig Methoden mit unterschiedlichen Namen "verketten" zu müssen, um die Komposition beizubehalten. Typing-Tools wie Mypy und Pyright erlauben keine gleichnamigen Methoden in einer Klasse, daher wird mit dieser Änderung eine prägnante Methode zur Einrichtung von Hybriden mit Typunterstützung wiederhergestellt.Referenzen: #9321
oracle¶
[oracle] [bug] ¶
Das Verhalten des Parameters
thick_modefür den Dialekt python-oracledb wurde angepasst, umFalsekorrekt als Wert zu akzeptieren. Zuvor zeigte nurNonean, dass der Thick-Modus deaktiviert werden sollte.Referenzen: #9295
2.0.3¶
Veröffentlicht: 9. Februar 2023sql¶
[sql] [bug] [regression] ¶
Behobene kritische Regression in der Formulierung von SQL-Ausdrücken in der Serie 2.0 aufgrund von #7744, die die Unterstützung für SQL-Ausdrücke mit vielen Elementen, die wiederholt denselben Operator verwendeten, verbesserte; die Klammergruppierung ging bei Elementen über die ersten beiden hinaus verloren.
Referenzen: #9271
typing¶
2.0.2¶
Veröffentlicht: 6. Februar 2023orm¶
[orm] [usecase] ¶
Neuer Event-Hook
MapperEvents.after_mapper_constructed()hinzugefügt, der einen Event-Hook bereitstellt, der ausgeführt wird, sobald dasMapper-Objekt vollständig konstruiert ist, aber bevor der Aufruf vonregistry.configure()stattfindet. Dies ermöglicht Code, der zusätzliche Mappings und Tabellenstrukturen basierend auf der anfänglichen Konfiguration einesMappererstellt, was sich auch in die Declarative-Konfiguration integriert. Zuvor gab es bei der Verwendung von Declarative, wo dasMapper-Objekt während der Klassenerstellung erstellt wird, keine dokumentierte Möglichkeit, Code zu diesem Zeitpunkt auszuführen. Die Änderung soll benutzerdefinierte Mapping-Schemata wie das Beispiel Versioning with a History Table, das zusätzliche Mapper und Tabellen als Reaktion auf die Erstellung von gemappten Klassen generiert, sofort unterstützen.Referenzen: #9220
[orm] [usecase] ¶
Die selten verwendete Attribute
Mapper.iterate_propertiesund MethodeMapper.get_property(), die hauptsächlich intern verwendet werden, rufen denregistry.configure()-Prozess nicht mehr implizit auf. Öffentlicher Zugriff auf diese Methoden ist extrem selten und der einzige Vorteil der Verfügbarkeit vonregistry.configure()wäre die Möglichkeit, "backref"-Eigenschaften in diesen Sammlungen zu haben. Um den neuen EventMapperEvents.after_mapper_constructed()zu unterstützen, ist die Iteration und der Zugriff auf die internenMapperProperty-Objekte nun ohne Auslösung einer impliziten Konfiguration des Mappers selbst möglich.Der öffentlichere Weg zur Iteration aller Mapper-Attribute, die Sammlung
Mapper.attrsund ähnliche, rufen immer noch denregistry.configure()-Schritt implizit auf und machen so Backref-Attribute verfügbar.In allen Fällen ist
registry.configure()immer direkt aufrufbar.Referenzen: #9220
[orm] [bug] [ression] ¶
Behobenes obskures ORM-Vererbungsproblem, verursacht durch #8705, bei dem in einigen Szenarien von geerbten Maklern, die Gruppen von Spalten aus der lokalen Tabelle und der erbenden Tabelle unter einer
column_property()anzeigten, dennoch gewarnt wurde, dass Eigenschaften mit demselben Namen implizit kombiniert werden.Referenzen: #9232
[orm] [bug] [regression] ¶
Behobene Regression, bei der die Funktion
Mapper.version_id_colmit einer regulären Python-seitigen inkrementellen Spalte für SQLite und andere Datenbanken, die "rowcount" nicht mit "RETURNING" unterstützen, fehlschlug, da "RETURNING" für solche Spalten angenommen wurde, obwohl dies nicht der Fall war.Referenzen: #9228
[orm] [bug] [regression] ¶
Behobene Regression bei der Verwendung von
Select.from_statement()in einem ORM-Kontext, bei der die Übereinstimmung von Spalten mit SQL-Labels nur anhand des Namens für ORM-Anweisungen, die nicht vollständig textuell waren, deaktiviert wurde. Dies verhinderte, dass beliebige SQL-Ausdrücke mit Spaltennamen-Labels mit der zu ladenden Entität übereinstimmten, was zuvor in der Serie 1.4 und früheren Serien funktionierte. Das frühere Verhalten wurde wiederhergestellt.Referenzen: #9217
orm declarative¶
[bug] [orm declarative] ¶
Behobene Regression, verursacht durch die Korrektur für #9171, die selbst eine Regression behoben hat, bezüglich der Mechanik von
__init__()bei Klassen, die vonDeclarativeBaseerben. Die Änderung bewirkte, dass__init__()auf der vom Benutzer definierten Basis angewendet wurde, wenn keine__init__()-Methode direkt in der Klasse vorhanden war. Dies wurde angepasst, so dass__init__()nur dann angewendet wird, wenn keine andere Klasse in der Hierarchie der vom Benutzer definierten Basis eine__init__()-Methode hat. Dies ermöglicht es benutzerdefinierten Basisklassen, die aufDeclarativeBasebasieren, Mixins einzuschließen, die selbst eine benutzerdefinierte__init__()-Methode enthalten.Referenzen: #9249
[bug] [orm declarative] ¶
Behobenes Problem in ORM Declarative Dataclass-Mappings im Zusammenhang mit der neu hinzugefügten Unterstützung für Mixins in 2.0.1 über #9179, bei der eine Kombination aus der Verwendung von Mixins und ORM-Vererbung in einigen Fällen Felder falsch klassifizierte und Feld-Level-Dataclass-Argumente wie
init=Falseverloren gingen.Referenzen: #9226
[bug] [orm declarative] ¶
ORM Declarative-Mappings repariert, um die Angabe des Parameters
Mapper.primary_keyinnerhalb von__mapper_args__bei Verwendung vonmapped_column()zu ermöglichen. Obwohl diese Verwendung direkt in der 2.0-Dokumentation steht, akzeptierteMapperin diesem Kontext die Konstruktionmapped_column()nicht. Diese Funktion funktionierte bereits für die ParameterMapper.version_id_colundMapper.polymorphic_on.Als Teil dieser Änderung kann das Attribut
__mapper_args__ohne Verwendung vondeclared_attr()in einer nicht-gemappten Mixin-Klasse angegeben werden, einschließlich eines Eintrags `"primary_key"`, der aufColumn- odermapped_column()-Objekte verweist, die lokal auf dem Mixin vorhanden sind; Declarative übersetzt diese Spalten auch in die richtigen für eine bestimmte gemappte Klasse. Dies funktionierte bereits für die ParameterMapper.version_id_colundMapper.polymorphic_on. Zusätzlich können Elemente innerhalb von `"primary_key"` als Zeichenkettennamen vorhandener gemappter Eigenschaften angegeben werden.Referenzen: #9240
[bug] [orm declarative] ¶
Es wird ein expliziter Fehler ausgelöst, wenn ein Mapping versucht, die Verwendung von
MappedAsDataclassmitregistry.mapped_as_dataclass()innerhalb derselben Klassenhierarchie zu mischen, da dies zu Problemen führt, wenn die Dataclass-Funktion zur falschen Zeit auf die gemappte Klasse angewendet wird, was zu Fehlern während des Mapping-Prozesses führt.Referenzen: #9211
examples¶
[examples] [bug] ¶
Das Beispiel Versioning with a History Table wurde für Version 2.0 überarbeitet und gleichzeitig die allgemeine Funktionsweise dieses Beispiels verbessert, indem neuere APIs verwendet wurden, einschließlich eines neu hinzugefügten Hooks
MapperEvents.after_mapper_constructed().Referenzen: #9220
sql¶
asyncio¶
[asyncio] [bug] ¶
Behobene Regression, verursacht durch die Korrektur für #8419, die asyncpg-Verbindungen zurücksetzte (d.h. Transaktion
rollback()aufgerufen) und normal an den Pool zurückgab, falls die Verbindung nicht explizit an den Connection Pool zurückgegeben wurde und stattdessen von Python's Garbage Collection abgefangen wurde, was fehlschlägt, wenn der Garbage Collection-Vorgang außerhalb der asyncio-Ereignisschleife aufgerufen wird, was zu einer großen Menge an Stack-Trace-Aktivitäten führt, die in das Logging und die Standardausgabe geschrieben werden.Das korrekte Verhalten wird wiederhergestellt, nämlich dass alle asyncio-Verbindungen, die aufgrund der Nicht-Expliziten-Rückgabe an den Connection Pool von der Garbage Collection betroffen sind, vom Pool getrennt und verworfen werden, zusammen mit einer Warnung, anstatt an den Pool zurückgegeben zu werden, da sie nicht zuverlässig zurückgesetzt werden können. Im Falle von asyncpg-Verbindungen wird die asyncpg-spezifische Methode
terminate()verwendet, um die Verbindung während dieses Prozesses anmutiger zu beenden, anstatt sie einfach zu verwerfen.Diese Änderung beinhaltet eine kleine Verhaltensänderung, von der gehofft wird, dass sie für das Debugging von asyncio-Anwendungen nützlich ist: Die Warnung, die im Falle von unerwartet von der Garbage Collection betroffenen asyncio-Verbindungen ausgegeben wird, wurde etwas aggressiver gemacht, indem sie aus einem
try/except-Block in einenfinally:-Block verschoben wurde, wo sie bedingungslos ausgegeben wird, unabhängig davon, ob die Trennungs-/Terminierungsoperation erfolgreich war oder nicht. Sie hat auch den Effekt, dass Anwendungen oder Testsuiten, die Python-Warnungen in Ausnahmen umwandeln, dies als vollständige Ausnahmelösung sehen, während es zuvor nicht möglich war, dass diese Warnung tatsächlich als Ausnahme weitergegeben wird. Anwendungen und Testsuiten, die diese Warnung vorübergehend tolerieren müssen, sollten den Python-Warnungsfilter so anpassen, dass diese Warnungen nicht ausgelöst werden.Das Verhalten für traditionelle synchrone Verbindungen bleibt unverändert: Garbage collected Verbindungen werden normal an den Pool zurückgegeben, ohne eine Warnung auszugeben. Dies wird wahrscheinlich in einer zukünftigen Hauptversion geändert werden, um zumindest eine ähnliche Warnung auszugeben, wie sie für asyncio-Treiber ausgegeben wird, da es ein Nutzungsfehler ist, wenn gepoolte Verbindungen von der Garbage Collection abgefangen werden, ohne ordnungsgemäß an den Pool zurückgegeben zu werden.
Referenzen: #9237
mysql¶
[mysql] [bug] [regression] ¶
Behobene Regression, verursacht durch Problem #9058, das die
has_table()des MySQL-Dialekts auf die erneute Verwendung von "DESCRIBE" angepasst hat, wobei der spezifische Fehlercode, der von MySQL Version 8 bei Verwendung eines nicht vorhandenen Schemanamens ausgelöst wurde, unerwartet war und nicht als boolesches Ergebnis interpretiert werden konnte.Referenzen: #9251
[mysql] [bug] ¶
Unterstützung für die neue
AS <name> ON DUPLICATE KEY-Syntax von MySQL 8 bei Verwendung vonInsert.on_duplicate_key_update()hinzugefügt. Dies ist für neuere Versionen von MySQL 8 erforderlich, da die vorherige Syntax mitVALUES()bei diesen Versionen nun eine Deprecation-Warnung ausgibt. Die Serverversionserkennung wird verwendet, um zu bestimmen, ob die traditionelle MariaDB / MySQL < 8VALUES()-Syntax verwendet werden soll, im Gegensatz zur neueren MySQL 8-erforderlichen Syntax. Pull Request freundlicherweise von Caspar Wylie.Referenzen: #8626
sqlite¶
2.0.1¶
Veröffentlicht: 1. Februar 2023orm¶
[orm] [bug] [regression] ¶
Behobene Regression, bei der ORM-Modelle, die Joined Table Inheritance mit einem zusammengesetzten Fremdschlüssel verwendeten, einen internen Fehler in der Mapper-Interna erhielten.
Referenzen: #9164
[orm] [bug] ¶
Verbesserte Fehlermeldungen beim Verknüpfen von Strategieoptionen aus einer Basisklasse mit einem anderen Attribut, das von einer abgeleiteten Klasse stammt, bei der
of_type()verwendet werden sollte. Zuvor fehlte bei der Verwendung vonLoad.options()eine informative Meldung, dassof_type()verwendet werden sollte, was nicht der Fall war, wenn die Optionen direkt verknüpft wurden. Die informativen Details werden nun auch dann ausgegeben, wennLoad.options()verwendet wird.Referenzen: #9182
orm declarative¶
[bug] [orm declarative] ¶
Unterstützung für PEP 484
NewTypewurde zur Verwendung inregistry.type_annotation_mapsowie inMapped-Konstrukten hinzugefügt. Diese Typen verhalten sich im Moment genauso wie benutzerdefinierte Unterklassen von Typen; sie müssen explizit in derregistry.type_annotation_maperscheinen, um abgebildet zu werden.Referenzen: #9175
[bug] [orm declarative] ¶
Wenn die Superklasse
MappedAsDataclassverwendet wird, werden alle Klassen innerhalb der Hierarchie, die Unterklassen dieser Klasse sind, nun über die Funktion@dataclasses.dataclassausgeführt, unabhängig davon, ob sie tatsächlich gemappt werden oder nicht. Dadurch werden Nicht-ORM-Felder, die auf nicht gemappten Klassen innerhalb der Hierarchie deklariert sind, verwendet, wenn gemappte Unterklassen in Dataclasses umgewandelt werden. Dieses Verhalten gilt sowohl für Zwischenklassen, die mit__abstract__ = Truegemappt wurden, als auch für die benutzerdefinierte deklarative Basis selbst, vorausgesetzt,MappedAsDataclassist als Oberklasse für diese Klassen vorhanden.Dies ermöglicht die Verwendung von nicht gemappten Attributen wie
InitVarDeklarationen auf Superklassen, ohne den@dataclasses.dataclassDekorator explizit auf jeder nicht gemappten Klasse ausführen zu müssen. Das neue Verhalten wird als korrekt angesehen, da dies dem entspricht, was die Implementierung von PEP 681 erwartet, wenn eine Superklasse zur Angabe des Dataclass-Verhaltens verwendet wird.Referenzen: #9179
[bug] [orm declarative] ¶
Unterstützung für PEP 586
Literal[]wurde zur Verwendung in derregistry.type_annotation_mapsowie innerhalb vonMappedKonstrukten hinzugefügt. Um benutzerdefinierte Typen wie diese zu verwenden, müssen sie explizit in derregistry.type_annotation_mapaufgeführt werden, um gemappt zu werden. Pull-Request von Frederik Aalund.Als Teil dieser Änderung wurde die Unterstützung für
Enumin derregistry.type_annotation_maperweitert, um nebenenum.EnumDatentypen auchLiteral[]Typen, die aus Zeichenkettenwerten bestehen, zu unterstützen. Wenn einLiteral[]Datentyp innerhalb vonMapped[]verwendet wird, der nicht in derregistry.type_annotation_mapmit einem bestimmten Datentyp verknüpft ist, wird standardmäßig einEnumverwendet.Referenzen: #9187
[bug] [orm declarative] ¶
Behebt ein Problem bei der Verwendung von
Enumin derregistry.type_annotation_map, bei dem der ParameterEnum.native_enumnicht korrekt an den gemappten Spaltendatentyp kopiert wurde, falls er auf False gesetzt war, wie in der Dokumentation angegeben.Referenzen: #9200
[bug] [orm declarative] [regression] ¶
Behebt eine Regression in der Klasse
DeclarativeBase, bei der der Standardkonstruktor des Registries nicht auf die Basis selbst angewendet wurde, was sich von der Funktionsweise des vorherigendeclarative_base()Konstrukts unterscheidet. Dies verhinderte, dass eine gemappte Klasse mit eigener__init__()Methodesuper().__init__()aufrufen konnte, um auf den Standardkonstruktor der Registry zuzugreifen und Attribute automatisch zu befüllen. Stattdessen wurdeobject.__init__()aufgerufen, was bei beliebigen Argumenten zu einemTypeErrorführte.Referenzen: #9171
[bug] [orm declarative] ¶
Die Regeln zur Interpretation von PEP 593
AnnotatedTypen bei Verwendung mit Annotated Declarative Mapping wurden verbessert. Der innere Typ wird in allen Fällen auf "Optional" geprüft und dies zur Kriteriendefinition hinzugefügt, ob die Spalte als "nullable" gesetzt wird oder nicht. Wenn der Typ innerhalb desAnnotatedContainers optional ist (oder mitNoneunioned), wird die Spalte als nullable betrachtet, sofern keine explizitenmapped_column.nullableParameter sie überschreiben.Referenzen: #9177
sql¶
[sql] [bug] ¶
Die Korrektur für #7664, veröffentlicht in Version 2.0.0, wurde korrigiert, um auch
DropSchemaeinzuschließen, das bei dieser Korrektur versehentlich übersehen wurde, und ermöglicht die Stringifizierung ohne Dialekt. Die Korrekturen für beide Konstrukte wurden in die 1.4er Serie ab 1.4.47 zurückportiert.Referenzen: #7664
[sql] [bug] [regression] ¶
Behebt eine Regression in der Implementierung des neuen „insertmanyvalues“-Features, bei dem ein interner
TypeErrorin Konfigurationen auftrat, in denen eininsert()über eine CTE innerhalb eines andereninsert()referenziert wurde. Zusätzliche Korrekturen wurden für diesen Anwendungsfall für positionelle Dialekte wie asyncpg bei der Verwendung von „insertmanyvalues“ vorgenommen.Referenzen: #9173
typing¶
[typing] [bug] ¶
Die Typisierung für
Select.with_for_update.ofwurde erweitert, um auch Tabellen- und gemappte Klassenargumente zu akzeptieren, wie es für den MySQL-Dialekt verfügbar zu sein scheint.Referenzen: #9174
[typing] [bug] ¶
Die Typisierung für limit/offset-Methoden, einschließlich
Select.limit(),Select.offset(),Query.limit(),Query.offset()wurde korrigiert, umNonezuzulassen, was die dokumentierte API ist, um das aktuelle Limit/Offset zu "brechen".Referenzen: #9183
[typing] [bug] ¶
Behebt ein Typisierungsproblem, bei dem
mapped_column()Objekte, die alsMappedtypisiert wurden, nicht in Schema-Constraints wieForeignKey,UniqueConstraintoderIndexakzeptiert wurden.Referenzen: #9170
[typing] [bug] ¶
Die Typisierung für
ColumnElement.cast()wurde korrigiert, um sowohlType[TypeEngine[T]]als auchTypeEngine[T]zu akzeptieren; zuvor wurde nurTypeEngine[T]akzeptiert. Pull-Request von Yurii Karabas.Referenzen: #9156
2.0.0¶
Veröffentlicht: 26. Januar 2023orm¶
[orm] [bug] ¶
Die Benachrichtigung von Warnungen, die im Konfigurations-Mapper- oder Flush-Prozess ausgegeben werden und oft als Teil einer anderen Operation aufgerufen werden, wurde verbessert, um zusätzliche Kontexte zur Meldung hinzuzufügen, die eine dieser Operationen als Quelle der Warnung angibt, auch bei Operationen, die nicht offensichtlich damit zusammenhängen.
Referenzen: #7305
orm extensions¶
[feature] [orm extensions] ¶
Neue Option zur horizontalen Sharding-API
set_shard_idhinzugefügt, die den effektiven Shard-Identifier für Abfragen festlegt, sowohl für die primäre Abfrage als auch für alle sekundären Lader, einschließlich Relationship-Eager-Lader sowie Relationship- und Column-Lazy-Lader.Referenzen: #7226
[usecase] [orm extensions] ¶
Neues Feature für
AutomapBasefür das automatische Laden von Klassen über mehrere Schemata hinweg, die überlappende Namen haben könnten. Dies wird durch einen ParameterAutomapBase.prepare.modulename_for_tableermöglicht, der die Anpassung des__module__Attributs neu generierter Klassen erlaubt, sowie eine neue SammlungAutomapBase.by_module, die einen punktgetrennten Namensraum von Modulnamen speichert, die mit Klassen basierend auf dem__module__Attribut verknüpft sind.Zusätzlich kann die Methode
AutomapBase.prepare()nun beliebig oft aufgerufen werden, mit oder ohne Aktivierung der Reflexion; nur neu hinzugefügte Tabellen, die noch nicht gemappt wurden, werden bei jedem Aufruf verarbeitet. Zuvor musste die MethodeMetaData.reflect()jedes Mal explizit aufgerufen werden.Siehe auch
Generieren von Mappings aus mehreren Schemata - illustriert die Verwendung beider Techniken gleichzeitig.
Referenzen: #5145
sql¶
[sql] [bug] ¶
Stringifizierung für den
CreateSchemaDDL-Konstrukt wurde behoben, der mit einemAttributeErrorabstürzte, wenn er ohne Dialekt stringifiziert wurde. Update: Beachten Sie, dass diese KorrekturDropSchemanicht berücksichtigte; eine Nachkorrektur in Version 2.0.1 behebt diesen Fall. Die Korrektur für beide Elemente wird nach 1.4.47 zurückportiert.Referenzen: #7664
typing¶
[typing] [bug] ¶
Typisierung für die integrierten generischen Funktionen im
funcNamensraum hinzugefügt, die eine bestimmte Menge von Argumenten akzeptieren und einen bestimmten Typ zurückgeben, z. B. fürcount,current_timestampusw.Referenzen: #9129
[typing] [bug] ¶
Der für "Lambda-Statements" übergebene Typ wurde korrigiert, sodass eine einfache Lambda von mypy, pyright usw. ohne Fehler bezüglich der Argumenttypen akzeptiert wird. Darüber hinaus wurde die Typisierung für weitere Teile der öffentlichen API für Lambda-Statements implementiert und sichergestellt, dass
StatementLambdaElementTeil derExecutableHierarchie ist, sodass sie als vonConnection.execute()akzeptiert typisiert wird.Referenzen: #9120
[typing] [bug] ¶
Die Methoden
ColumnOperators.in_()undColumnOperators.not_in()sind so typisiert, dass sieIterable[Any]anstelle vonSequence[Any]akzeptieren, um mehr Flexibilität bei den Argumenttypen zu ermöglichen.Referenzen: #9122
[typing] [bug] ¶
Die Funktionen
or_()undand_()erfordern aus Typsicht, dass das erste Argument vorhanden ist. Diese Funktionen akzeptieren jedoch immer noch null Argumente, was zur Laufzeit eine Deprecation-Warnung ausgibt. Die Typisierung wurde auch erweitert, um das Senden des festen LiteralsFalsefüror_()undTruefürand_()als einziges erstes Argument zu unterstützen. Die Dokumentation empfiehlt jedoch jetzt, in diesen Fällen die Konstruktefalse()undtrue()als explizitere Methode zu verwenden.Referenzen: #9123
[typing] [bug] ¶
Behebt ein Typisierungsproblem, bei dem das Iterieren über ein
QueryObjekt nicht korrekt typisiert war.Referenzen: #9125
[typing] [bug] ¶
Behebt ein Typisierungsproblem, bei dem der Objekttyp bei Verwendung von
Resultals Kontextmanager nicht erhalten blieb, sodass in allen FällenResultanstelle des spezifischenResultSubtyps angezeigt wurde. Pull-Request von Martin Baláž.Referenzen: #9136
[typing] [bug] ¶
Behebt ein Problem, bei dem die Verwendung von
relationship.remote_sideund ähnlichen Parametern, bei denen ein annotiertes deklaratives Objekt, das alsMappedtypisiert wurde, vom Typenprüfer nicht akzeptiert wurde.Referenzen: #9150
[typing] [bug] ¶
Typisierung für ältere Operatoren wie
isnot(),notin_()usw. hinzugefügt, die zuvor auf neuere Operatoren verwiesen, aber selbst nicht typisiert waren.Referenzen: #9148
postgresql¶
[postgresql] [bug] ¶
Dem asyncpg-Dialekt wurde die Unterstützung hinzugefügt, um den
cursor.rowcountWert für SELECT-Statements zurückzugeben, falls verfügbar. Obwohl dies kein typischer Anwendungsfall fürcursor.rowcountist, stellen die anderen PostgreSQL-Dialekte diesen Wert generell zur Verfügung. Pull-Request von Michael Gorven.Diese Änderung wird auch **zurückportiert** auf: 1.4.47
Referenzen: #9048
mysql¶
mssql¶
[mssql] [bug] [regression] ¶
Die neu hinzugefügte Kommentar-Reflexions- und Rendering-Funktion des MSSQL-Dialekts, die in #7844 hinzugefügt wurde, wird nun standardmäßig deaktiviert, wenn nicht festgestellt werden kann, dass ein nicht unterstütztes Backend wie Azure Synapse verwendet wird; dieses Backend unterstützt keine Tabellen- und Spaltenkommentare und auch nicht die SQL Server-Routinen zur Erstellung und Reflexion derselben. Ein neuer Parameter
supports_commentswurde dem Dialekt hinzugefügt, der standardmäßig aufNonegesetzt ist, was bedeutet, dass die Kommentarunterstützung automatisch erkannt wird. Wenn er aufTrueoderFalsegesetzt wird, wird die Kommentarunterstützung entweder bedingungslos aktiviert oder deaktiviert.Siehe auch
Referenzen: #9142
2.0.0rc3¶
Veröffentlicht: 18. Januar 2023orm¶
[orm] [feature] ¶
Ein neuer Parameter
Mapper.polymorphic_abstractwurde zurMapperhinzugefügt. Der Zweck dieser Direktive ist, dass die ORM die Klasse nicht direkt instanziiert oder lädt, sondern nur ihre Unterklassen. Die eigentliche Auswirkung ist, dass derMapperdie direkte Instanziierung von Objekten der Klasse verhindert und erwartet, dass die Klasse keine eigenständige polymorphe Identität konfiguriert hat.In der Praxis kann die Klasse, die mit
Mapper.polymorphic_abstractgemappt ist, als Ziel einerrelationship()sowie in Abfragen verwendet werden; Unterklassen müssen natürlich polymorphe Identitäten in ihren Mappings enthalten.Der neue Parameter wird automatisch auf Klassen angewendet, die von der Klasse
AbstractConcreteBaseabstammen, da diese Klasse nicht zur Instanziierung vorgesehen ist.Referenzen: #9060
[orm] [bug] ¶
Behobenes Problem, bei dem die Verwendung eines pep-593
Annotated-Typs in derregistry.type_annotation_map, die selbst einen generischen einfachen Container odercollections.abc-Typ (z. B.list,dict,collections.abc.Sequenceusw.) als Zieltyp enthielt, zu einem internen Fehler führte, wenn die ORM dieAnnotated-Instanz interpretierte.Referenzen: #9099
[orm] [bug] ¶
Eine Fehlermeldung wurde hinzugefügt, wenn ein
relationship()gegen einen abstrakten Containertyp wieMapped[Sequence[B]]zugeordnet wird, ohne den Parameterrelationship.container_classanzugeben, der erforderlich ist, wenn der Typ abstrakt ist. Zuvor wurde versucht, den abstrakten Container in einem späteren Schritt zu instanziieren und schlug fehl.Referenzen: #9100
sql¶
[sql] [bug] ¶
Fehler/Regression behoben, bei der die Verwendung von
bindparam()mit demselben Namen wie eine Spalte in der MethodeUpdate.values()vonUpdatesowie in der MethodeInsert.values()vonInsertin 2.0 nur, in einigen Fällen dazu führte, dass der SQL-Ausdruck, in dem die Parameter dargestellt wurden, stillschweigend nicht berücksichtigt wurde, indem der Ausdruck durch einen neuen Parameter mit demselben Namen ersetzt und alle anderen Elemente des SQL-Ausdrucks, wie SQL-Funktionen usw., verworfen wurden. Der spezifische Fall wären Anweisungen, die gegen ORM-Entitäten und nicht gegen reineTable-Instanzen konstruiert wurden, aber es würde auftreten, wenn die Anweisung mit einerSessionoder einerConnectionaufgerufen würde.Updateals Teil des Problems war sowohl in 2.0 als auch in 1.4 vorhanden und wird nach 1.4 zurückportiert.Diese Änderung wird auch **zurückportiert** auf: 1.4.47
Referenzen: #9075
typing¶
[typing] [bug] ¶
Korrekturen an den Annotationen innerhalb der Erweiterung
sqlalchemy.ext.hybridfür eine effektivere Typisierung benutzerdefinierter Methoden. Die Typisierung verwendet jetzt PEP 612-Features, die jetzt von neueren Versionen von Mypy unterstützt werden, um Argumentsignaturen fürhybrid_methodbeizubehalten. Rückgabewerte für Hybridmethoden werden als SQL-Ausdrücke in Kontexten wieSelect.where()akzeptiert und unterstützen weiterhin SQL-Methoden.Referenzen: #9096
mypy¶
[mypy] [bug] ¶
Anpassungen am mypy-Plugin, um einige potenzielle Änderungen im Zusammenhang mit Issue #236 sqlalchemy2-stubs bei der Verwendung von SQLAlchemy 1.4 zu berücksichtigen. Diese Änderungen werden innerhalb von SQLAlchemy 2.0 synchron gehalten. Die Änderungen sind außerdem abwärtskompatibel mit älteren Versionen von sqlalchemy2-stubs.
Diese Änderung wird auch **zurückportiert** auf: 1.4.47
[mypy] [bug] ¶
Abgestürztes Verhalten im mypy-Plugin behoben, das sowohl bei 1.4 als auch bei 2.0 Versionen auftreten konnte, wenn ein Dekorator für den
mapped()-Dekorator verwendet wurde, der in einem Ausdruck mit mehr als zwei Komponenten referenziert wurde (z. B.@Backend.mapper_registry.mapped). Dieses Szenario wird jetzt ignoriert; bei Verwendung des Plugins muss der Dekoratorkausdruck zwei Komponenten haben (d. h.@reg.mapped).Diese Änderung wird auch **zurückportiert** auf: 1.4.47
Referenzen: #9102
postgresql¶
oracle¶
2.0.0rc2¶
Veröffentlicht: 9. Januar 2023orm¶
[orm] [bug] ¶
Behobenes Problem, bei dem eine übermäßig restriktive ORM-Mapping-Regel in 2.0 hinzugefügt wurde, die Zuordnungen zu
TableClause-Objekten, wie sie im Wiki-Rezept für Ansichten verwendet werden, verhinderte.Referenzen: #9071
typing¶
postgresql¶
[postgresql] [json] ¶
Fehlende
JSONB-Operationen implementiert@@unter Verwendung vonComparator.path_match()@?unter Verwendung vonComparator.path_exists()#-unter Verwendung vonComparator.delete_path()
Pull-Request von Guilherme Martins Crocetti.
Referenzen: #7147
mysql¶
[mysql] [bug] ¶
Das Verhalten von
Inspector.has_table()wurde wiederhergestellt, um temporäre Tabellen für MySQL / MariaDB zu melden. Dies ist derzeit das Verhalten für alle anderen enthaltenen Dialekte, wurde jedoch für MySQL in 1.4 entfernt, da der DESCRIBE-Befehl nicht mehr verwendet wurde; es gab keine dokumentierte Unterstützung für temporäre Tabellen, die von der MethodeInspector.has_table()in dieser oder einer früheren Version gemeldet wurden, sodass das vorherige Verhalten undefiniert war.Da SQLAlchemy 2.0 die formale Unterstützung für den Status temporärer Tabellen über
Inspector.has_table()hinzugefügt hat, wurde der MySQL / MariaDB-Dialekt so zurückgesetzt, dass er die „DESCRIBE“-Anweisung verwendet, wie dies in der SQLAlchemy 1.3-Serie und früher der Fall war, und die Testunterstützung wurde hinzugefügt, um MySQL / MariaDB für dieses Verhalten einzuschließen. Die früheren Probleme mit ROLLBACK, die 1.4 verbessern sollte, gelten in SQLAlchemy 2.0 nicht mehr aufgrund von Vereinfachungen, wieConnectionTransaktionen handhabt.DESCRIBE ist notwendig, da MariaDB insbesondere keine konsistent verfügbare öffentliche Informationsschemata hat, um temporäre Tabellen anders als DESCRIBE/SHOW COLUMNS zu melden, die darauf angewiesen sind, einen Fehler auszulösen, um keine Ergebnisse zu melden.
Referenzen: #9058
oracle¶
[oracle] [bug] ¶
Unterstützter Anwendungsfall für Fremdschlüsselbeschränkungen, bei denen die lokale Spalte als „unsichtbar“ gekennzeichnet ist. Die normalerweise generierten Fehler, wenn eine
ForeignKeyConstrainterstellt wird, die auf die Zielspalte prüft, werden beim Reflektieren deaktiviert, und die Beschränkung wird mit einer Warnung übersprungen, so wie es bereits für einenIndexmit einem ähnlichen Problem geschieht.Referenzen: #9059
2.0.0rc1¶
Veröffentlicht: 28. Dezember 2022general¶
[general] [bug] ¶
Regression behoben, bei der das Basis-Kompatibilitätsmodul
platform.architecture()aufrief, um einige Systeminformationen zu erkennen, was zu einem übermäßigen Systemaufruf gegen den systemweitenfile-Aufruf führte, der unter bestimmten Umständen, einschließlich einiger sicherer Umgebungskonfigurationen, nicht verfügbar ist.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #8995
orm¶
[orm] [feature] ¶
Ein neuer Standardwert für den Parameter
Mapper.eager_defaults, „auto“, wurde hinzugefügt. Dieser ruft automatisch Tabellendatenbank-Standardwerte während eines Unit-of-Work-Flushs ab, wenn der Dialekt RETURNING für das ausgeführte INSERT unterstützt, sowie insertmanyvalues verfügbar ist. Eager-Abrufe für serverseitige UPDATE-Standardwerte, die sehr ungewöhnlich sind, finden nur statt, wennMapper.eager_defaultsaufTruegesetzt ist, da es keine Batch-RETURNING-Form für UPDATE-Anweisungen gibt.Referenzen: #8889
[orm] [usecase] ¶
Anpassungen an der
Sessionin Bezug auf Erweiterbarkeit sowie Aktualisierungen derShardedSession-ErweiterungSession.get()akzeptiert jetztSession.get.bind_arguments, was insbesondere bei der Verwendung der horizontalen Sharding-Erweiterung nützlich sein kann.Session.get_bind()akzeptiert beliebige Schlüsselwortargumente, was bei der Entwicklung von Code hilft, der eineSession-Klasse verwendet, die diese Methode mit zusätzlichen Argumenten überschreibt.Eine neue ORM-Ausführungsoption
identity_tokenwurde hinzugefügt, die verwendet werden kann, um den „Identitätstoken“ direkt zu beeinflussen, der neu geladenen ORM-Objekten zugeordnet wird. Dieser Token ist die Methode, mit der Sharding-Ansätze (insbesondere dieShardedSession, kann aber auch in anderen Fällen verwendet werden) Objektidentitäten über verschiedene „Shards“ hinweg trennen.Siehe auch
Der Ereignishaken
SessionEvents.do_orm_execute()kann jetzt verwendet werden, um alle ORM-bezogenen Optionen zu beeinflussen, einschließlichautoflush,populate_existingundyield_per; diese Optionen werden nach dem Aufrufen der Ereignishaken erneut verarbeitet, bevor sie ausgeführt werden. Zuvor wären Optionen wieautoflushzu diesem Zeitpunkt bereits ausgewertet worden. Die neue Optionidentity_tokenwird auch in diesem Modus unterstützt und wird jetzt von der horizontalen Sharding-Erweiterung verwendet.Die Klasse
ShardedSessionersetzt den HookShardedSession.id_chooserdurch einen neuen HookShardedSession.identity_chooser, der nicht mehr auf dem Legacy-Query-Objekt basiert.ShardedSession.id_chooserwird weiterhin anstelle vonShardedSession.identity_choosermit einer Verwarnung akzeptiert.
Referenzen: #7837
[orm] [usecase] ¶
Das Verhalten des „Einbindens einer externen Transaktion in eine Session“ wurde überarbeitet und verbessert, wodurch eine explizite Kontrolle darüber ermöglicht wird, wie die
Sessioneine eingehendeConnection, die bereits eine Transaktion und möglicherweise einen Savepoint hat, aufnimmt. Der neue ParameterSession.join_transaction_modeenthält eine Reihe von Optionswerten, die die bestehende Transaktion auf verschiedene Weise aufnehmen können, insbesondere ermöglicht dies einerSession, in einem vollständig transaktionalen Stil ausschließlich mit Savepoints zu arbeiten, während die extern initiierte Transaktion unter allen Umständen nicht committed und aktiv bleibt, was es Testsuiten ermöglicht, alle innerhalb von Tests durchgeführten Änderungen zurückzurollen.Zusätzlich wurde die Methode
Session.close()überarbeitet, um noch vorhandene Savepoints vollständig zu schließen, was auch dem Rezept der „externen Transaktion“ ermöglicht, ohne Warnungen fortzufahren, wenn dieSessionihre eigenen SAVEPOINT-Transaktionen nicht explizit beendet hat.Siehe auch
Referenzen: #9015
[orm] [usecase] ¶
Die Anforderung, dass das Attribut
__allow_unmapped__auf einer Deklarativen Dataclass Mapped-Klasse verwendet werden muss, wenn Nicht-Mapped[]-Annotationen erkannt werden, wurde entfernt; zuvor wurde eine Fehlermeldung ausgegeben, die für Legacy-ORM-typisierte Zuordnungen bestimmt war und zudem keine korrekten Muster speziell für Dataclasses erwähnte. Diese Fehlermeldung wird jetzt nicht mehr ausgegeben, wennregistry.mapped_as_dataclass()oderMappedAsDataclassverwendet wird.Referenzen: #8973
[orm] [bug] ¶
Problem in der internen SQL-Traversierung für DML-Anweisungen wie
UpdateundDeletebehoben, die unter anderem zu einem spezifischen Problem mit der Verwendung von Lambda-Anweisungen mit der ORM-Update/Delete-Funktion führte.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #9033
[orm] [bug] ¶
Fehler behoben, bei dem
Session.merge()die aktuellen geladenen Inhalte von Beziehungsattributen, die mit dem Parameterrelationship.viewonlyangegeben waren, nicht beibehielt, wodurch Strategien, dieSession.merge()zum Abrufen vollständig geladener Objekte aus Caches und ähnlichen Techniken verwendeten, vereitelt wurden. In einer verwandten Änderung wurde ein Problem behoben, bei dem ein Objekt, das eine geladene Beziehung enthielt, die aber dennoch alslazy='raise'auf dem Mapping konfiguriert war, bei der Übergabe anSession.merge()fehlschlug; Prüfungen auf „raise“ werden jetzt während des Merge-Vorgangs ausgesetzt, vorausgesetzt, der ParameterSession.merge.loadbleibt bei seinem Standardwert vonTrue.Insgesamt ist dies eine Verhaltensanpassung an eine Änderung, die in der 1.4-Serie ab #4994 eingeführt wurde, die „merge“ aus den standardmäßig angewendeten Kaskaden für „viewonly“-Beziehungen entfernte. Da „viewonly“-Beziehungen unter keinen Umständen persistent gemacht werden, hat die Zulassung, dass ihre Inhalte während des „merge“ übertragen werden, keine Auswirkungen auf das Persistenzverhalten des Zielobjekts. Dies ermöglicht es
Session.merge(), einen seiner Anwendungsfälle korrekt zu erfüllen, nämlich das Hinzufügen von Objekten zu einerSession, die woanders geladen wurden, oft zum Zweck der Wiederherstellung aus einem Cache.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8862
[orm] [bug] ¶
Probleme in
with_expression()behoben, bei denen Ausdrücke, die aus Spalten bestanden, die aus dem umschließenden SELECT referenziert wurden, in einigen Kontexten keinen korrekten SQL-Code renderten, wenn der Ausdruck einen Labelnamen hatte, der mit dem Attribut übereinstimmte, dasquery_expression()verwendete, selbst wennquery_expression()keinen Standardausdruck hatte. Vorläufig wird, wenn derquery_expression()einen Standardausdruck hat, dieser Labelname für diesen Standard verwendet, und ein zusätzliches Label mit demselben Namen wird weiterhin ignoriert. Insgesamt ist dieser Fall ziemlich schwierig, sodass weitere Anpassungen erforderlich sein könnten.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8881
[orm] [bug] ¶
Es wird eine Warnung ausgegeben, wenn ein in
relationship()verwendeter Backref-Name ein Attribut auf der Zielklasse benennt, das bereits eine Methode oder ein Attribut dieses Namens zugewiesen hat, da die Backref-Deklaration dieses Attribut ersetzt.Referenzen: #4629
[orm] [bug] ¶
Eine Reihe von Änderungen und Verbesserungen in Bezug auf
Session.refresh(). Die Gesamtänderung besteht darin, dass Primärschlüsselattribute für ein Objekt nun bedingungslos in eine Refresh-Operation einbezogen werden, wenn beziehungsgebundene Attribute aktualisiert werden sollen, auch wenn sie nicht abgelaufen sind und auch wenn sie nicht im Refresh angegeben wurden.Verbessertes
Session.refresh(), so dass, wenn autoflush aktiviert ist (wie es standardmäßig fürSessiongilt), der autoflush früher im Refresh-Prozess stattfindet, sodass ausstehende Primärschlüsseländerungen angewendet werden, ohne dass Fehler ausgelöst werden. Zuvor fand dieser Autoflush zu spät im Prozess statt, und die SELECT-Anweisung verwendete nicht den korrekten Schlüssel, um die Zeile zu lokalisieren, und einInvalidRequestErrorwurde ausgelöst.Wenn die oben genannte Bedingung vorliegt, d.h. es gibt un-geflushte Primärschlüsseländerungen am Objekt, aber autoflush ist nicht aktiviert, verbietet die Methode refresh() nun explizit die Fortsetzung der Operation und es wird ein informatives
InvalidRequestErrorausgelöst, das fordert, dass die ausstehenden Primärschlüsseländerungen zuerst geflusht werden. Zuvor war dieser Anwendungsfall einfach kaputt und es wurde ohnehin einInvalidRequestErrorausgelöst. Diese Einschränkung dient dazu, dass die Primärschlüsselattribute sicher aktualisiert werden können, was für den Fall, dass das Objekt mit beziehungsgebundenen sekundären Eagerloadern aktualisiert werden kann, notwendig ist. Diese Regel gilt in allen Fällen, um die API-Verhalten konsistent zu halten, unabhängig davon, ob die PK-Spalten tatsächlich im Refresh benötigt werden oder nicht, da es ohnehin ungewöhnlich ist, einige Attribute eines Objekts zu aktualisieren, während andere Attribute „ausstehend“ bleiben.Die Methode
Session.refresh()wurde so erweitert, dass Attribute, dierelationship()-gebunden und mit einem Eagerloader verknüpft sind, entweder zum Zeitpunkt des Mappings oder über zuletzt verwendete Loader-Optionen, in allen Fällen aktualisiert werden, auch wenn eine Liste von Attributen übergeben wird, die keine Spalten in der Elterntabelle enthält. Dies baut auf der Funktion auf, die zuerst für Nicht-Spalten-Attribute im Rahmen von #1763 (behoben in 1.4) implementiert wurde und die es Beziehungs-gebundenen Attributen mit Eagerloading ermöglichte, an derSession.refresh()-Operation teilzunehmen. Wenn die Refresh-Operation keine Spalten der Elterntabelle zum Aktualisieren angibt, werden die Primärschlüsselspalten trotzdem in die Refresh-Operation einbezogen, was den Ladevorgang in die sekundären Beziehungsloader fortsetzen lässt, wie es normalerweise der Fall ist. Zuvor würde für diesen Fall einInvalidRequestErrorausgelöst (#8703)Problem behoben, bei dem ein unnötiger zusätzlicher SELECT ausgelöst wurde, wenn
Session.refresh()mit einer Kombination aus abgelaufenen Attributen sowie einem Eagerloader wieselectinload(), das eine „sekundäre“ Abfrage auslöst, aufgerufen wurde, wenn die Primärschlüsselattribute ebenfalls im abgelaufenen Zustand waren. Da die Primärschlüsselattribute nun automatisch in den Refresh einbezogen werden, gibt es keinen zusätzlichen Ladevorgang für diese Attribute, wenn ein Beziehungsloader sie auswählt (#8997)Regression behoben, die durch #8126 (veröffentlicht in 2.0.0b1) verursacht wurde, bei der die Methode
Session.refresh()mit einemAttributeErrorfehlschlug, wenn sowohl ein abgelaufener Spaltenname als auch der Name eines beziehungsgebundenen Attributs übergeben wurden, das mit einem „sekundären“ Eagerloader wie demselectinload()Eagerloader verknüpft war (#8996)
[orm] [bug] ¶
Verbesserte eine Korrektur, die erstmals in Version 1.4 für #8456 vorgenommen wurde und die Verwendung interner „polymorpher Adapter“ zurückgeschraubt hat, die zur Darstellung von ORM-Abfragen verwendet werden, wenn der Parameter
Mapper.with_polymorphicverwendet wird. Diese Adapter, die sehr komplex und fehleranfällig sind, werden jetzt nur noch in den Fällen verwendet, in denen eine explizite, vom Benutzer bereitgestellte Unterabfrage fürMapper.with_polymorphicverwendet wird. Dies umfasst nur die Verwendung von konkreten Vererbungszuordnungen, die die Hilfsfunktionpolymorphic_union()verwenden, sowie den Legacy-Fall der Verwendung einer alias-unterstützten Unterabfrage für zugeordnete Vererbungszuordnungen, was bei moderner Verwendung nicht mehr erforderlich ist.Für den häufigsten Fall von zugeordneten Vererbungszuordnungen, die das integrierte polymorphe Ladeschema verwenden, einschließlich derjenigen, die den Parameter
Mapper.polymorphic_loadaufinlinegesetzt verwenden, werden polymorphe Adapter jetzt nicht mehr verwendet. Dies hat sowohl positive Auswirkungen auf die Leistung bei der Konstruktion von Abfragen als auch eine erhebliche Vereinfachung des internen Abfrage-Rendering-Prozesses.Das spezifische Problem, das behoben werden sollte, war die Ermöglichung, dass eine
column_property()auf Klassen mit zugeordneter Vererbung innerhalb einer skalaren Unterabfrage verweist, was jetzt so intuitiv wie möglich funktioniert.Referenzen: #8168
engine¶
[engine] [bug] ¶
Behobene eine seit langem bestehende Race Condition im Verbindungspool, die unter Eventlet/Gevent Monkeypatching-Schemata in Verbindung mit der Verwendung von Eventlet/Gevent
Timeout-Bedingungen auftreten konnte, bei der ein durch Timeout unterbrochener Checkout aus einem Verbindungspool den fehlerhaften Zustand nicht aufräumen konnte, was dazu führte, dass der zugrunde liegende Verbindungsdatensatz und manchmal die Datenbankverbindung selbst „lecken“ und den Pool in einem ungültigen Zustand mit unerreichbaren Einträgen hinterließen. Dieses Problem wurde erstmals in SQLAlchemy 1.2 für #4225 identifiziert und behoben. Jedoch berücksichtigten die in dieser Korrektur erkannten Fehlerarten keineBaseException, sondern nurException, was verhinderte, dass Eventlet/GeventTimeoutabgefangen wurde. Darüber hinaus wurde ein Block während der initialen Pool-Verbindung identifiziert und mit einem BlockBaseException-> „saubere fehlgeschlagene Verbindung“ gehärtet, um dieselbe Bedingung an dieser Stelle zu berücksichtigen. Großer Dank an den Github-Benutzer @niklaus für seine hartnäckigen Bemühungen bei der Identifizierung und Beschreibung dieses komplexen Problems.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #8974
[engine] [bug] ¶
Behoben ein Problem, bei dem die Methode
Result.freeze()für textbasiertes SQL, entweder mittext()oderConnection.exec_driver_sql(), nicht funktionierte.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8963
sql¶
[sql] [usecase] ¶
Im Falle eines Fehlers bei einem „literal bindparam“-Render-Vorgang wird nun ein informativer Re-Raise ausgelöst, der den Wert selbst und den verwendeten Datentyp angibt, um bei der Fehlersuche zu helfen, wenn literale Parameter in einer Anweisung gerendert werden.
Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8800
[sql] [bug] ¶
Behoben ein Problem in der Lambda-SQL-Funktion, bei dem der berechnete Typ eines literalen Werts die Typumwandlungsregeln des „vergleich mit Typ“ nicht berücksichtigte, was zu fehlenden Typinformationen für SQL-Ausdrücke führte, wie z. B. Vergleiche mit
JSON-Elementen und ähnlichem.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #9029
[sql] [bug] ¶
Behoben eine Reihe von Problemen bezüglich der Position und manchmal der Identität von gerenderten gebundenen Parametern, wie sie für SQLite, asyncpg, MySQL, Oracle und andere verwendet werden. Einige kompilierte Formen behielten die Reihenfolge der Parameter nicht korrekt bei, wie z. B. die PostgreSQL-Funktion
regexp_replace(), die „Verschachtelungs“-Funktion desCTE-Konstrukts, das erstmals in #4123 eingeführt wurde, und auswählbare Tabellen, die durch Verwendung der MethodeFunctionElement.column_valued()mit Oracle gebildet wurden.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8827
[sql] [bug] ¶
Testunterstützung wurde hinzugefügt, um sicherzustellen, dass alle
visit_xyz()-Methoden des Compilers in allenCompiler-Implementierungen in SQLAlchemy einen Parameter**kwakzeptieren, sodass alle Compiler zusätzliche Schlüsselwortargumente unter allen Umständen akzeptieren.Referenzen: #8988
[sql] [bug] ¶
Die Methode
SQLCompiler.construct_params()sowie derSQLCompiler.params-Accessor geben nun die exakten Parameter zurück, die einer kompilierten Anweisung entsprechen, die den Parameterrender_postcompilezur Kompilierung verwendet hat. Zuvor gab die Methode eine Parameterstruktur zurück, die für sich allein weder den ursprünglichen Parametern noch den erweiterten Parametern entsprach.Das Übergeben eines neuen Parameter-Wörterbuchs an
SQLCompiler.construct_params()für einenSQLCompiler, der mitrender_postcompilekonstruiert wurde, ist nun nicht mehr zulässig. Stattdessen wird eine neue MethodeSQLCompiler.construct_expanded_state()hinzugefügt, die eine neue erweiterte Form für den gegebenen Parametersatz erzeugt. Diese Methode verwendet den ContainerExpandedState, der eine neue SQL-Anweisung und ein neues Parameter-Wörterbuch sowie ein Tupel positionsbezogener Parameter enthält.Referenzen: #6114
[sql] [bug] ¶
Um Drittanbieter-Dialekte mit unterschiedlichen Anforderungen an die Zeichen-Escapierung für gebundene Parameter zu unterstützen, wurde das System, mit dem SQLAlchemy spezielle Zeichen in Namen von gebundenen Parametern „escapiert“ (d. h. durch ein anderes Zeichen ersetzt), auf Drittanbieter-Dialekte erweiterbar gemacht. Dies geschieht über das Wörterbuch
SQLCompiler.bindname_escape_chars, das auf Klassenebene jederSQLCompiler-Unterklasse überschrieben werden kann. Als Teil dieser Änderung wurde auch der Punkt"."als standardmäßig „escaped“ Zeichen hinzugefügt.Referenzen: #8994
typing¶
asyncio¶
[asyncio] [bug] ¶
Die nicht funktionierende
merge()-Methode wurde ausAsyncResultentfernt. Diese Methode hat nie funktioniert und wurde fälschlicherweise inAsyncResultaufgenommen.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8952
postgresql¶
[postgresql] [bug] ¶
Behobene einen Fehler, bei dem der PostgreSQL-Parameter
Insert.on_conflict_do_update.constrainteinIndex-Objekt akzeptierte, dieses aber nicht in seine einzelnen Indexausdrücke aufteilte, sondern stattdessen seinen Namen in einer ON CONFLICT ON CONSTRAINT-Klausel rendert, was von PostgreSQL nicht akzeptiert wird; die Form „Constraint-Name“ akzeptiert nur Namen eindeutiger oder ausschließender Constraints. Der Parameter akzeptiert weiterhin den Index, dehnt ihn aber nun für das Rendering in seine einzelnen Ausdrücke auf.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #9023
[postgresql] [bug] ¶
Eine Anpassung wurde vorgenommen, wie der PostgreSQL-Dialekt Spaltentypen berücksichtigt, wenn er Spalten aus einer Tabelle spiegelt, um alternative Backends zu unterstützen, die NULL von der PG-Funktion
format_type()zurückgeben könnten.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8748
[postgresql] [bug] ¶
Unterstützung für die explizite Verwendung von PG-Volltextfunktionen mit asyncpg und psycopg (nur SQLAlchemy 2.0) wurde hinzugefügt, bezüglich des
REGCONFIG-Typ-Casts für das erste Argument, das zuvor fälschlicherweise als VARCHAR gecastet wurde, was zu Fehlern bei Dialekten führte, die auf explizite Typ-Casts angewiesen sind. Dies beinhaltet die Unterstützung fürto_tsvector,to_tsquery,plainto_tsquery,phraseto_tsquery,websearch_to_tsquery,ts_headline. Jede dieser Funktionen bestimmt anhand der Anzahl der übergebenen Argumente, ob das erste String-Argument als PostgreSQL „REGCONFIG“-Wert interpretiert werden soll; falls ja, wird das Argument mit einem neu hinzugefügten TypobjektREGCONFIGtypisiert, das dann im SQL-Ausdruck explizit gecastet wird.Referenzen: #8977
[postgresql] [bug] ¶
Behoben einen Rückschritt, bei dem neu überarbeitete PostgreSQL-Bereichstypen wie
INT4RANGEnicht als Implementierung eines benutzerdefinierten TypsTypeDecoratoreingerichtet werden konnten und stattdessen einenTypeErrorauslösten.Referenzen: #9020
[postgresql] [bug] ¶
Die Methode
Range.__eq___()gibt nunNotImplementedzurück, wenn mit einer Instanz einer anderen Klasse verglichen wird, anstatt eineAttributeErrorAusnahme auszulösen.Referenzen: #8984
sqlite¶
[sqlite] [usecase] ¶
Unterstützung für das SQLite-Backend wurde hinzugefügt, um die Schlüsselwörter „DEFERRABLE“ und „INITIALLY“ zu spiegeln, die in einem Fremdschlüsselkonstrukt vorhanden sein können. Pull Request von Michael Gorven.
Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8903
[sqlite] [usecase] ¶
Unterstützung für die Spiegelung von WHERE-Kriterien, die auf Ausdrücken basieren und in Indizes enthalten sind, im SQLite-Dialekt wurde hinzugefügt, ähnlich dem PostgreSQL-Dialekt. Pull Request von Tobias Pfeiffer.
Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8804
oracle¶
[oracle] [bug] ¶
Behoben ein Problem im Oracle-Compiler, bei dem die Syntax für
FunctionElement.column_valued()falsch war und den NamenCOLUMN_VALUErendert, ohne die Quellentabelle korrekt zu qualifizieren.Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8945
tests¶
[tests] [bug] ¶
Behoben ein Problem in der tox.ini-Datei, bei dem Änderungen in der tox 4.0-Serie am Format von „passenv“ dazu führten, dass tox nicht korrekt funktionierte, insbesondere seit tox 4.0.6 eine Fehlermeldung auslöste.
Diese Änderung wird auch zurückportiert nach: 1.4.46
[tests] [bug] ¶
Eine neue Ausschlussregel für Drittanbieter-Dialekte namens
unusual_column_name_characterswurde hinzugefügt. Diese Regel kann für Drittanbieter-Dialekte „geschlossen“ werden, die Spaltennamen mit ungewöhnlichen Zeichen wie Punkten, Schrägstrichen oder Prozentzeichen nicht unterstützen, selbst wenn der Name korrekt zitiert ist.Diese Änderung wird auch zurückportiert nach: 1.4.46
Referenzen: #9002
2.0.0b4¶
Veröffentlicht: 5. Dezember 2022orm¶
[orm] [feature] ¶
Ein neuer Parameter
mapped_column.use_existing_columnwurde hinzugefügt, um den Anwendungsfall einer Single-Table-Inheritance-Zuordnung zu unterstützen, die das Muster verwendet, dass mehr als eine Unterklasse dieselbe Spalte für die Oberklasse angibt. Dieses Muster war zuvor möglich durch die Verwendung vondeclared_attr()in Verbindung mit der Lokalisierung der vorhandenen Spalte in der.__table__der Oberklasse. Es wurde nun aktualisiert, um auch mitmapped_column()und PEP-484-Typisierung auf einfache und prägnante Weise zu funktionieren.Referenzen: #8822
[orm] [usecase] ¶
Unterstützung für benutzerdefinierte Typen, die von der Python-Basisklasse
enum.Enumabgeleitet sind, wurde hinzugefügt, um sie automatisch auf SQLAlchemyEnumSQL-Typen abzubilden, wenn die Annotated Declarative Table-Funktion verwendet wird. Die Funktion wird durch neue Lookup-Funktionen im ORM-Typ-Map-Feature ermöglicht und umfasst die Unterstützung für die Änderung der Argumente desEnum, das standardmäßig generiert wird, sowie für die Einrichtung spezifischerenum.Enum-Typen in der Map mit spezifischen Argumenten.Referenzen: #8859
[orm] [usecase] ¶
Der Parameter
mapped_column.comparewurde zu relevanten ORM-Attributkonstrukten wiemapped_column(),relationship()usw. hinzugefügt, um den Parametercomparevon Python-Dataclasses fürfield()bereitzustellen, wenn die Funktion Declarative Dataclass Mapping verwendet wird. Pull Request von Simon Schiele.Referenzen: #8905
[orm] [bug] ¶
Behoben ein Problem, bei dem die Verwendung eines unbekannten Datentyps innerhalb einer
Mapped-Annotation für ein spaltenbasiertes Attribut lautlos fehlschlug, anstatt eine Ausnahme zu melden; eine informative Ausnahme wird nun ausgelöst.Referenzen: #8888
[orm] [bug] ¶
Behoben eine Reihe von Problemen, bei denen die Verwendung von
Mappedmit Wörterbuchtypen wieMapped[Dict[str, str] | None]in deklarativen ORM-Zuordnungen nicht korrekt interpretiert wurde. Die Unterstützung zur korrekten „De-Optionalisierung“ dieses Typs, einschließlich der Suche intype_annotation_map, wurde behoben.Referenzen: #8777
[orm] [bug] [performance] ¶
Weitere Leistungsverbesserungen innerhalb von ORM-aktivierten SQL-Anweisungen, die sich speziell auf Aufrufanzahlen bei der Konstruktion von ORM-Anweisungen konzentrieren. Dies geschieht durch die Kombination von
aliased()mitunion()und ähnlichen „zusammengesetzten“ Konstrukten, zusätzlich zu direkten Leistungsverbesserungen der internen Methodecorresponding_column(), die von ORM-Konstrukten wiealiased()und ähnlichen stark genutzt wird.Referenzen: #8796
[orm] [bug] ¶
Behoben einen Fehler in der Funktion Declarative Dataclass Mapping, bei dem die Verwendung von einfachen Dataclass-Feldern mit der Direktive
__allow_unmapped__in einer Zuordnung kein Dataclass mit dem korrekten klassenbasierten Zustand für diese Felder erzeugte. Das roheField-Objekt wurde unangemessen auf die Klasse kopiert, nachdem Dataclasses selbst dasField-Objekt durch den klassenbasierten Standardwert ersetzt hatten.Referenzen: #8880
[orm] [bug] [regression] ¶
Behoben einen Rückschritt, bei dem das Flushen einer zugeordneten Klasse, die gegen eine Unterabfrage zugeordnet ist, wie z. B. eine direkte Zuordnung oder einige Formen der konkreten Tabellenvererbung, fehlschlagen würde, wenn der Parameter
Mapper.eager_defaultsverwendet wurde.Referenzen: #8812
[orm] [bug] ¶
Behoben einen Rückschritt in 2.0.0b3, der durch #8759 verursacht wurde, bei dem die Angabe des
Mapped-Namens mit einem qualifizierten Namen wiesqlalchemy.orm.Mappedvon Declarative nicht als Hinweis auf dasMapped-Konstrukt erkannt wurde.Referenzen: #8853
orm extensions¶
[usecase] [orm extensions] ¶
Unterstützung für die Erweiterungsfunktion
association_proxy()wurde hinzugefügt, um an der Pythondataclasses-Konfiguration teilzunehmen, wenn die native Dataclasses-Funktion unter Declarative Dataclass Mapping verwendet wird. Dazu gehören auf Attributebene liegende Argumente wieassociation_proxy.initundassociation_proxy.default_factory.Die Dokumentation für den Assoziations-Proxy wurde ebenfalls aktualisiert, um in Beispielen "Annotated Declarative Table"-Formulare zu verwenden, einschließlich Typ-Annotationen, die für
AssocationProxyselbst verwendet werden.Referenzen: #8878
sql¶
[sql] [usecase] ¶
Hinzugefügt:
ScalarValues, die als Spaltenelement verwendet werden können, umValuesinnerhalb vonIN-Klauseln oder in Verbindung mitANYoderALL-Sammlungsaggregationen zu verwenden. Diese neue Klasse wird über die MethodeValues.scalar_values()generiert. DieValues-Instanz wird nun in eineScalarValues-Instanz umgewandelt, wenn sie in einerIN- oderNOT IN-Operation verwendet wird.Referenzen: #6289
[sql] [bug] ¶
Kritische Speicherproblem behoben, das bei der Generierung von Cache-Schlüsseln identifiziert wurde. Bei sehr großen und komplexen ORM-Anweisungen, die viele ORM-Aliase mit Unterabfragen verwenden, konnte die Generierung von Cache-Schlüsseln exzessiv große Schlüssel erzeugen, die um Größenordnungen größer waren als die Anweisung selbst. Vielen Dank an Rollo Konig Brock für seine sehr geduldige, langjährige Hilfe bei der endgültigen Identifizierung dieses Problems.
Diese Änderung wird auch zurückportiert zu: 1.4.44
Referenzen: #8790
[sql] [bug] ¶
Der Ansatz für den
numericpep-249 paramstyle wurde neu geschrieben und wird nun vollständig unterstützt, auch durch Funktionen wie "expanding IN" und "insertmanyvalues". Parameternamen können auch in der Quell-SQL-Konstruktion wiederholt werden, die im numerischen Format mit einem einzigen Parameter korrekt dargestellt werden. Ein zusätzlicher numerischer paramstyle namensnumeric_dollarwurde eingeführt, der speziell für die asyncpg-Dialekte verwendet wird; der paramstyle ist äquivalent zunumeric, außer dass numerische Indikatoren durch ein Dollarzeichen anstelle eines Doppelpunkts gekennzeichnet sind. Der asyncpg-Dialekt verwendet nun direkt dennumeric_dollarparamstyle, anstatt ihn zuerst in denformat-Stil zu kompilieren.Die
numericundnumeric_dollarparamstyles gehen davon aus, dass das Ziel-Backend in der Lage ist, die numerischen Parameter in beliebiger Reihenfolge zu empfangen, und ordnet die gegebenen Parameterwerte der Anweisung basierend auf der Übereinstimmung ihrer Position (1-basiert) mit dem numerischen Indikator zu. Dies ist das normale Verhalten von "numerischen" paramstyles, obwohl beobachtet wurde, dass der SQLite DBAPI einen nicht verwendeten "numerischen" Stil implementiert, der die Reihenfolge der Parameter nicht berücksichtigt.Referenzen: #8849
[sql] [bug] ¶
Die Darstellung von
RETURNINGwurde angepasst, insbesondere bei Verwendung vonInsert. Spalten werden nun mit derselben Logik wie beimSelect-Konstrukt gerendert, um Labels zu generieren, die auch disambiguierende Labels enthalten, sowie dass eine SQL-Funktion, die eine benannte Spalte umschließt, mit dem Spaltennamen selbst beschriftet wird. Dies schafft eine bessere Kompatibilität beim Auswählen von Zeilen ausSelect-Konstrukten oder aus DML-Anweisungen, dieUpdateBase.returning()verwenden. Eine engere Änderung wurde auch für die 1.4er-Reihe vorgenommen, die nur das Problem mit der Funktionsbeschriftung behoben hat.Referenzen: #8770
schema¶
[schema] [bug] ¶
Strengere Regeln gelten für das Anhängen von
Column-Objekten anTable-Objekte. Sowohl frühere Deprecations-Warnungen wurden zu Ausnahmen, als auch einige frühere Szenarien, die dazu führten, dass doppelte Spalten in Tabellen auftraten, wennTable.extend_existingaufTruegesetzt war, sowohl für die programmatischeTable-Konstruktion als auch während Reflektionsoperationen.Siehe Strengere Regeln für den Ersatz von Spalten in Tabellen-Objekten mit gleichen Namen und Schlüsseln für eine Zusammenfassung dieser Änderungen.
Siehe auch
Strengere Regeln für den Ersatz von Spalten in Tabellen-Objekten mit gleichen Namen und Schlüsseln
Referenzen: #8925
typing¶
[typing] [usecase] ¶
Ein neuer Typ
SQLColumnExpressionwurde hinzugefügt, der im Benutzercode zur Darstellung von beliebigen spaltenorientierten SQL-Ausdrücken verwendet werden kann, einschließlich solcher, die aufColumnElementbasieren, als auch auf ORMQueryableAttribute. Dieser Typ ist eine echte Klasse, kein Alias, und kann daher auch als Grundlage für andere Objekte dienen. Eine zusätzliche ORM-spezifische UnterklasseSQLORMExpressionist ebenfalls enthalten.Referenzen: #8847
[typing] [bug] ¶
Interne Verwendung der Python-Klasse
enum.IntFlagwurde angepasst, da diese ihren Verhaltensvertrag in Python 3.11 geändert hat. Dies führte nicht zu Laufzeitfehlern, aber zu Fehlern bei Typüberprüfungen unter Python 3.11.Referenzen: #8783
[typing] [bug] ¶
Die Erweiterungen
sqlalchemy.ext.mutableundsqlalchemy.ext.automapsind nun vollständig PEP-484-typisiert. Vielen Dank an Gleb Kisenkov für seine Bemühungen hierbei.[typing] [bug] ¶
Typunterstützung für das Argument
relationship.secondarywurde korrigiert, das auch ein Callable (Lambda) akzeptieren kann, das einFromClausezurückgibt.[typing] [bug] ¶
Die Typisierung für
sessionmakerundasync_sessionmakerwurde verbessert, sodass der Standardtyp ihres RückgabewertsSessionoderAsyncSessionist, ohne dass dies explizit angegeben werden muss. Zuvor konnte Mypy diese Rückgabetypen nicht automatisch aus seiner generischen Basis ableiten.Als Teil dieser Änderung wurden die Argumente für
Session,AsyncSession,sessionmakerundasync_sessionmakerüber das initiale "bind"-Argument hinaus zu schlüsselwortpflichtigen Argumenten gemacht. Dies umfasst Parameter, die immer als schlüsselwortbasierte Argumente dokumentiert waren, wie z. B.Session.autoflush,Session.class_, usw.Pull-Request von Sam Bull.
Referenzen: #8842
[typing] [bug] ¶
Problem behoben, bei dem die Übergabe einer aufrufbaren Funktion, die ein Iterable von Spaltenelementen zurückgibt, an
relationship.order_byvon Typprüfern als Fehler markiert wurde.Referenzen: #8776
postgresql¶
[postgresql] [usecase] ¶
Als Ergänzung zu #8690 wurden neue Vergleichsmethoden wie
Range.adjacent_to(),Range.difference(),Range.union()usw. zu den PG-spezifischen Range-Objekten hinzugefügt, wodurch diese mit den Standardoperatoren gleichgestellt werden, die von der zugrunde liegendenAbstractRange.comparator_factoryimplementiert werden.Zusätzlich wurde die Methode
__bool__()der Klasse korrigiert, um mit dem Verhalten gängiger Python-Container und anderer populärer PostgreSQL-Treiber übereinzustimmen: Sie gibt nun an, ob die Range-Instanz *nicht* leer ist, anstatt umgekehrt.Pull-Request von Lele Gaifax.
Referenzen: #8765
[postgresql] [change] [asyncpg] ¶
Der von asyncpg verwendete Paramstyle wurde von
formataufnumeric_dollargeändert. Dies hat zwei Hauptvorteile, da keine zusätzliche Verarbeitung der Anweisung erforderlich ist und doppelte Parameter in den Anweisungen vorhanden sein können.Referenzen: #8926
[postgresql] [bug] [mssql] ¶
Nur für die PostgreSQL- und SQL Server-Dialekte wurde der Compiler so angepasst, dass beim Rendern von Spaltenausdrücken in der RETURNING-Klausel das "nicht anonyme" Label, das in SELECT-Anweisungen verwendet wird, für SQL-Ausdruckselemente, die ein Label generieren, vorgeschlagen wird. Das Hauptbeispiel ist eine SQL-Funktion, die als Teil des Spaltentyps ausgegeben werden kann, wobei der Labelname standardmäßig dem Spaltennamen entsprechen sollte. Dies stellt ein nicht gut definiertes Verhalten wieder her, das sich in Version 1.4.21 aufgrund von #6718, #6710 geändert hatte. Der Oracle-Dialekt hat eine andere RETURNING-Implementierung und war von diesem Problem nicht betroffen. Version 2.0 bietet eine übergreifende Änderung für seine weit verbreitete Unterstützung von RETURNING auf anderen Backends.
Diese Änderung wird auch zurückportiert zu: 1.4.44
Referenzen: #8770
[postgresql] [bug] ¶
Zusätzliche Typenerkennung für den neuen PostgreSQL
Range-Typ wurde hinzugefügt. Frühere Fälle, die es erlaubten, dass native psycopg2-Bereichsobjekte direkt vom DBAPI empfangen wurden, ohne dass SQLAlchemy sie abfing, funktionierten nicht mehr, da wir nun ein eigenes Wertobjekt haben. DasRange-Objekt wurde erweitert, so dass SQLAlchemy Core es in ansonsten mehrdeutigen Situationen (z. B. beim Vergleich mit Daten) erkennt und entsprechende Bindungshandler anwendet. Pull-Request von Lele Gaifax.Referenzen: #8884
mssql¶
[mssql] [bug] ¶
Regression behoben, die durch die Kombination von #8177 (Wiederaktivierung von setinputsizes für SQL Server, es sei denn, fast_executemany + DBAPI executemany wird für eine Anweisung verwendet) und #6047 (Implementierung von "insertmanyvalues", das DBAPI executemany durch eine benutzerdefinierte DBAPI-Ausführung für INSERT-Anweisungen umgeht) verursacht wurde. setinputsizes wäre bei einer Mehrfachparameter-INSERT-Anweisung, die "insertmanyvalues" verwendete, fälschlicherweise nicht verwendet worden, wenn fast_executemany aktiviert war, da die Prüfung fälschlicherweise davon ausging, dass es sich um einen DBAPI-executemany-Aufruf handelt. Die "Regression" wäre dann, dass das "insertmanyvalues"-Anweisungsformat anscheinend etwas empfindlicher auf mehrere Zeilen reagiert, die nicht die gleichen Typen für jede Zeile verwenden, so dass setinputsizes in einem solchen Fall besonders benötigt wird.
Die Korrektur behebt die Prüfung von fast_executemany, sodass setinputsizes nur dann deaktiviert wird, wenn echtes DBAPI executemany verwendet werden soll.
Referenzen: #8917
oracle¶
[oracle] [bug] ¶
Fortgesetzte Korrekturen für Oracle-Fix #8708, veröffentlicht in 1.4.43, bei dem gebundene Parameternamen, die mit Unterstrichen beginnen und von Oracle nicht zugelassen werden, immer noch nicht unter allen Umständen ordnungsgemäß escaped wurden.
Diese Änderung wird auch zurückportiert nach: 1.4.45
Referenzen: #8708
tests¶
[tests] [bug] ¶
Problem behoben, bei dem der Parameter
--disable-asynciofür die Testsuite die grünenlet-Tests nicht tatsächlich nicht ausführte und auch die Verwendung eines "umschließenden" grünenlets für die gesamte Suite nicht verhinderte. Dieser Parameter stellt nun sicher, dass bei Einstellung keine grünenlet- oder asyncio-Nutzung während des gesamten Laufs erfolgt.Diese Änderung wird auch zurückportiert zu: 1.4.44
Referenzen: #8793
2.0.0b3¶
Veröffentlicht: 4. November 2022orm¶
[orm] [bug] ¶
Problem bei der "joined eager loading" behoben, bei dem eine Assertionsverletzung mit einer bestimmten Kombination aus äußeren/inneren joined eager loads auftrat, wenn eager loading über drei Mapper erfolgte, wobei der mittlere Mapper ein vererbter Unterklassen-Mapper war.
Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8738
[orm] [bug] ¶
Fehler behoben, bei dem
Select-Konstrukte, bei denen Kombinationen vonSelect.select_from()mitSelect.join()sowie bei Verwendung vonSelect.join_from()dazu führten, dass die Funktionwith_loader_criteria()sowie die für Single-Table-Inheritance-Abfragen benötigten IN-Kriterien nicht gerendert wurden, in Fällen, in denen die Spaltenklausel der Abfrage die linke Entität des JOINs nicht explizit enthielt. Die korrekte Entität wird nun an das intern generierteJoin-Objekt übertragen, sodass die Kriterien gegen die linke Entität korrekt hinzugefügt werden.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8721
[orm] [bug] ¶
Eine informative Ausnahme wird nun ausgelöst, wenn die Option
with_loader_criteria()als Ladeoption zu einem bestimmten "Ladepfad" hinzugefügt wird, z. B. bei Verwendung inLoad.options(). Diese Verwendung wird nicht unterstützt, dawith_loader_criteria()nur als Top-Level-Ladeoption vorgesehen ist. Zuvor wurde ein interner Fehler generiert.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8711
[orm] [bug] ¶
Der "dictionary mode" für
Session.get()wurde verbessert, sodass Synonymnamen, die auf Primärschlüsselattribute verweisen, im benannten Dictionary angegeben werden können.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8753
[orm] [bug] ¶
Problem behoben, bei dem "selectin_polymorphic" Loading für Vererbungs-Mapper nicht korrekt funktionierte, wenn der Parameter
Mapper.polymorphic_onauf einen SQL-Ausdruck verwies, der nicht direkt auf der Klasse abgebildet war.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8704
[orm] [bug] ¶
Problem behoben, bei dem der zugrunde liegende DBAPI-Cursor nicht geschlossen wurde, wenn das
Query-Objekt als Iterator verwendet wurde, wenn eine benutzerspezifische Ausnahme während der Iteration ausgelöst wurde, was dazu führte, dass der Iterator vom Python-Interpreter geschlossen wurde. Bei Verwendung vonQuery.yield_per()zum Erstellen von serverseitigen Cursorn führte dies zu den üblichen MySQL-bezogenen Problemen mit serverseitigen Cursorn, die nicht synchron sind, und ohne direkten Zugriff auf dasResult-Objekt konnte der Endbenutzercode nicht auf den Cursor zugreifen, um ihn zu schließen.Zur Behebung wurde eine Behandlung für
GeneratorExitin der Iterator-Methode implementiert, die das Ergebnisobjekt in diesen Fällen schließt, wenn der Iterator unterbrochen wurde und per Definition vom Python-Interpreter geschlossen wird.Als Teil dieser Änderung, die für die 1.4er-Reihe implementiert wurde, wurde sichergestellt, dass
.close()-Methoden für alleResult-Implementierungen verfügbar sind, einschließlichScalarResultundMappingResult. Die 2.0-Version dieser Änderung enthält auch neue Kontextmanager-Muster für die Verwendung mitResult-Klassen.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8710
orm declarative¶
[orm] [declarative] [bug] ¶
Unterstützung in ORM-deklarativen Annotationen für Klassennamen, die für
relationship()angegeben wurden, sowie für den Namen desMapped-Symbols selbst, hinzugefügt, um unterschiedliche Namen als ihre direkten Klassennamen zu unterstützen. Dies dient zur Unterstützung von Szenarien, in denenMappedalsfrom sqlalchemy.orm import Mapped as Mimportiert wird, oder wo verwandte Klassennamen auf ähnliche Weise mit einem alternativen Namen importiert werden. Darüber hinaus wird ein Zielklassenname, der als erstes Argument fürrelationship()angegeben wird, immer den Namen in der linken Annotation überschreiben, sodass auch unimportierbare Namen, die nicht mit dem Klassennamen übereinstimmen, in Annotationen verwendet werden können.Referenzen: #8759
[orm] [declarative] [bug] ¶
Verbesserte Unterstützung für Legacy-1.4-Mappings, die Annotationen verwenden, die nicht
Mapped[]enthalten. Es wird sichergestellt, dass das Attribut__allow_unmapped__verwendet werden kann, um solche Legacy-Annotationen ohne Fehler durch Annotated Declarative zu lassen und sie nicht im ORM-Laufzeitkontext zu interpretieren. Zusätzlich wurde die Fehlermeldung verbessert, die bei Erkennung dieser Bedingung generiert wird, und weitere Dokumentation hinzugefügt, wie diese Situation gehandhabt werden sollte. Leider kann die 1.4er-Migration-Warnung WARN_SQLALCHEMY_20 dieses spezielle Konfigurationsproblem zur Laufzeit mit ihrer aktuellen Architektur nicht erkennen.Referenzen: #8692
[orm] [declarative] [bug] ¶
Ein grundlegendes Konfigurationsverhalten von
Mapperwurde geändert.Column-Objekte, die explizit im WörterbuchMapper.propertiesvorhanden sind, entweder direkt oder innerhalb eines Mapper-Eigenschaftsobjekts, werden nun in der Reihenfolge ihres Erscheinens in der zugeordnetenTable(oder einer anderen auswählbaren) selbst zugeordnet (vorausgesetzt, sie sind Teil der Spaltenliste dieser Tabelle). Dadurch wird die gleiche Reihenfolge der Spalten in der zugeordneten auswählbaren wie auf der zugeordneten Klasse abgebildet und in einer ORM SELECT-Anweisung für diesen Mapper gerendert. Zuvor (seit Version 0.0.1) wurdenColumn-Objekte im WörterbuchMapper.propertiesimmer zuerst zugeordnet, bevor die anderen Spalten der zugeordnetenTablezugeordnet wurden. Dies führte zu einer Diskrepanz in der Reihenfolge, in der der Mapper Attribute der zugeordneten Klasse zuordnete, sowie in der Reihenfolge, in der sie in Anweisungen gerendert wurden.Die Änderung erfolgt hauptsächlich in der Art und Weise, wie Declarative deklarierte Spalten dem
Mapperzuordnet, insbesondere wieColumn(odermapped_column()) Objekte behandelt werden, wenn sie einen DDL-Namen haben, der sich explizit vom abgebildeten Attributnamen unterscheidet, sowie wenn Konstrukte wiedeferred()usw. verwendet werden. Das neue Verhalten sieht vor, dass die Spaltenreihenfolge innerhalb der abgebildetenTabledie gleiche ist wie die Reihenfolge, in der die Attribute der Klasse zugeordnet werden, die innerhalb desMapperselbst zugewiesen werden, und die in ORM-Anweisungen wie SELECT-Anweisungen gerendert werden, unabhängig davon, wie dieColumndemMapperzugeordnet wurde.Referenzen: #8705
[orm] [declarative] [bug] ¶
Problem behoben, bei dem bei der neuen Funktion für die Zuordnung von Datenklassen eine auf der Deklarativbasis / abstrakten Basis / Mixin deklarierte Spalte unter bestimmten Umständen in den Konstruktor einer erbenden Unterklasse "durchsickern" konnte.
Referenzen: #8718
[bug] [orm declarative] ¶
Probleme innerhalb des deklarativen Typen-Resolvers (d. h. der
ForwardRef-Objekte auflöst) behoben, bei denen Typen, die für Spalten in einer bestimmten Quelldatei deklariert wurden,NameErrorauslösten, wenn die endgültige zugeordnete Klasse in einer anderen Quelldatei lag. Die Typen werden nun im Hinblick auf das Modul für jede Klasse aufgelöst, in der die Typen verwendet werden.Referenzen: #8742
engine¶
[engine] [feature] ¶
Um den Anwendungsfall der Iteration von
ResultundAsyncResultObjekten besser zu unterstützen, bei denen benutzerdefinierte Ausnahmen die Iteration unterbrechen können, unterstützen nun beide Objekte sowie Varianten wieScalarResult,MappingResult,AsyncScalarResult,AsyncMappingResultdie Verwendung als Kontextmanager, wobei das Ergebnis am Ende des Kontextmanager-Blocks geschlossen wird.Zusätzlich wurde sichergestellt, dass alle oben genannten
ResultObjekte eineResult.close()Methode sowieResult.closedAccessoren enthalten, einschließlichScalarResultundMappingResult, die zuvor keine.close()Methode hatten.Referenzen: #8710
[engine] [usecase] ¶
Neuer Parameter
PoolEvents.reset.reset_statewurde demPoolEvents.reset()Event hinzugefügt, mit aktivierter Deprecationslogik, die weiterhin Event-Hooks mit der vorherigen Argumentenliste akzeptiert. Dieser Parameter gibt verschiedene Statusinformationen darüber an, wie der Reset durchgeführt wird, und ermöglicht benutzerdefinierte Reset-Schemata mit vollständigem Kontext.Innerhalb dieser Änderung ist eine Korrektur enthalten, die auch nach 1.4 zurückportiert wird und das
PoolEvents.reset()Event wieder aktiviert, damit es unter allen Umständen weiterhin stattfindet, auch wenn dieConnectiondie Verbindung bereits „zurückgesetzt“ hat.Die beiden Änderungen zusammen ermöglichen die Implementierung benutzerdefinierter Reset-Schemata unter Verwendung des
PoolEvents.reset()Events, anstatt desPoolEvents.checkin()Events (das weiterhin wie gewohnt funktioniert).Referenzen: #8717
[engine] [bug] [regression] ¶
Problem behoben, bei dem der Hook für das
PoolEvents.reset()Event nicht in allen Fällen aufgerufen wurde, wenn eineConnectiongeschlossen wurde und die DBAPI-Verbindung gerade an den Connection-Pool zurückgegeben wurde.Das Szenario trat auf, wenn die
Connectionbereits.rollback()auf ihrer DBAPI-Verbindung ausgelöst hatte, während die Verbindung an den Pool zurückgegeben wurde. Dabei wurde dem Connection-Pool angewiesen, sein eigenes „Reset“ zu überspringen, um den zusätzlichen Methodenaufruf zu sparen. Dies verhinderte jedoch die Verwendung benutzerdefinierter Pool-Reset-Schemata innerhalb dieses Hooks, da solche Hooks per Definition mehr tun, als nur.rollback()aufzurufen, und unter allen Umständen aufgerufen werden müssen. Dies war eine Regression, die in Version 1.4 auftrat.Für Version 1.4 bleibt das
PoolEvents.checkin()als alternatives Event zum Aufrufen benutzerdefinierter „Reset“-Implementierungen weiterhin gültig. Version 2.0 wird eine verbesserte Version vonPoolEvents.reset()einführen, die für zusätzliche Szenarien wie die Beendigung von asyncio-Verbindungen aufgerufen wird und auch kontextbezogene Informationen über den Reset erhält, um „benutzerdefinierte Verbindungs-Reset“-Schemata zu ermöglichen, die auf verschiedene Reset-Szenarien unterschiedlich reagieren können.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8717
sql¶
[sql] [bug] ¶
Problem behoben, das verhinderte, dass die
literal_column()-Konstruktion im Kontext einerSelect-Konstruktion und an anderen Stellen, an denen „anonyme Labels“ generiert werden könnten, korrekt funktionierte, wenn der literale Ausdruck Zeichen enthielt, die mit Format-Strings kollidieren könnten, wie z. B. eine öffnende Klammer, aufgrund eines Implementierungsdetails der „anonymen Label“-Struktur.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8724
typing¶
[typing] [bug] ¶
Verschiedene Typisierungsfehler in den Paketen `engine` und `async engine` behoben.
postgresql¶
[postgresql] [feature] ¶
Neue Methoden
Range.contains()undRange.contained_by()wurden dem neuen DatenobjektRangehinzugefügt. Diese spiegeln das Verhalten der PostgreSQL-Operatoren@>und<@sowie die SQL-Operator-Methodencomparator_factory.contains()undcomparator_factory.contained_by()wider. Pull Request von Lele Gaifax.Referenzen: #8706
[postgresql] [usecase] ¶
Der neue Ansatz für Range-Objekte, der unter New RANGE / MULTIRANGE support and changes for PostgreSQL backends beschrieben wurde, wurde verfeinert, um Treiber-spezifische Range- und Multirange-Objekte zu unterstützen. Dies dient dazu, sowohl Legacy-Code als auch die Übergabe von Ergebnissen aus rohen SQL-Resultsets in neue Range- oder Multirange-Ausdrücke besser zu handhaben.
Referenzen: #8690
mssql¶
[mssql] [bug] ¶
Problem behoben mit
Inspector.has_table(), welches bei Verwendung gegen temporäre Tabellen mit dem SQL Server Dialekt bei einigen Azure-Varianten fehlschlug, aufgrund einer unnötigen Abfrage des Informationsschemas, die auf diesen Serverversionen nicht unterstützt wird. Pull Request von Mike Barry.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8714
[mssql] [bug] [reflection] ¶
Problem behoben mit
Inspector.has_table(), welches bei Verwendung gegen eine View mit dem SQL Server Dialekt fälschlicherweiseFalsezurückgab. Dies war eine Regression in der 1.4-Serie, die die Unterstützung dafür unter SQL Server entfernte. Die 2.0-Serie, die eine andere Reflexionsarchitektur verwendet, ist von diesem Problem nicht betroffen. Testunterstützung wurde hinzugefügt, um sicherzustellen, dasshas_table()gemäß Spezifikation bezüglich Views weiterhin funktioniert.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8700
oracle¶
[oracle] [bug] ¶
Problem behoben, bei dem gebundene Parameternamen, einschließlich derer, die automatisch aus ähnlich benannten Datenbankspalten abgeleitet wurden und Zeichen enthielten, die bei Oracle normalerweise Anführungszeichen erfordern, bei Verwendung von „expandierenden Parametern“ mit dem Oracle-Dialekt nicht maskiert wurden, was zu Ausführungsfehlern führte. Die übliche „Maskierung“ für gebundene Parameter, die vom Oracle-Dialekt verwendet wird, wird bei der „expandierenden Parameter“-Architektur nicht verwendet. Daher wird nun eine Liste von Zeichen/Maskierungen verwendet, die spezifisch für Oracle sind, um eine große Bandbreite von Zeichen zu maskieren.
Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8708
[oracle] [bug] ¶
Problem behoben, bei dem die Ansicht
nls_session_parameters, die beim ersten Verbindungsaufbau abgefragt wurde, um das Standard-Dezimaltrennzeichen zu ermitteln, je nach Oracle-Verbindungsmodus möglicherweise nicht verfügbar war und daher einen Fehler auslöste. Der Ansatz zur Erkennung des Dezimalzeichens wurde vereinfacht, um direkt einen Dezimalwert zu testen, anstatt Systemansichten zu lesen, was auf jedem Backend/Treiber funktioniert.Diese Änderung wird auch zurückportiert zu: 1.4.43
Referenzen: #8744
2.0.0b2¶
Veröffentlicht: 20. Oktober 2022orm¶
[orm] [bug] ¶
Die Warnung, die beim Verwenden von ORM-fähigen Update/Delete-Anweisungen bezüglich der Auswertung von Spalten nach Namen ausgelöst wurde (zuerst hinzugefügt in #4073), wurde entfernt. Diese Warnung deckte tatsächlich ein Szenario ab, das andernfalls den falschen Python-Wert für ein ORM-abgebildetes Attribut populiert hätte, abhängig von der tatsächlichen Spalte. Daher wurde dieser veraltete Fall entfernt. In 2.0 verwenden ORM-fähige Update/Delete-Anweisungen „auto“ für „synchronize_session“, was für jede gegebene UPDATE-Anweisung automatisch das Richtige tun sollte.
Referenzen: #8656
orm declarative¶
[orm] [declarative] [usecase] ¶
Unterstützung für abgebildete Klassen hinzugefügt, die auch
Generic-Unterklassen sind, um alsGenericAlias-Objekt (z. B.MyClass[str]) in Anweisungen und Aufrufen voninspect()angegeben zu werden.Referenzen: #8665
[orm] [declarative] [bug] ¶
Die Klasse
DeclarativeBasewurde verbessert, sodass bei Kombination mit anderen Mixins wieMappedAsDataclassdie Reihenfolge der Klassen beliebig sein kann.Referenzen: #8665
[orm] [declarative] [bug] ¶
Fehler in neuen ORM-typisierten deklarativen Abbildungen behoben, bei dem die Möglichkeit,
Optional[MyClass]oder ähnliche Formen wieMyClass | Nonein der Typannotation für eine Many-to-One-Beziehung zu verwenden, nicht implementiert war, was zu Fehlern führte. Dokumentation für diesen Anwendungsfall wurde auch zu den Dokumenten zur Konfiguration von Beziehungen hinzugefügt.Referenzen: #8668
[orm] [declarative] [bug] ¶
Problem behoben mit der neuen Dataclass-Mapping-Funktion, bei der Argumente, die an die Dataclasses API übergeben wurden, bei der Behandlung von Mixins, die
mapped_column()-Deklarationen überschreiben, manchmal falsch geordnet werden konnten, was zu Initialisierungsproblemen führte.Referenzen: #8688
sql¶
[sql] [bug] [regression] ¶
Fehler in der neuen „insertmanyvalues“-Funktion behoben, bei der INSERT-Anweisungen, die eine Subquery mit
bindparam()enthielten, im „insertmanyvalues“-Format nicht korrekt gerendert wurden. Dies betraf vor allem `psycopg2`, da „insertmanyvalues“ mit diesem Treiber bedingungslos verwendet wird.Referenzen: #8639
typing¶
[typing] [bug] ¶
Typisierungsfehler behoben, bei dem der strenge Modus von Pylance „instance variable overrides class variable“ meldete, wenn eine Methode verwendet wurde, um
__tablename__,__mapper_args__oder__table_args__zu definieren.Referenzen: #8645
[typing] [bug] ¶
Typisierungsfehler behoben, bei dem der strenge Modus von Pylance für den
mapped_column()-Konstrukt einen „teilweise unbekannten“ Datentyp meldete.Referenzen: #8644
mssql¶
[mssql] [bug] ¶
Regression behoben, verursacht durch die Änderung #8177 in SQL Server pyodbc, bei der wir nun standardmäßig
setinputsizes()verwenden. Für VARCHAR schlägt dies fehl, wenn die Zeichengröße 4000 (oder 2000, je nach Daten) Zeichen übersteigt, da der eingehende Datentyp NVARCHAR ist, der eine Grenze von 4000 Zeichen hat, obwohl VARCHAR unbegrenzte Zeichen verarbeiten kann. Zusätzliche pyodbc-spezifische Typinformationen werden nun ansetinputsizes()übergeben, wenn die Größe des Datentyps > 2000 Zeichen beträgt. Die Änderung wird auch auf denJSON-Typ angewendet, der ebenfalls von diesem Problem bei großen JSON-Serialisierungen betroffen war.Referenzen: #8661
[mssql] [bug] ¶
Die
Sequence-Konstruktion stellt das DDL-Verhalten wieder her, das sie vor der 1.4-Serie hatte. Wenn eineSequenceohne zusätzliche Argumente erstellt wird, wird eine einfacheCREATE SEQUENCE-Anweisung **ohne** zusätzliche Parameter für den „Startwert“ ausgegeben. Für die meisten Backends funktionierte es ohnehin bereits so; **jedoch** ist für MS SQL Server der Standardwert auf dieser Datenbank-2**63. Um diesen im Allgemeinen unpraktischen Standardwert auf SQL Server zu vermeiden, sollte der ParameterSequence.startangegeben werden. Da die Verwendung vonSequencefür SQL Server ungewöhnlich ist, der seit vielen Jahren aufIDENTITYstandardisiert hat, wird gehofft, dass diese Änderung minimale Auswirkungen hat.Referenzen: #7211
2.0.0b1¶
Veröffentlicht: 13. Oktober 2022general¶
[general] [changed] ¶
Der Code wurde migriert, um alle vor 2.0 liegenden Verhaltensweisen und Architekturen zu entfernen, die zuvor für die Entfernung in 2.0 als veraltet markiert waren, einschließlich, aber nicht beschränkt auf:
Entfernung von allem Python-2-Code, Mindestversion ist jetzt Python 3.7
EngineundConnectionverwenden jetzt den neuen 2.0-Stil der Arbeit, der „autobegin“, die Entfernung von Library-Level-Autocommit, Subtransaktionen und „verzweigte“ Verbindungen beinhaltet.Result-Objekte verwenden 2.0-Stil-Verhaltensweisen;
Rowist vollständig ein benanntes Tupel ohne „Mapping“-Verhalten, verwenden SieRowMappingfür „Mapping“-Verhalten.Die gesamte Unicode-Kodierungs-/Dekodierungsarchitektur wurde aus SQLAlchemy entfernt. Alle modernen DBAPI-Implementierungen unterstützen dank Python 3 Unicode transparent. Daher wurden die Funktion
convert_unicodesowie verwandte Mechanismen zur Suche nach Bytestrings incursor.descriptionusw. entfernt.Das Attribut und der Parameter
.bindvonMetaData,Tableund von allen DDL/DML/DQL-Elementen, die zuvor auf eine „gebundene Engine“ verweisen konnten.Die eigenständige Funktion
sqlalchemy.orm.mapper()wurde entfernt; alle klassische Abbildung sollte über die Methoderegistry.map_imperatively()derregistryerfolgen.Die Methode
Query.join()akzeptiert keine Strings mehr für Beziehungsnamen mehr; der seit langem dokumentierte Ansatz zur Verwendung vonClass.attrnamefür Join-Ziele ist nun Standard.Query.join()akzeptiert die Argumente „aliased“ und „from_joinpoint“ nicht mehr.Query.join()akzeptiert keine Ketten mehrerer Join-Ziele mehr in einem Methodenaufruf.Query.from_self(),Query.select_entity_from()undQuery.with_polymorphic()wurden entfernt.Der Parameter
relationship.cascade_backrefsmuss nun auf seinem neuen StandardwertFalsebleiben; diesave-updateKaskade wird nicht mehr entlang einer Rückreferenz weitergegeben.Der Parameter
Session.futuremuss immer aufTruegesetzt sein. 2.0-Stil Transaktionsmuster fürSessionsind nun immer aktiv.Loader-Optionen akzeptieren keine Strings mehr für Attributnamen. Der seit langem dokumentierte Ansatz zur Verwendung von
Class.attrnamefür Loader-Optionsziele ist nun Standard.Legacy-Formen von
select()entfernt, einschließlichselect([cols]), der „whereclause“- und Keyword-Parameter vonsome_table.select().Legacy „in-place mutator“-Methoden auf
Selectwieappend_whereclause(),append_order_by()etc. wurden entfernt.Das sehr alte Modul „dbapi_proxy“ wurde entfernt, das in sehr frühen SQLAlchemy-Versionen verwendet wurde, um einen transparenten Connection-Pool über eine rohe DBAPI-Verbindung bereitzustellen.
Referenzen: #7257
[general] [changed] ¶
Die Methode
Query.instances()ist veraltet. Der Verhaltensvertrag dieser Methode, nämlich dass sie Objekte über beliebige Result-Sets iterieren kann, ist längst obsolet und wird nicht mehr getestet. Beliebige Anweisungen können Objekte über Konstrukte wie :meth`.Select.from_statement` oderaliased()zurückgeben.
platform¶
[platform] [feature] ¶
Die SQLAlchemy C-Erweiterungen wurden durch komplett neue Implementierungen in Cython ersetzt. Ähnlich wie die C-Erweiterungen zuvor sind vorgefertigte Wheel-Dateien für eine breite Palette von Plattformen auf PyPI verfügbar, sodass die Kompilierung für gängige Plattformen kein Problem darstellt. Für benutzerdefinierte Builds funktioniert
python setup.py build_extwie zuvor und benötigt nur die zusätzliche Cython-Installation.pyproject.tomlist nun ebenfalls Teil des Quellcodes, was die richtigen Build-Abhängigkeiten bei der Verwendung von pip etabliert.Siehe auch
Referenzen: #7256
[platform] [change] ¶
Der Quellcode-Build und die Installation von SQLAlchemy enthalten nun eine
pyproject.toml-Datei für die vollständige Unterstützung von PEP 517.Siehe auch
Referenzen: #7311
orm¶
[orm] [feature] [sql] ¶
Neues Feature für alle enthaltenen Dialekte hinzugefügt, die RETURNING unterstützen, namens „insertmanyvalues“. Dies ist eine Verallgemeinerung des Features „fast executemany“, das erstmals für den psycopg2-Treiber in Version 1.4 unter ORM Batch-Inserts mit psycopg2 schlagen jetzt Statements mit RETURNING in den meisten Fällen zusammen eingeführt wurde. Dieses Feature ermöglicht es dem ORM, INSERT-Statements zu einem deutlich effizienteren SQL-Konstrukt zusammenzufassen, während gleichzeitig neue generierte Primärschlüssel und SQL-Standardwerte mittels RETURNING abgerufen werden können.
Das Feature gilt nun für die vielen Dialekte, die RETURNING zusammen mit mehreren VALUES-Konstrukten für INSERT unterstützen, einschließlich aller PostgreSQL-Treiber, SQLite, MariaDB und MS SQL Server. Separat erhält der Oracle-Dialekt dieselbe Funktionalität durch native cx_Oracle- oder OracleDB-Features.
Referenzen: #6047
[orm] [feature] ¶
Neuer Parameter
AttributeEvents.include_keyhinzugefügt, der den Schlüssel des Dictionaries oder der Liste für Operationen wie__setitem__()(z.B.obj[key] = value) und__delitem__()(z.B.del obj[key]) einschließt. Dies geschieht über einen neuen Schlüsselwortparameter „key“ oder „keys“, abhängig vom Event, z.B.AttributeEvents.append.key,AttributeEvents.bulk_replace.keys. Dies ermöglicht Event-Handlern, den Schlüssel zu berücksichtigen, der an die Operation übergeben wurde, und ist von besonderer Bedeutung für Dictionary-Operationen, die mitMappedCollectionarbeiten.Referenzen: #8375
[orm] [feature] ¶
Neuer Parameter
Operators.op.python_implhinzugefügt, verfügbar überOperators.op()und auch bei direkter Verwendung descustom_op-Konstruktors. Dieser ermöglicht die Bereitstellung einer In-Python-Evaluierungsfunktion zusammen mit dem benutzerdefinierten SQL-Operator. Diese Evaluierungsfunktion wird zur Implementierung, die verwendet wird, wenn das Operatorobjekt mit rein Python-Objekten auf beiden Seiten als Operanden verwendet wird. Insbesondere ist dies kompatibel mit der Optionsynchronize_session='evaluate', die mit ORM-fähige INSERT-, UPDATE- und DELETE-Statements verwendet wird.Referenzen: #3162
[orm] [feature] ¶
Die
Session(und somit auchAsyncSession) verfügt nun über neue Funktionalitäten zur Zustandsverfolgung, die proaktiv unerwartete Zustandsänderungen abfangen, die während der Ausführung einer bestimmten transaktionalen Methode auftreten. Dies soll Situationen ermöglichen, in denen dieSessionauf nicht threadsichere Weise verwendet wird, wo Event-Hooks oder ähnliches unerwartete Methoden innerhalb von Operationen aufrufen können, sowie unter anderen Nebenläufigkeitssituationen wie asyncio oder gevent, um eine informative Meldung auszugeben, sobald der illegale Zugriff auftritt, anstatt stillschweigend fortzufahren, was zu sekundären Fehlern aufgrund des ungültigen Zustands derSessionführt.Siehe auch
Session gibt proaktiv aus, wenn illegale gleichzeitige oder reentrant Zugriffserkennung erfolgt
Referenzen: #7433
[orm] [feature] ¶
Der Mapping-Konstrukt
composite()unterstützt nun die automatische Auflösung von Werten, wenn er mit einem Python-dataclassverwendet wird; die Methode__composite_values__()muss nicht mehr implementiert werden, da diese Methode aus der Inspektion des Dataclasses abgeleitet wird.Zusätzlich unterstützen Klassen, die von
compositegemappt werden, nun Vergleichsoperationen für die Sortierung, z.B.<,>=usw.Siehe die neue Dokumentation unter Composite Column Types für Beispiele.
[orm] [feature] ¶
Sehr experimentelles Feature zu den Ladeoptionen
selectinload()undimmediateload()hinzugefügt, genanntselectinload.recursion_depth/immediateload.recursion_depth. Dies ermöglicht es einer einzelnen Ladeoption, sich automatisch in selbstreferenzielle Beziehungen zu rekursiv einzubinden. Wird auf eine Ganzzahl gesetzt, die die Tiefe angibt, und kann auch auf -1 gesetzt werden, um das Laden fortzusetzen, bis keine tieferen Ebenen mehr gefunden werden. Umfangreiche interne Änderungen anselectinload()undimmediateload()ermöglichen es diesem Feature, zu funktionieren und weiterhin den Kompilierungs-Cache korrekt zu nutzen, ohne willkürliche Rekursion zu verwenden. Daher wird jede Tiefe unterstützt (obwohl dies so viele Abfragen erzeugen würde). Dies kann für selbstreferenzielle Strukturen nützlich sein, die vollständig eager geladen werden müssen, wie z.B. bei der Verwendung von asyncio.Eine Warnung wird auch ausgegeben, wenn Ladeoptionen mit beliebigen Längen miteinander verbunden werden (d.h. ohne die neue Option
recursion_depthzu verwenden), wenn eine übermäßige Rekursionstiefe bei der Ladung verwandter Objekte erkannt wird. Diese Operation verbraucht weiterhin riesige Mengen an Speicher und hat extrem schlechte Leistung; der Cache wird deaktiviert, wenn diese Bedingung erkannt wird, um den Cache vor einer Überflutung mit beliebigen Statements zu schützen.Referenzen: #8126
[orm] [feature] ¶
Neuer Parameter
Session.autobeginhinzugefügt. Wenn dieser aufFalsegesetzt ist, verhindert er, dass dieSessionimplizit eine Transaktion beginnt. Die MethodeSession.begin()muss zuerst explizit aufgerufen werden, um mit Operationen fortzufahren, andernfalls wird ein Fehler ausgelöst, sobald eine Operation sonst automatisch begonnen hätte. Diese Option kann verwendet werden, um eine „sichere“Sessionzu erstellen, die keine neuen Transaktionen implizit startet.Als Teil dieser Änderung wurde auch eine neue Statusvariable
originhinzugefügt, die für Event-Handling-Code nützlich sein kann, um den Ursprung einer bestimmtenSessionTransactionzu erkennen.Referenzen: #6928
[orm] [feature] ¶
Deklarative Mixins, die
Column-Objekte verwenden, dieForeignKey-Referenzen enthalten, müssen nicht mehrdeclared_attr()verwenden, um dieses Mapping zu erreichen. DasForeignKey-Objekt wird zusammen mit derColumnselbst kopiert, wenn die Spalte auf das deklarierte Mapping angewendet wird.[orm] [usecase] ¶
Parameter
load_only.raiseloadzur Ladeoptionload_only()hinzugefügt, sodass die nicht geladenen Attribute „raise“-Verhalten anstelle von Lazy Loading aufweisen können. Zuvor gab es keine Möglichkeit, dies mit der Optionload_only()direkt zu tun.[orm] [change] ¶
Um die explizite Typisierung besser zu unterstützen, wurden die Namen einiger ORM-Konstrukte, die typischerweise intern konstruiert werden, aber dennoch in Meldungen sowie in der Typisierung sichtbar sind, in prägnantere Namen geändert, die auch dem Namen ihrer Konstruktionsfunktion (mit anderer Groß-/Kleinschreibung) entsprechen. In allen Fällen werden für absehbare Zeit Aliase zu den alten Namen beibehalten.
RelationshipPropertywird zu einem Alias für den primären NamenRelationship, der wie immer aus der Funktionrelationship()konstruiert wird.SynonymPropertywird zu einem Alias für den primären NamenSynonym, der wie immer aus der Funktionsynonym()konstruiert wird.CompositePropertywird zu einem Alias für den primären NamenComposite, der wie immer aus der Funktioncomposite()konstruiert wird.
[orm] [change] ¶
Zur besseren Konsistenz mit dem prominenten ORM-Konzept
Mappedwerden die Namen der Dictionary-orientierten Kollektionenattribute_mapped_collection(),column_mapped_collection()undMappedCollectioninattribute_keyed_dict(),column_keyed_dict()undKeyFuncDictgeändert, wobei die Phrase „dict“ verwendet wird, um Verwirrung mit dem Begriff „mapped“ zu minimieren. Die alten Namen bleiben auf unbestimmte Zeit bestehen, ohne dass ein Entfernungsplan existiert.Referenzen: #8608
[orm] [bug] ¶
Alle
Result-Objekte lösen nun konsistentResourceClosedErroraus, wenn sie nach einem Hard Close verwendet werden. Dies schließt den „Hard Close“ ein, der nach dem Aufruf von „single row or value“-Methoden wieResult.first()undResult.scalar()auftritt. Dies war bereits das Verhalten der gängigsten Ergebnisobjektklassen für Core-Statement-Ausführungen, d.h. derjenigen, die aufCursorResultbasieren, sodass dieses Verhalten nicht neu ist. Die Änderung wurde jedoch erweitert, um ORM-„filtering“-Ergebnisobjekte, die bei Verwendung von ORM-Queries im 2.0-Stil zurückgegeben werden, ordnungsgemäß zu unterstützen. Diese verhielten sich zuvor im „soft closed“-Stil mit Rückgabe leerer Ergebnisse, oder sie „soft closed“en gar nicht und lieferten weiterhin aus dem zugrunde liegenden Cursor.Als Teil dieser Änderung wurde auch
Result.close()zur BasisklasseResulthinzugefügt und für die gefilterten Ergebnisimplementierungen implementiert, die vom ORM verwendet werden. Dadurch ist es möglich, die MethodeCursorResult.close()auf dem zugrunde liegendenCursorResultaufzurufen, wenn die Ausführungsoptionyield_perverwendet wird, um einen serverseitigen Cursor zu schließen, bevor verbleibende ORM-Ergebnisse abgerufen wurden. Dies war bereits für Core-Ergebnissets verfügbar, aber die Änderung macht es auch für ORM-Ergebnisse im 2.0-Stil verfügbar.Diese Änderung wird auch **zurückportiert** nach: 1.4.27
Referenzen: #7274
[orm] [bug] ¶
Problem behoben, bei dem die Methode
registry.map_declaratively()ein internes „mapper config“-Objekt zurückgab und nicht dasMapper-Objekt, wie in der API-Dokumentation angegeben.[orm] [bug] ¶
Performance-Regression behoben, die mindestens in Version 1.3, wenn nicht früher (irgendwann nach 1.0), auftrat. Dabei wurde beim Laden von verzögerten Spalten, die explizit mit
defer()gemappt wurden (im Gegensatz zu nicht verzögerten Spalten, die abgelaufen waren), nicht die „optimierte“ Abfrage verwendet, die nur die unmittelbare Tabelle abfragt, die die ungeladenen Spalten enthält. Stattdessen wurde eine vollständige ORM-Abfrage ausgeführt, die einen JOIN für alle Basistabellen ausgab, was nicht notwendig ist, wenn nur Spalten aus der Unterklasse geladen werden.Referenzen: #7463
[orm] [bug] ¶
Die Interna des
Load-Objekts und verwandter Lade-Strategie-Muster wurden größtenteils neu geschrieben, um die Tatsache auszunutzen, dass nur Attribut-gebundene Pfade, keine Strings, mehr unterstützt werden. Die Neufassung soll es in Zukunft einfacher machen, neue Anwendungsfälle und subtile Probleme innerhalb des Lade-Strategie-Systems zu adressieren.Referenzen: #6986
[orm] [bug] ¶
Verbesserung an den Strategie-Optionen „deferred“ / „load_only“ vorgenommen. Wenn ein bestimmtes Objekt über zwei verschiedene logische Pfade innerhalb einer Abfrage geladen wird, werden Attribute, die von mindestens einer der Optionen als zu befüllend konfiguriert wurden, in allen Fällen befüllt, auch wenn andere Lade-Pfade für dasselbe Objekt diese Option nicht gesetzt haben. Zuvor basierte dies auf Zufälligkeit, welcher „Pfad“ das Objekt zuerst ansprach.
Referenzen: #8166
[orm] [bug] ¶
Problem bei ORM-fähigem UPDATE behoben, wenn das Statement gegen eine Joined-Inheritance-Unterklasse erstellt wird und nur lokale Tabellenspalten aktualisiert, wobei die „fetch“-Synchronisierungsstrategie die korrekte RETURNING-Klausel für Datenbanken, die RETURNING für die Fetch-Synchronisierung verwenden, nicht korrekt rendert. Passt auch die verwendete Strategie für RETURNING in UPDATE FROM und DELETE FROM Statements an.
Referenzen: #8344
[orm] [bug] [asyncio] ¶
Die ungenutzten Argumente
**kwausbeginundbegin_nestedwurden entfernt. Diese kw werden nicht verwendet und scheinen fälschlicherweise zur API hinzugefügt worden zu sein.Referenzen: #7703
[orm] [bug] ¶
Die Attributzugriffsmethode, die von
attribute_mapped_collection()undcolumn_mapped_collection()(jetztattribute_keyed_dict()undcolumn_keyed_dict()genannt) beim Befüllen des Dictionaries verwendet wird, wurde geändert, um zu überprüfen, ob der Datenwert auf dem Objekt, der als Dictionary-Schlüssel verwendet werden soll, tatsächlich vorhanden ist und nicht stattdessen „None“ verwendet wird, weil das Attribut noch nie tatsächlich zugewiesen wurde. Dies dient dazu, eine fehlerhafte Befüllung von None für einen Schlüssel zu verhindern, wenn über eine Rückreferenz zugewiesen wird, bei der das „key“-Attribut des Objekts noch nicht zugewiesen ist.Da der Fehlermodus hier eine transiente Bedingung ist, die typischerweise nicht in der Datenbank gespeichert wird und leicht über den Konstruktor der Klasse basierend auf der Reihenfolge der Parameterzuweisung erzeugt werden kann, ist es sehr wahrscheinlich, dass viele Anwendungen dieses Verhalten bereits beinhalten, das stillschweigend übersehen wird. Um Anwendungen zu unterstützen, bei denen dieser Fehler nun ausgelöst wird, wird auch ein neuer Parameter
attribute_keyed_dict.ignore_unpopulated_attributesowohl zuattribute_keyed_dict()als auch zucolumn_keyed_dict()hinzugefügt, der stattdessen die fehlerhafte Rückreferenzzuweisung überspringt.Referenzen: #8372
[orm] [bug] ¶
Neuer Parameter
AbstractConcreteBase.strict_attrszur deklarativen Mixin-KlasseAbstractConcreteBasehinzugefügt. Die Auswirkung dieses Parameters ist, dass der Geltungsbereich von Attributen in Unterklassen korrekt auf die Unterklasse beschränkt wird, in der jedes Attribut deklariert ist, im Gegensatz zum vorherigen Verhalten, bei dem alle Attribute der gesamten Hierarchie auf die Basis-"abstrakte" Klasse angewendet wurden. Dies führt zu einem saubereren, korrekteren Mapping, bei dem Unterklassen keine nicht nützlichen Attribute mehr aufweisen, die nur für Geschwisterklassen relevant sind. Der Standardwert für diesen Parameter ist False, wodurch das vorherige Verhalten unverändert bleibt; dies dient zur Unterstützung vorhandener Codes, die diese Attribute explizit in Abfragen verwenden. Um zum neueren Ansatz zu migrieren, wenden Sie explizite Attribute nach Bedarf auf die abstrakte Basisklasse an.Referenzen: #8403
[orm] [bug] ¶
Das Verhalten von
defer()in Bezug auf Primärschlüssel- und „polymorphe Diskriminator“-Spalten wurde überarbeitet, sodass diese Spalten weder explizit noch bei Verwendung eines Wildcards wiedefer('*')verzögert werden können. Zuvor wurde bei einer Wildcard-Verzögerung die PK/polymorphen Spalten nicht geladen, was in allen Fällen zu Fehlern führte, da das ORM auf diese Spalten angewiesen ist, um Objektidentitäten zu erzeugen. Das Verhalten der expliziten Verzögerung von Primärschlüsselspalten bleibt unverändert, da diese Verzögerungen bereits implizit ignoriert wurden.Referenzen: #7495
[orm] [bug] ¶
Bug im Verhalten des Parameters
Mapper.eager_defaultsbehoben, sodass clientseitige SQL-Standardwerte oder onupdate-Ausdrücke allein in der Tabellendefinition eine Abfrage mit RETURNING oder SELECT auslösen, wenn das ORM einen INSERT oder UPDATE für die Zeile emittiert. Zuvor lösten nur serverseitige Standardwerte, die als Teil der Tabellen-DDL und/oder serverseitige onupdate-Ausdrücke festgelegt wurden, diesen Fetch aus, obwohl clientseitige SQL-Ausdrücke enthalten waren, wenn der Fetch gerendert wurde.Referenzen: #7438
engine¶
[engine] [feature] ¶
Das Event
DialectEvents.handle_error()wurde aus derEngineEventsSuite in dieDialectEventsSuite verschoben und nimmt nun am „Pre-Ping“-Event des Connection-Pools teil, für jene Dialekte, die Disconnect-Codes verwenden, um festzustellen, ob die Datenbank erreichbar ist. Dies ermöglicht es Endbenutzercode, den Status von „Pre-Ping“ zu ändern. Beachten Sie, dass dies keine Dialekte umfasst, die eine native „Ping“-Methode enthalten, wie beispielsweise bei psycopg2 oder den meisten MySQL-Dialekten.Referenzen: #5648
[engine] [feature] ¶
Die Event-Hooks
ConnectionEvents.set_connection_execution_options()undConnectionEvents.set_engine_execution_options()erlauben nun die direkte Modifikation des gegebenen Options-Dictionary, wobei der neue Inhalt als endgültige Ausführungsoptionen übernommen wird. Zuvor waren direkte Modifikationen des Dictionarys nicht unterstützt.[engine] [usecase] ¶
Der Parameter
create_engine.isolation_levelwurde für den Basisdialekt verallgemeinert, sodass er nicht mehr von einzelnen Dialekten abhängt. Dieser Parameter stellt die „Isolationsebene“ für alle neuen Datenbankverbindungen ein, sobald diese vom Connection-Pool erstellt werden, wobei der Wert dann gesetzt bleibt, ohne bei jedem Check-in zurückgesetzt zu werden.Der Parameter
create_engine.isolation_levelist funktional äquivalent zur Verwendung des ParametersEngine.execution_options.isolation_levelüberEngine.execution_options()für eine Motorweite Einstellung. Der Unterschied besteht darin, dass die erstere Einstellung die Isolationsebene nur einmal beim Erstellen einer Verbindung zuweist, während letztere das gegebene Level bei jedem Auschecken einer Verbindung setzt und zurücksetzt.Referenzen: #6342
[engine] [change] ¶
Einige kleine API-Änderungen bezüglich Engines und Dialekten
Die Methoden
Dialect.set_isolation_level(),Dialect.get_isolation_level(), :meth: Dialektmethoden werden immer mit der rohen DBAPI-Verbindung aufgerufenDie Klassen
ConnectionundEngineteilen sich nicht mehr eine gemeinsame BasisklasseConnectable, welche entfernt wurde.Eine neue Schnittstellenklasse
PoolProxiedConnectionwurde hinzugefügt – dies ist die öffentliche Schnittstelle für die bekannte, aber private Klasse_ConnectionFairy.
Referenzen: #7122
[engine] [bug] [regression] ¶
Behobene Regression, bei der die Methode
CursorResult.fetchmany()einen serverseitigen Cursor (d. h. wennstream_resultsoderyield_perverwendet wird, entweder Core- oder ORM-Ergebnisse) nicht automatisch schloss, wenn die Ergebnisse vollständig erschöpft waren.Diese Änderung wird auch **zurückportiert** nach: 1.4.27
Referenzen: #7274
[engine] [bug] ¶
Behobenes Problem in der zukünftigen
Engine-Version, bei der das Aufrufen vonEngine.begin()und das Betreten des Context-Managers die Verbindung nicht schloss, wenn die eigentliche BEGIN-Operation aus irgendeinem Grund fehlschlug, z. B. wenn ein Event-Handler eine Ausnahme auslöste; dieser Anwendungsfall wurde für die zukünftige Version der Engine nicht getestet. Beachten Sie, dass die „zukünftigen“ Context-Manager, diebegin()-Blöcke in Core und ORM behandeln, die „BEGIN“-Operation erst ausführen, wenn die Context-Manager tatsächlich betreten werden. Dies unterscheidet sich von der Legacy-Version, die die „BEGIN“-Operation im Voraus ausführt.Diese Änderung wird auch **zurückportiert** nach: 1.4.27
Referenzen: #7272
[engine] [bug] ¶
Die
QueuePoolignoriert nunmax_overflow, wennpool_size=0ist, wodurch der Pool in allen Fällen ordnungsgemäß unbegrenzt wird.Referenzen: #8523
[engine] [bug] ¶
Zur Verbesserung der Sicherheit verwendet das
URL-Objekt jetzt standardmäßig Passwort-Obfuskation, wennstr(url)aufgerufen wird. Um eine URL mit Klartext-Passwort zu stringifizieren, kann die MethodeURL.render_as_string()verwendet werden, wobei der ParameterURL.render_as_string.hide_passwordaufFalsegesetzt wird. Vielen Dank an unsere Mitwirkenden für diesen Pull-Request.Referenzen: #8567
[engine] [bug] ¶
Die Methode
Inspector.has_table()prüft nun konsistent auf Views mit dem angegebenen Namen sowie auf Tabellen. Zuvor war dieses Verhalten dialektabhängig, wobei PostgreSQL, MySQL/MariaDB und SQLite es unterstützten, Oracle und SQL Server jedoch nicht. Drittanbieter-Dialekte sollten ebenfalls sicherstellen, dass ihreInspector.has_table()-Methode nach Views sowie nach Tabellen mit dem angegebenen Namen sucht.Referenzen: #7161
[engine] [bug] ¶
Behobenes Problem in der Methode
Result.columns(), bei der das Aufrufen vonResult.columns()mit einem einzelnen Index in einigen Fällen, insbesondere bei ORM-Ergebnisobjekten, dazu führen konnte, dass dasResultskalare Objekte anstelle vonRow-Objekten liefert, so als wäre die MethodeResult.scalars()aufgerufen worden. In SQLAlchemy 1.4 gibt dieses Szenario eine Warnung aus, dass sich das Verhalten in SQLAlchemy 2.0 ändern wird.Referenzen: #7953
[engine] [bug] ¶
Das Übergeben eines
DefaultGenerator-Objekts wie z. B. einerSequencean die MethodeConnection.execute()ist veraltet, da diese Methode so typisiert ist, dass sie einCursorResult-Objekt und keinen einfachen Skalarwert zurückgibt. Die MethodeConnection.scalar()sollte stattdessen verwendet werden. Diese wurde mit neuen internen Codepfaden überarbeitet, um das Aufrufen eines SELECT für Standardgenerierungsobjekte zu unterstützen, ohne über die MethodeConnection.execute()zu gehen.[engine] [removed] ¶
Der zuvor veraltete Parameter
case_sensitivevoncreate_engine()wurde entfernt. Dieser hätte nur die Suche nach Spaltennamen als Strings in Core-only Ergebniszeilen beeinflusst; er hatte keine Auswirkungen auf das Verhalten des ORM. Das tatsächliche Verhalten dessen, wascase_sensitivebetrifft, bleibt bei seinem StandardwertTrue, was bedeutet, dass String-Namen, die inrow._mappingnachgeschlagen werden, wie jede andere Python-Zuordnung auch fall-sensitiv übereinstimmen.Beachten Sie, dass der Parameter
case_sensitivein keiner Weise mit dem allgemeinen Thema der Groß-/Kleinschreibung, der Anführungszeichen und der „Namensnormalisierung“ (d. h. Umwandlung für Datenbanken, die alle Großbuchstaben als nicht fall-sensitiv betrachten) für DDL-Identifikationsnamen zusammenhängt, was weiterhin ein normales Kernmerkmal von SQLAlchemy ist.[engine] [removed] ¶
Das Legacy- und veraltete Paket
sqlalchemy.databaseswurde entfernt. Bitte verwenden Sie stattdessensqlalchemy.dialects.Referenzen: #7258
[engine] [deprecations] ¶
Der Parameter
create_engine.implicit_returningist nur für die Funktioncreate_engine()veraltet; der Parameter bleibt auf dem ObjektTableverfügbar. Dieser Parameter wurde ursprünglich entwickelt, um die „implizite zurückgebende“ Funktion von SQLAlchemy zu aktivieren, als sie entwickelt wurde, und war standardmäßig nicht aktiviert. Im modernen Gebrauch gibt es keinen Grund, diesen Parameter zu deaktivieren, und er hat sich als verwirrend erwiesen, da er die Leistung beeinträchtigt und es für das ORM schwieriger macht, kürzlich eingefügte Server-Standardwerte abzurufen. Der Parameter bleibt aufTableverfügbar, um speziell Datenbank-Randfälle zu berücksichtigen, bei denen RETURNING nicht praktikabel ist; das einzige derzeitige Beispiel ist die Einschränkung von SQL Server, dass INSERT RETURNING nicht auf einer Tabelle verwendet werden darf, auf der INSERT-Trigger vorhanden sind.Referenzen: #6962
sql¶
[sql] [feature] ¶
Die lang ersehnten fall-unabhängigen String-Operatoren
ColumnOperators.icontains(),ColumnOperators.istartswith(),ColumnOperators.iendswith()wurden hinzugefügt, die fall-unabhängige LIKE-Kompositionen (bei PostgreSQL ILIKE und auf allen anderen Backends die LOWER()-Funktion) erzeugen, um die bestehenden LIKE-KompositionsoperatorenColumnOperators.contains(),ColumnOperators.startswith()usw. zu ergänzen. Vielen Dank an Matias Martinez Rebori für seine sorgfältige und vollständige Arbeit bei der Implementierung dieser neuen Methoden.Referenzen: #3482
[sql] [feature] ¶
Eine neue Syntax wurde zur
FromClause.c-Sammlung auf allenFromClause-Objekten hinzugefügt, die es erlaubt, Tupel von Schlüsseln an__getitem__()zu übergeben, zusammen mit der Unterstützung für dasselect()-Konstrukt zur direkten Verarbeitung der resultierenden Tupel-ähnlichen Sammlung, was die Syntaxselect(table.c['a', 'b', 'c'])ermöglicht. Die Unter-Sammlung, die zurückgegeben wird, ist selbst eineColumnCollection, die nun ebenfalls direkt vonselect()und ähnlichen Konstrukten konsumiert werden kann.Siehe auch
Referenzen: #8285
[sql] [feature] ¶
Der Backend-unabhängige Datentyp
Uuidwurde von den PostgreSQL-Dialekten generalisiert und ist nun ein Kern-Datentyp. Ebenso wurdeUUIDaus dem PostgreSQL-Dialekt migriert. Der SQL Server DatentypUNIQUEIDENTIFIERwird ebenfalls zu einem UUID-behandelnden Datentyp. Vielen Dank an Trevor Gross für die Hilfe dabei.Referenzen: #7212
[sql] [feature] ¶
Die Datentypen
Double,DOUBLE,DOUBLE_PRECISIONwurden dem Namespace des Basismodulssqlalchemy.hinzugefügt, zur expliziten Verwendung von Double/Double Precision sowie generischen „Double“-Datentypen. Verwenden SieDoublefür generische Unterstützung, die bei Bedarf für verschiedene Backends in DOUBLE/DOUBLE PRECISION/FLOAT aufgelöst wird.Referenzen: #5465
[sql] [usecase] ¶
Die Kompilierungsmechanik des
Insert-Konstrukts wurde so geändert, dass die „autoincrement primary key“-Spaltenwert übercursor.lastrowidoder RETURNING abgerufen wird, auch wenn er im Parametersatz oder innerhalb der MethodeInsert.values()als einfacher gebundener Wert vorhanden ist, für einzelne Zeilen-INSERT-Anweisungen auf bestimmten Backends, die bekannt dafür sind, Autoincrement-Werte zu generieren, auch wenn explizites NULL übergeben wird. Dies stellt ein Verhalten wieder her, das in der 1.3-Serie sowohl für den Anwendungsfall eines separaten Parametersatzes als auch fürInsert.values()galt. In 1.4 änderte sich das Verhalten des Parametersatzes unbeabsichtigt dahingehend, dass dies nicht mehr geschah, aber die MethodeInsert.values()rief Autoincrement-Werte bis 1.4.21 ab, als #6770 das Verhalten erneut unbeabsichtigt änderte, da dieser Anwendungsfall nie abgedeckt war.Das Verhalten ist nun als „funktionierend“ definiert, um den Fall zu berücksichtigen, dass Datenbanken wie SQLite, MySQL und MariaDB einen expliziten NULL-Primärschlüsselwert ignorieren und dennoch einen Autoincrement-Generator aufrufen.
Referenzen: #7998
[sql] [usecase] ¶
Eine modifizierte ISO-8601-Darstellung (d. h. ISO-8601 mit T, das durch ein Leerzeichen ersetzt wird) wurde für die Verwendung von
literal_bindsmit den SQL-Kompilern der PostgreSQL-, MySQL-, MariaDB-, MSSQL- und Oracle-Dialekte hinzugefügt. Für Oracle wird das ISO-Format in einen entsprechenden TO_DATE()-Funktionsaufruf verpackt. Zuvor war diese Darstellung für die dialektspezifische Kompilierung nicht implementiert.Siehe auch
DATE, TIME, DATETIME Datentypen unterstützen jetzt die literale Darstellung auf allen Backends
Referenzen: #5052
[sql] [usecase] ¶
Ein neuer Parameter
HasCTE.add_cte.nest_herewurde zuHasCTE.add_cte()hinzugefügt, der eine gegebeneCTEauf der Ebene der übergeordneten Anweisung „verschachtelt“. Dieser Parameter ist äquivalent zur Verwendung des ParametersHasCTE.cte.nesting, kann aber in manchen Szenarien intuitiver sein, da er die Verschachtelungsattribut gleichzeitig mit dem expliziten Level der CTE festlegen lässt.Die Methode
HasCTE.add_cte()akzeptiert auch mehrere CTE-Objekte.Referenzen: #7759
[sql] [bug] ¶
Die FROM-Klauseln, die auf einem
select()-Konstrukt mit der MethodeSelect.select_from()erstellt werden, werden nun zuerst in der FROM-Klausel des gerenderten SELECT gerendert. Dies dient dazu, die Reihenfolge der Klauseln beizubehalten, wie sie an die MethodeSelect.select_from()übergeben wurden, ohne von der Tatsache beeinflusst zu werden, dass diese Klauseln auch in anderen Teilen der Abfrage erwähnt werden. Wenn andere Elemente desSelectFROM-Klauseln generieren, wie z. B. die Spaltenklausel oder die WHERE-Klausel, werden diese nach den vonSelect.select_from()gelieferten Klauseln gerendert, sofern sie nicht explizit ebenfalls anSelect.select_from()übergeben wurden. Diese Verbesserung ist nützlich in den Fällen, in denen eine bestimmte Datenbank einen wünschenswerten Abfrageplan basierend auf einer bestimmten Reihenfolge von FROM-Klauseln generiert und ermöglicht eine vollständige Kontrolle über die Reihenfolge der FROM-Klauseln.Referenzen: #7888
[sql] [bug] ¶
Der Parameter
Enum.length, der die Länge derVARCHAR-Spalte für nicht-native Enumerationstypen festlegt, wird nun bedingungslos beim Emittieren von DDL für den DatentypVARCHARverwendet, auch wenn der ParameterEnum.native_enumfür Ziel-Backends aufTruegesetzt ist, die weiterhinVARCHARverwenden. Zuvor wurde der Parameter in diesem Fall fälschlicherweise ignoriert. Die für diesen Fall zuvor ausgegebene Warnung wurde nun entfernt.Referenzen: #7791
[sql] [bug] ¶
Die In-Place-Typenerkennung für Python-Integer, wie sie bei einem Ausdruck wie
literal(25)auftritt, wird nun auch eine wertebasierte Anpassung vornehmen, um große Python-Integer zu berücksichtigen, wobei der ermittelte DatentypBigIntegeranstelle vonIntegerist. Dies berücksichtigt Dialekte wie den von asyncpg, der sowohl implizite Typinformationen an den Treiber sendet als auch empfindlich auf die numerische Skala reagiert.Referenzen: #7909
[sql] [bug] ¶
Die Parameter
if_existsundif_not_existswurden für alle „Create“-/„Drop“-Konstrukte hinzugefügt, einschließlichCreateSequence,DropSequence,CreateIndex,DropIndex, etc., was die generische Renderung von „IF EXISTS“/„IF NOT EXISTS“-Phrasen innerhalb von DDL ermöglicht. Pull-Request freundlicherweise von Jesse Bakker.Referenzen: #7354
[sql] [bug] ¶
Die Konstruktion von SQL binären Ausdrücken wurde verbessert, um sehr lange Ausdrücke mit demselben assoziativen Operator zu ermöglichen, ohne dass spezielle Schritte erforderlich sind, um einen hohen Speicherverbrauch und übermäßige Rekursionstiefe zu vermeiden. Eine bestimmte binäre Operation
A op Bkann nun gegen ein weiteres Elementop Cverbunden werden, und die resultierende Struktur wird „geglättet“, sodass die Darstellung sowie die SQL-Kompilierung keine Rekursion erfordern.Eine Auswirkung dieser Änderung ist, dass String-Verkettungsausdrücke, die SQL-Funktionen verwenden, „flach“ herauskommen, z. B. MySQL rendert nun
concat('x', 'y', 'z', ...)`anstelle von zweiwertigen Funktionen wieconcat(concat('x', 'y'), 'z'). Drittanbieter-Dialekte, die den String-Verkettungsoperator überschreiben, müssen eine neue Methodedef visit_concat_op_expression_clauselist()implementieren, die die vorhandene Methodedef visit_concat_op_binary()begleitet.Referenzen: #7744
[sql] [bug] ¶
Vollständige Unterstützung für „truediv“ und „floordiv“ unter Verwendung der Operatoren „/“ und „//“ implementiert. Eine „truediv“-Operation zwischen zwei Ausdrücken mit
Integerbetrachtet das Ergebnis nun alsNumeric, und die Kompilierung auf Dialektebene wandelt den rechten Operanden basierend auf dem Dialekt in einen numerischen Typ um, um sicherzustellen, dass „truediv“ erreicht wird. Für „floordiv“ wird auch eine Konvertierung für Datenbanken hinzugefügt, die „floordiv“ nicht standardmäßig unterstützen (MySQL, Oracle), und die FunktionFLOOR()wird in diesem Fall gerendert, sowie für Fälle, in denen der rechte Operand keine Ganzzahl ist (erforderlich für PostgreSQL und andere).Die Änderung behebt Probleme sowohl mit inkonsistentem Verhalten des Divisionsoperators auf verschiedenen Backends als auch ein Problem, bei dem die Ganzzahldivision unter Oracle aufgrund ungeeigneter Outputtypehandler kein Ergebnis abrufen konnte.
Referenzen: #4926
[sql] [bug] ¶
Ein zusätzlicher Nachverfolgungsschritt wurde zum Compiler hinzugefügt, der alle FROM-Klauseln verfolgt, die Tabellen sind. Diese Tabellen können denselben Namen in mehreren Schemata teilen, wobei eines der Schemata das implizite „Standard“-Schema ist. In diesem Fall wird der Tabellenname, wenn auf diesen Namen ohne Schemaklassifizierung verwiesen wird, auf Compiler-Ebene mit einem anonymen Aliasnamen gerendert, um die beiden (oder mehr) Namen zu disambiguieren. Der Ansatz, den normalerweise nicht qualifizierten Namen mit dem vom Server erkannten Wert „Standard-Schemaname“ zu qualifizieren, wurde ebenfalls in Betracht gezogen, dieser Ansatz gilt jedoch nicht für Oracle und wird von SQL Server nicht akzeptiert, noch würde er mit mehreren Einträgen im PostgreSQL-Suchpfad funktionieren. Das hier behobene Namenskollisionsproblem wurde als Auswirkungen auf mindestens Oracle, PostgreSQL, SQL Server, MySQL und MariaDB identifiziert.
Referenzen: #7471
[sql] [bug] ¶
Python-Zeichenkettenwerte, für die ein SQL-Typ aus dem Typ des Wertes bestimmt wird, hauptsächlich bei Verwendung von
literal(), wenden nun den TypStringan, anstelle des DatentypsUnicode, für Python-Zeichenkettenwerte, die mit Pythonstr.isascii()als „nur ASCII“ getestet werden. Wenn die Zeichenkette nichtisascii()ist, wird stattdessen der DatentypUnicodegebunden, der zuvor bei der gesamten Zeichenkettenerkennung verwendet wurde. Dieses Verhalten gilt **nur für die In-situ-Erkennung von Datentypen bei Verwendung von ``literal()`` oder anderen Kontexten, die keinen vorhandenen Datentyp haben**, was normalerweise nicht der Fall ist bei normalenColumn-Vergleichsoperationen, bei denen der Typ der verglichenenColumnimmer Vorrang hat.Die Verwendung des Datentyps
Unicodekann die literale Zeichenkettenformatierung auf Backends wie SQL Server bestimmen, wo ein literaler Wert (d.h. unter Verwendung vonliteral_binds) alsN'<wert>'anstelle von'wert'gerendert wird. Bei der normalen Behandlung gebundener Werte kann der DatentypUnicodeauch Auswirkungen auf die Übergabe von Werten an den DBAPI haben, wiederum im Fall von SQL Server unterstützt der pyodbc-Treiber die Verwendung des setinputsizes-Modus, derStringim Vergleich zuUnicodeunterschiedlich behandelt.Referenzen: #7551
[sql] [bug] ¶
Die
array_aggsetzt nun die Array-Dimensionen auf 1. DieARRAY-Verarbeitung wurde verbessert, umNone-Werte als Werte eines Multi-Arrays zu akzeptieren.Referenzen: #7083
schema¶
[schema] [feature] ¶
Das System der „bedingten DDL“, das von der Klasse
ExecutableDDLElement(umbenannt vonDDLElement) implementiert wurde, wurde erweitert, um direkt aufSchemaItem-Konstrukte wieIndex,ForeignKeyConstraintusw. angewendet zu werden, sodass die bedingte Logik für die Generierung dieser Elemente in den Standardprozess der DDL-Ausgabe integriert ist. Dieses System kann auch von einer zukünftigen Version von Alembic übernommen werden, um bedingte DDL-Elemente in allen Schemamanagementsystemen zu unterstützen.Referenzen: #7631
[schema] [usecase] ¶
Der Parameter
DropConstraint.if_existswurde demDropConstraint-Konstrukt hinzugefügt, was zu einer „IF EXISTS“-DDL im DROP-Statement führt. Diese Phrase wird nicht von allen Datenbanken akzeptiert und die Operation schlägt auf einer Datenbank fehl, die sie nicht unterstützt, da keine ähnlich kompatible Fallback-Lösung im Geltungsbereich eines einzelnen DDL-Statements vorhanden ist. Pull Request von Mike Fiedler.Referenzen: #8141
[schema] [usecase] ¶
Die DDL-Event-Hooks
DDLEvents.before_create(),DDLEvents.after_create(),DDLEvents.before_drop(),DDLEvents.after_drop()wurden für alleSchemaItem-Objekte implementiert, die einen eindeutigen CREATE- oder DROP-Schritt beinhalten, wenn dieser Schritt als eigenständiger SQL-Befehl aufgerufen wird, einschließlich fürForeignKeyConstraint,Sequence,Indexund PostgreSQLsENUM.Referenzen: #8394
[schema] [performance] ¶
Die Schema-Reflexions-API wurde überarbeitet, um teilnehmenden Dialekten die Nutzung von hochperformanten Batch-Abfragen zu ermöglichen, um Schemata vieler Tabellen auf einmal mit um eine Größenordnung geringeren Abfragen zu reflektieren. Die neuen Leistungsmerkmale sind zunächst auf die PostgreSQL- und Oracle-Backends ausgerichtet und können auf jeden Dialekt angewendet werden, der SELECT-Abfragen gegen Systemkatalogtabellen zur Tabellenreflexion verwendet. Die Änderung umfasst auch neue API-Funktionen und Verhaltensverbesserungen für das
Inspector-Objekt, einschließlich konsistenten, gecachten Verhaltens von Methoden wieInspector.has_table(),Inspector.get_table_names()und neuen MethodenInspector.has_schema()undInspector.has_index().Siehe auch
Umfangreiche architektonische, Leistungs- und API-Verbesserungen für die Datenbankreflexion - vollständiger Hintergrund
Referenzen: #4379
[schema] [bug] ¶
Die Warnungen, die bei der Reflexion von Indizes oder eindeutigen Constraints ausgegeben werden, wenn der Parameter
Table.include_columnsverwendet wird, um Spalten auszuschließen, die dann Teil dieser Constraints sind, wurden entfernt. Wenn der ParameterTable.include_columnsverwendet wird, sollte erwartet werden, dass die resultierendeTable-Konstruktion keine Constraints enthält, die auf weggelassene Spalten angewiesen sind. Diese Änderung erfolgte als Reaktion auf #8100, dasTable.include_columnsin Verbindung mit Fremdschlüssel-Constraints, die auf weggelassene Spalten angewiesen sind, reparierte, wobei der Anwendungsfall klar wurde, dass das Weglassen solcher Constraints erwartet werden sollte.Referenzen: #8102
[schema] [postgresql] ¶
Unterstützung für Kommentare auf
Constraint-Objekten, einschließlich DDL und Reflexion, hinzugefügt; das Feld wird zur BasisklasseConstraintund den entsprechenden Konstruktoren hinzugefügt. Derzeit unterstützt jedoch nur PostgreSQL das Feature. Siehe Parameter wieForeignKeyConstraint.comment,UniqueConstraint.commentoderCheckConstraint.comment.Referenzen: #5677
[schema] [mariadb] [mysql] ¶
Unterstützung für Partitionierung und Sample-Seiten für MySQL und MariaDB reflektierte Optionen hinzugefügt. Die Optionen werden im Wörterbuch der Tabellen-Dialekt-Optionen gespeichert, sodass die folgenden Schlüssel mit
mysql_odermariadb_präfigiert werden müssen, abhängig vom Backend. Unterstützte Optionen sindstats_sample_pagespartition_bypartitionssubpartition_by
Diese Optionen werden auch beim Laden einer Tabelle aus der Datenbank reflektiert und füllen die
Table.dialect_optionsder Tabelle. Pull Request von Ramon Will.Referenzen: #4038
typing¶
[typing] [improvement] ¶
Die Methode
TypeEngine.with_variant()gibt nun eine Kopie des ursprünglichenTypeEngine-Objekts zurück, anstatt es in dieVariant-Klasse zu wrappen, die effektiv entfernt wurde (das Importsymbol bleibt aus Kompatibilitätsgründen mit Code, der möglicherweise nach diesem Symbol sucht). Während der vorherige Ansatz In-Python-Verhaltensweisen beibehielt, ermöglicht die Beibehaltung des ursprünglichen Typs eine klarere Typüberprüfung und Fehlersuche.TypeEngine.with_variant()akzeptiert auch mehrere Dialektnamen pro Aufruf, was insbesondere für verwandte Backend-Namen wie"mysql", "mariadb"nützlich ist.Referenzen: #6980
postgresql¶
[postgresql] [feature] ¶
Ein neuer PostgreSQL-Datentyp
DOMAINwurde hinzugefügt, der die gleichen CREATE TYPE / DROP TYPE-Verhaltensweisen wie PostgreSQLENUMaufweist. Vielen Dank an David Baumgold für die Bemühungen hierzu.Siehe auch
Referenzen: #7316
[postgresql] [usecase] [asyncpg] ¶
Übernehmbare Methoden
PGDialect_asyncpg.setup_asyncpg_json_codecundPGDialect_asyncpg.setup_asyncpg_jsonb_codecCodec wurden hinzugefügt, die die erforderliche Aufgabe der Registrierung von JSON/JSONB-Codecs für diese Datentypen bei Verwendung von asyncpg übernehmen. Die Änderung besteht darin, dass die Methoden als einzelne, übernehmbare Methoden aufgeteilt werden, um Drittanbieter-Dialekte zu unterstützen, die ändern oder deaktivieren müssen, wie diese speziellen Codecs eingerichtet werden.Diese Änderung wird auch **zurückportiert** nach: 1.4.27
Referenzen: #7284
[postgresql] [usecase] ¶
Literale Typen-Rendering für die Datentypen
ARRAYundARRAYhinzugefügt. Das generische Stringify rendert mit Klammern, z.B.[1, 2, 3]und das PostgreSQL-spezifische verwendet das ARRAY-Literal, z.B.ARRAY[1, 2, 3]. Mehrere Dimensionen und Anführungszeichen werden ebenfalls berücksichtigt.Referenzen: #8138
[postgresql] [usecase] ¶
Fügt Unterstützung für PostgreSQL-Multirange-Typen hinzu, die in PostgreSQL 14 eingeführt wurden. Die Unterstützung für PostgreSQL-Bereiche und Multibereiche wurde nun auf die Backends psycopg3, psycopg2 und asyncpg verallgemeinert, mit Raum für weitere Dialektunterstützung, unter Verwendung eines Backend-unabhängigen
Range-Datenobjekts, dessen Konstruktor mit dem zuvor verwendeten psycopg2-Objekt kompatibel ist. Siehe die neue Dokumentation für Verwendungsmuster.Darüber hinaus wurde die Handhabung von Bereichstypen verbessert, sodass automatisch Typumwandlungen gerendert werden, sodass In-situ-Rundreisen für Anweisungen, die der Datenbank keinen Kontext bieten, nicht den
cast()-Konstrukt erfordern, damit die Datenbank den gewünschten Typ kennt (diskutiert unter #8540).Vielen Dank an @zeeeeeb für den Pull-Request zur Implementierung und zum Testen der neuen Datentypen und der psycopg-Unterstützung.
[postgresql] [usecase] ¶
Die „Ping“-Abfrage, die beim Konfigurieren von
create_engine.pool_pre_pingfür psycopg, asyncpg und pg8000, aber nicht für psycopg2, ausgegeben wird, wurde auf eine leere Abfrage (;) anstelle vonSELECT 1geändert; zusätzlich wurde für den asyncpg-Treiber die unnötige Verwendung eines vorbereiteten Statements für diese Abfrage behoben. Begründung ist die Eliminierung der Notwendigkeit, dass PostgreSQL einen Abfrageplan erstellt, wenn der Ping ausgegeben wird. Die Operation wird derzeit nicht vompsycopg2-Treiber unterstützt, der weiterhinSELECT 1verwendet.Referenzen: #8491
[postgresql] [change] ¶
SQLAlchemy erfordert nun PostgreSQL-Version 9 oder höher. Ältere Versionen können in einigen begrenzten Anwendungsfällen weiterhin funktionieren.
[postgresql] [change] [mssql] ¶
Der Parameter
UUID.as_uuidvonUUID, der zuvor spezifisch für den PostgreSQL-Dialekt war, aber nun für Core verallgemeinert wurde (zusammen mit einem neuen Backend-unabhängigen DatentypUuid), steht nun standardmäßig aufTrue, was bedeutet, dass PythonUUID-Objekte von diesem Datentyp standardmäßig akzeptiert werden. Zusätzlich wurde der SQL ServerUNIQUEIDENTIFIER-Datentyp zu einem UUID-empfangenden Typ konvertiert; für Legacy-Code, derUNIQUEIDENTIFIERunter Verwendung von Zeichenkettenwerten verwendet, setzen Sie den ParameterUNIQUEIDENTIFIER.as_uuidaufFalse.Referenzen: #7225
[postgresql] [change] ¶
Der Parameter
ENUM.namefür den PostgreSQL-spezifischen DatentypENUMist nun ein erforderliches Schlüsselwortargument. Der „Name“ ist in jedem Fall erforderlich, damit dasENUMals Fehler verwendet werden kann, wenn „name“ nicht vorhanden ist, was zur SQL/DDL-Renderzeit zu einem Fehler führen würde.[postgresql] [change] ¶
Zur Unterstützung neuer PostgreSQL-Funktionen, einschließlich des psycopg3-Dialekts sowie der erweiterten „fast insertmany“-Unterstützung, wurde das System, mit dem Typinformationen für gebundene Parameter an die PostgreSQL-Datenbank übergeben werden, neu gestaltet, um Inline-Casts zu verwenden, die vom SQL-Compiler ausgegeben werden, und wird nun auf alle PostgreSQL-Dialekte angewendet. Dies steht im Gegensatz zum bisherigen Ansatz, der sich auf die Verwendung des DBAPI zum Rendern dieser Casts verlassen hätte, was in Fällen wie dem von pg8000 und dem angepassten asyncpg-Treiber die pep-249
setinputsizes()-Methode verwenden würde, oder mit dem psycopg2-Treiber in den meisten Fällen auf den Treiber selbst angewiesen wäre, mit einigen Sonderfällen für ARRAY.Der neue Ansatz rendert nun alle PostgreSQL-Dialekte diese Casts nach Bedarf mit PostgreSQL-Doppelpunkt-Stil im Compiler, und die Verwendung von
setinputsizes()wurde für PostgreSQL-Dialekte entfernt, da dies im Allgemeinen bei diesen DBAPIs ohnehin nicht Teil war (pg8000 ist die einzige Ausnahme, die die Methode auf Wunsch von SQLAlchemy-Entwicklern hinzugefügt hat).Vorteile dieses Ansatzes sind die Leistung pro Anweisung, da keine zweite Durchsicht der kompilierten Anweisung zur Ausführungszeit erforderlich ist, bessere Unterstützung für alle DBAPIs, da es nun ein einheitliches System zur Anwendung von Typinformationen gibt, und verbesserte Transparenz, da die SQL-Protokollausgabe sowie die Zeichenkettenausgabe einer kompilierten Anweisung diese Casts direkt in der Anweisung anzeigen, während zuvor diese Casts in der Protokollausgabe nicht sichtbar waren, da sie nach der Protokollierung der Anweisung erfolgten.
[postgresql] [bug] ¶
Der Operator
Operators.match()verwendet nunplainto_tsquery()für die PostgreSQL-Volltextsuche anstelle vonto_tsquery(). Die Begründung für diese Änderung ist eine bessere Kreuzkompatibilität mit dem Match auf anderen Datenbank-Backends. Volle Unterstützung für alle PostgreSQL-Volltextfunktionen bleibt über die Verwendung vonfuncin Verbindung mitOperators.bool_op()(einer verbesserten Version vonOperators.op()für boolesche Operatoren) verfügbar.Siehe auch
Der Operator match() unter PostgreSQL verwendet plainto_tsquery() anstelle von to_tsquery()
Referenzen: #7086
[postgresql] [removed] ¶
Unterstützung für mehrere veraltete Treiber entfernt
pypostgresql für PostgreSQL. Dies ist als externer Treiber unter https://github.com/PyGreSQL verfügbar
pygresql für PostgreSQL.
Bitte wechseln Sie zu einem der unterstützten Treiber oder zur externen Version desselben Treibers.
Referenzen: #7258
[postgresql] [dialect] ¶
Unterstützung für den
psycopg-Dialekt hinzugefügt, der sowohl synchrone als auch asynchrone Ausführung unterstützt. Dieser Dialekt ist unter dem Namenpostgresql+psycopgsowohl für diecreate_engine()- als auch für diecreate_async_engine()-Funktionen zur Erzeugung von Engines verfügbar.Referenzen: #6842
[postgresql] [psycopg2] ¶
Aktualisierung des psycopg2-Dialekts zur Verwendung der DBAPI-Schnittstelle zur Ausführung von Zweiphasentransaktionen. Zuvor wurden SQL-Befehle zur Handhabung dieser Art von Transaktionen ausgeführt.
Referenzen: #7238
[postgresql] [schema] ¶
Der Typ
JSONPATHwurde eingeführt, der in Cast-Ausdrücken verwendet werden kann. Dies ist für einige PostgreSQL-Dialekte erforderlich, wenn Funktionen wiejsonb_path_existsoderjsonb_path_matchverwendet werden, die einenjsonpathals Eingabe akzeptieren.Siehe auch
JSON-Typen - PostgreSQL JSON-Typen.
Referenzen: #8216
[postgresql] [reflection] ¶
Der PostgreSQL-Dialekt unterstützt nun die Reflexion von ausdrucksbasierten Indizes. Die Reflexion wird sowohl bei der Verwendung von
Inspector.get_indexes()als auch bei der Reflexion einerTablemittelsTable.autoload_withunterstützt. Dank an immerrr und Aidan Kane für die Hilfe bei diesem Ticket.Referenzen: #7442
mysql¶
[mysql] [usecase] [mariadb] ¶
Die Funktion
ROLLUPrendertWITH ROLLUPnun korrekt auf MySql und MariaDB, was die Verwendung von Group By Rollup mit diesen Backends ermöglicht.Referenzen: #8503
[mysql] [bug] ¶
Ein Problem in MySQL
Insert.on_duplicate_key_update()wurde behoben, bei dem der falsche Spaltenname gerendert wurde, wenn ein Ausdruck in einem VALUES-Ausdruck verwendet wurde. Pull-Request von Cristian Sabaila.Diese Änderung wird auch **zurückportiert** nach: 1.4.27
Referenzen: #7281
[mysql] [removed] ¶
Die Unterstützung für den OurSQL-Treiber für MySQL und MariaDB wurde entfernt, da dieser Treiber anscheinend nicht mehr gewartet wird.
Referenzen: #7258
mariadb¶
[mariadb] [usecase] ¶
Eine neue Ausführungsoption
is_delete_using=Truewurde hinzugefügt, die vom ORM beim Verwenden einer ORM-aktivierten DELETE-Anweisung in Verbindung mit der „fetch“-Synchronisierungsstrategie verbraucht wird; diese Option gibt an, dass erwartet wird, dass die DELETE-Anweisung mehrere Tabellen verwendet, was auf MariaDB die DELETE..USING-Syntax ist. Die Option gibt dann an, dass RETURNING (neu implementiert in SQLAlchemy 2.0 für MariaDB für #7011) nicht für Datenbanken verwendet werden sollte, von denen bekannt ist, dass sie keine „DELETE..USING..RETURNING“-Syntax unterstützen, auch wenn sie „DELETE..USING“ unterstützen, was die aktuelle Fähigkeit von MariaDB ist.Die Begründung für diese Option ist, dass die aktuellen Arbeitsweisen von ORM-aktiviertem DELETE nicht im Voraus wissen, ob eine DELETE-Anweisung für mehrere Tabellen bestimmt ist oder nicht, bis die Kompilierung erfolgt, die in jedem Fall zwischengespeichert wird, aber bekannt sein muss, damit eine SELECT für die zu löschende Zeile im Voraus ausgegeben werden kann. Anstatt eine pauschale Leistungsstrafe für alle DELETE-Anweisungen anzuwenden, indem diese alle proaktiv auf dieses relativ ungewöhnliche SQL-Muster überprüft werden, wird die Ausführungsoption
is_delete_using=Trueüber eine neue Ausnahmemeldung angefordert, die während des Kompilierungsschritts ausgelöst wird. Diese Ausnahmemeldung wird speziell (und nur) ausgelöst, wenn: die Anweisung eine ORM-aktivierte DELETE ist, bei der die „fetch“-Synchronisierungsstrategie angefordert wurde; das Backend MariaDB oder ein anderes Backend mit dieser spezifischen Einschränkung ist; die Anweisung während der ersten Kompilierung erkannt wurde, dass sie andernfalls „DELETE..USING..RETURNING“ ausgeben würde. Durch Anwenden der Ausführungsoption weiß das ORM, stattdessen eine SELECT im Voraus auszuführen. Eine ähnliche Option ist für ORM-aktivierte UPDATE implementiert, aber derzeit ist kein Backend erforderlich, bei dem sie benötigt wird.Referenzen: #8344
[mariadb] [usecase] ¶
Unterstützung für INSERT..RETURNING und DELETE..RETURNING für das MariaDB-Dialekt hinzugefügt. UPDATE..RETURNING wird von MariaDB noch nicht unterstützt. MariaDB unterstützt INSERT..RETURNING ab 10.5.0 und DELETE..RETURNING ab 10.0.5.
Referenzen: #7011
sqlite¶
[sqlite] [usecase] ¶
Neuer Parameter für SQLite für Reflektionsmethoden namens
sqlite_include_internal=Truehinzugefügt; wenn weggelassen, werden lokale Tabellen, die mit dem Präfixsqlite_beginnen, die laut SQLite-Dokumentation als „interne Schematabellen“ bezeichnet werden, wie z. B. diesqlite_sequence-Tabelle, die zur Unterstützung von „AUTOINCREMENT“-Spalten generiert wird, nicht in Reflektionsmethoden, die Listen lokaler Objekte zurückgeben, enthalten sein. Dies verhindert beispielsweise Probleme bei der Verwendung von Alembic Autogenerate, die diese von SQLite generierten Tabellen zuvor als aus dem Modell entfernt betrachtet hätte.Siehe auch
Referenzen: #8234
[sqlite] [usecase] ¶
RETURNING-Unterstützung für das SQLite-Dialekt hinzugefügt. SQLite unterstützt RETURNING seit Version 3.35.
Referenzen: #6195
[sqlite] [usecase] [performance] ¶
SQLite-Datentypen datetime, date und time verwenden nun die
fromisoformat()-Methoden der Python-Standardbibliothek, um eingehende Datums- und Zeitwerte zu parsen. Dies verbessert die Leistung im Vergleich zum früheren regulären Ausdruck-basierten Ansatz und berücksichtigt automatisch Datums- und Zeitformate, die entweder ein sechsstellige „Mikrosekunden“-Format oder ein dreistellige „Millisekunden“-Format enthalten.Referenzen: #7029
[sqlite] [usecase] ¶
Das SQLite-Dialekt unterstützt nun die UPDATE..FROM-Syntax für UPDATE-Anweisungen, die sich auf zusätzliche Tabellen im WHERE-Kriterium der Anweisung beziehen können, ohne Unterabfragen verwenden zu müssen. Diese Syntax wird automatisch aufgerufen, wenn der
Update-Konstrukt verwendet wird, wenn mehr als eine Tabelle oder eine andere Entität oder wählbares Objekt verwendet wird.Referenzen: #7185
[sqlite] [bug] ¶
Die Warnung, die vom Typ
Numericbezüglich DBAPIs, die Decimal-Werte nicht nativ unterstützen, ausgegeben wurde, wurde entfernt. Diese Warnung richtete sich an SQLite, das ohne zusätzliche Erweiterungen oder Workarounds keine Möglichkeit hat, numerische Werte mit Präzision über 15 signifikante Stellen zu verarbeiten, da es nur Fließkomma-Arithmetik zur Darstellung von Zahlen verwendet. Da dies eine bekannte und dokumentierte Einschränkung von SQLite selbst und kein Eigenart des pysqlite-Treibers ist, besteht für SQLAlchemy kein Grund, davor zu warnen. Die Änderung ändert nicht die Handhabung von numerischen Werten mit Präzision. Werte können weiterhin alsDecimal()oderfloat()behandelt werden, wie sie mitNumeric,Floatund verwandten Datentypen konfiguriert sind, jedoch ohne die Möglichkeit, bei Verwendung von SQLite Präzision über 15 signifikante Stellen hinaus aufrechtzuerhalten, es sei denn, es werden alternative Darstellungen wie Strings verwendet.Referenzen: #7299
[sqlite] [bug] [performance] ¶
Das SQLite-Dialekt verwendet nun standardmäßig
QueuePool, wenn eine dateibasierte Datenbank verwendet wird. Dies wird zusammen mit der Einstellung des Parameterscheck_same_threadaufFalsevorgenommen. Es wurde beobachtet, dass der vorherige Ansatz, standardmäßig aufNullPoolzu setzen, der die Datenbankverbindungen nach der Freigabe nicht beibehält, tatsächlich messbare negative Auswirkungen auf die Leistung hatte. Wie immer ist die Pool-Klasse über den Parametercreate_engine.poolclassanpassbar.Referenzen: #7490
mssql¶
[mssql] [usecase] ¶
Die Reflexion des Flags „clustered index“
mssql_clusteredfür das SQL Server-Dialekt wurde implementiert. Pull-Request von John Lennox.Referenzen: #8288
[mssql] [usecase] ¶
Unterstützung für Tabellen- und Spaltenkommentare unter MSSQL beim Erstellen einer Tabelle hinzugefügt. Unterstützung für die Reflexion von Tabellenkommentaren hinzugefügt. Dank an Daniel Hall für die Hilfe bei diesem Pull-Request.
Referenzen: #7844
[mssql] [bug] ¶
Der Parameter
use_setinputsizesfür das Dialektmssql+pyodbcist nun standardmäßigTrue; dies bewirkt, dass Nicht-Unicode-String-Vergleiche von pyodbc an pyodbc.SQL_VARCHAR und nicht an pyodbc.SQL_WVARCHAR gebunden werden, wodurch Indizes auf VARCHAR-Spalten wirksam werden können. Damit der Parameterfast_executemany=Trueweiterhin funktioniert, überspringt deruse_setinputsizes-Modus nun den Aufruf voncursor.setinputsizes()speziell dann, wennfast_executemanyTrue ist und die verwendete Methodecursor.executemany()ist, die setinputsizes nicht unterstützt. Die Änderung fügt auch geeignete pyodbc DBAPI-Typisierungen für Werte hinzu, die alsUnicodeoderUnicodeTexttypisiert sind, sowie die Basis-DatentypJSONso geändert, dass JSON-String-Werte alsUnicodeanstatt alsStringbetrachtet werden.Referenzen: #8177
[mssql] [removed] ¶
Die Unterstützung für den mxodbc-Treiber wurde aufgrund mangelnder Testunterstützung entfernt. ODBC-Benutzer können das pyodbc-Dialekt verwenden, das vollständig unterstützt wird.
Referenzen: #7258
oracle¶
[oracle] [feature] ¶
Unterstützung für den neuen Oracle-Treiber
oracledbhinzugefügt.Referenzen: #8054
[oracle] [feature] ¶
DDL- und Reflexionsunterstützung für
FLOAT-Datentypen, die einen expliziten „binary_precision“-Wert enthalten, wurde implementiert. Unter Verwendung des Oracle-spezifischenFLOAT-Datentyps kann der neue ParameterFLOAT.binary_precisionangegeben werden, der die Präzision von Oracle für Gleitkommazahlen direkt rendert. Dieser Wert wird bei der Reflexion interpretiert. Nach der Reflexion einesFLOAT-Datentyps ist der zurückgegebene DatentypDOUBLE_PRECISIONfür einFLOATmit einer Präzision von 126 (dies ist auch die Standardpräzision von Oracle fürFLOAT),REALfür eine Präzision von 63 undFLOATfür eine benutzerdefinierte Präzision, gemäß der Oracle-Dokumentation.Als Teil dieser Änderung wird der generische Wert
Float.precisionbei der Generierung von DDL für Oracle ausdrücklich abgelehnt, da diese Präzision nicht genau in „binary precision“ umgewandelt werden kann; stattdessen ermutigt eine Fehlermeldung die Verwendung vonTypeEngine.with_variant(), damit die spezifische Form der Präzision von Oracle genau gewählt werden kann. Dies ist eine abwärtsinkompatible Verhaltensänderung, da der vorherige „precision“-Wert für Oracle stillschweigend ignoriert wurde.Siehe auch
Neuer Oracle FLOAT-Typ mit binärer Präzision; Dezimalpräzision wird nicht direkt akzeptiert
Referenzen: #5465
[oracle] [feature] ¶
Vollständige „RETURNING“-Unterstützung wurde für das cx_Oracle-Dialekt implementiert, die zwei individuelle Arten von Funktionalität abdeckt
Mehrzeilige RETURNING ist implementiert, was bedeutet, dass nun mehrere RETURNING-Zeilen für DML-Anweisungen empfangen werden, die mehr als eine Zeile für RETURNING erzeugen.
„executemany RETURNING“ ist ebenfalls implementiert – dies ermöglicht es RETURNING, Zeilen pro Anweisung zurückzugeben, wenn
cursor.executemany()verwendet wird. Die Implementierung dieses Teils der Funktion liefert dramatische Leistungsverbesserungen für ORM-Einfügungen, auf die gleiche Weise, wie sie für psycopg2 in der SQLAlchemy 1.4-Änderung ORM Batch-Einfügungen mit psycopg2 batchieren nun in den meisten Fällen Anweisungen mit RETURNING hinzugefügt wurde.
Referenzen: #6245
[oracle] [usecase] ¶
Oracle verwendet nun standardmäßig die FETCH FIRST N ROWS / OFFSET-Syntax für Limit/Offset-Unterstützung für Oracle 12c und höher. Diese Syntax war bereits verfügbar, wenn
Select.fetch()direkt verwendet wurde, jetzt ist sie auch fürSelect.limit()undSelect.offset()impliziert.Referenzen: #8221
[oracle] [change] ¶
Materialized Views unter Oracle werden nun als Views reflektiert. In früheren Versionen von SQLAlchemy wurden die Views unter den Tabellennamen, nicht unter den View-Namen zurückgegeben. Als Nebeneffekt dieser Änderung werden sie von
MetaData.reflect()nicht standardmäßig reflektiert, es sei denn,views=Trueist gesetzt. Um eine Liste von Materialized Views zu erhalten, verwenden Sie die neue InspektionsmethodeInspector.get_materialized_view_names().[oracle] [bug] ¶
Anpassungen wurden an den BLOB / CLOB / NCLOB-Datentypen in den cx_Oracle- und oracledb-Dialekten vorgenommen, um die Leistung basierend auf Empfehlungen von Oracle-Entwicklern zu verbessern.
Referenzen: #7494
[oracle] [bug] ¶
Im Zusammenhang mit der Deprecation für
create_engine.implicit_returningist die Funktion „implicit_returning“ nun in allen Fällen für das Oracle-Dialekt aktiviert; zuvor war die Funktion deaktiviert, wenn eine Oracle 8/8i-Version erkannt wurde, jedoch zeigt die Online-Dokumentation an, dass beide Versionen dieselbe RETURNING-Syntax wie moderne Versionen unterstützen.Referenzen: #6962
[oracle] ¶
cx_Oracle 7 ist nun die Mindestversion für cx_Oracle.
misc¶
[removed] [sybase] ¶
Das interne „sybase“-Dialekt, das in früheren SQLAlchemy-Versionen als veraltet markiert war, wurde entfernt. Unterstützung durch Drittanbieter-Dialekte ist verfügbar.
Siehe auch
Referenzen: #7258
[removed] [firebird] ¶
Das interne „firebird“-Dialekt, das in früheren SQLAlchemy-Versionen als veraltet markiert war, wurde entfernt. Unterstützung durch Drittanbieter-Dialekte ist verfügbar.
Siehe auch
Referenzen: #7258
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