SQLAlchemy 2.0 Dokumentation
Änderungen und Migration
- SQLAlchemy 2.0 - Major Migration Guide
- Was ist neu in SQLAlchemy 2.0?
- 2.0 Changelog
- 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
1.3 Changelog¶
1.3.25¶
kein Veröffentlichungsdatumorm¶
[orm] [bug] ¶
Problem in
Session.bulk_save_objects()behoben, wenn es mit persistenten Objekten verwendet wurde, die den Primärschlüssel von Mappings nicht korrekt verfolgen konnten, bei denen der Spaltenname des Primärschlüssels sich vom Attributnamen unterschied.Referenzen: #6392
schema¶
[schema] [bug] ¶
Das Objekt
Tablelöst nun eine aussagekräftige Fehlermeldung aus, wenn es instanziiert wird, ohne mindestens die ArgumenteTable.nameundTable.metadatapositionell zu übergeben. Zuvor, wenn diese als Schlüsselwortargumente übergeben wurden, schlug die Objektinitialisierung stillschweigend fehl.Referenzen: #6135
postgresql¶
[postgresql] [bug] [regression] ¶
Behebung einer Regression, die durch #6023 verursacht wurde, bei der der PostgreSQL-Cast-Operator auf Elemente innerhalb eines
ARRAYbei Verwendung von psycopg2 fehlschlug, das korrekte Typ in dem Fall zu verwenden, dass der Datentyp auch innerhalb einer Instanz desVariant-Adapters eingebettet war.Zusätzlich werden Reparaturen für die Unterstützung des korrekten CREATE TYPE vorgenommen, wenn
Variant(ARRAY(some_schema_type))verwendet wird.Referenzen: #6182
mysql¶
[mysql] [bug] [mariadb] ¶
Korrekturen zur Berücksichtigung der MariaDB 10.6-Serie, einschließlich abwärtskompatibler Änderungen sowohl im mariadb-connector Python-Treiber (nur für SQLAlchemy 1.4 unterstützt) als auch in den nativen 10.6-Clientbibliotheken, die automatisch vom mysqlclient DBAPI verwendet werden (gilt für 1.3 und 1.4). Die Kodierung "utf8mb3" wird von diesen Clientbibliotheken nun gemeldet, wenn die Kodierung als "utf8" angegeben ist, was zu Such- und Kodierungsfehlern im MySQL-Dialekt führt, der dieses Symbol nicht erwartet. Aktualisierungen sowohl der MySQL-Basisbibliothek zur Berücksichtigung dieses gemeldeten utf8mb3-Symbols als auch der Testsuite. Dank an Georg Richter für die Unterstützung.
sqlite¶
1.3.24¶
Veröffentlicht: 30. März 2021orm¶
[orm] [bug] ¶
Sehr alte Warnung entfernt, die besagte, dass passive_deletes nicht für viele-zu-eins-Beziehungen vorgesehen ist. Obwohl es wahrscheinlich ist, dass die Platzierung dieses Parameters bei einer viele-zu-eins-Beziehung in vielen Fällen nicht beabsichtigt war, gibt es Anwendungsfälle, in denen der Lösch-Cascade von solchen Beziehungen aus verhindert werden soll.
Referenzen: #5983
[orm] [bug] ¶
Problem behoben, bei dem der Prozess des Verknüpfens zweier Tabellen fehlschlagen konnte, wenn eine der Tabellen eine nicht verwandte, unauflösliche Fremdschlüsselbeschränkung hatte, die
NoReferenceErrorwährend des Verknüpfungsprozesses auslöste, was dennoch umgangen werden konnte, um die Verknüpfung abzuschließen. Die Logik, die die Ausnahme auf ihre Bedeutung im Prozess prüfte, traf Annahmen über die Konstruktion, die fehlschlugen.Referenzen: #5952
[orm] [bug] ¶
Problem behoben, bei dem die
MutableComposite-Konstruktion in einen ungültigen Zustand geraten konnte, wenn das Elternobjekt bereits geladen war und dann durch eine nachfolgende Abfrage überschrieben wurde, da der Refresh-Handler der Composite-Eigenschaften das Objekt durch ein neues ersetzte, das nicht von der mutable-Erweiterung behandelt wurde.Referenzen: #6001
engine¶
[engine] [bug] ¶
Fehler behoben, bei dem die Funktion "schema_translate_map" für den Anwendungsfall der direkten Ausführung von
DefaultGenerator-Objekten wie Sequenzen nicht berücksichtigt wurde, einschließlich des Falls, dass sie "pre-executed" wurden, um Primärschlüsselwerte zu generieren, wenn implicit_returning deaktiviert war.Referenzen: #5929
schema¶
[schema] [bug] ¶
Fehler behoben, der zuerst in einer Kombination von #2892, #2919 und #3832 eingeführt wurde, bei dem die Anfügungsereignisse für einen
TypeDecoratordoppelt gegen die "impl"-Klasse aufgerufen wurden, wenn die "impl" ebenfalls einSchemaTypewar. Der reale Fall ist jederTypeDecoratorgegenEnumoderBooleanwürde einen doppeltenCheckConstrainterhalten, wenn das Flagcreate_constraint=Truegesetzt ist.Referenzen: #6152
[schema] [bug] [sqlite] ¶
Fehler behoben, bei dem die von
BooleanoderEnumgenerierte CHECK-Beschränkung die Benennungskonvention nach der ersten Kompilierung nicht korrekt rendern würde, aufgrund einer unbeabsichtigten Zustandsänderung innerhalb des Namens der Beschränkung. Dieses Problem wurde erstmals in 0.9 in der Behebung für Ticket #3067 eingeführt, und die Behebung überarbeitet den damals verfolgten Ansatz, der offenbar mehr Aufwand erforderte, als nötig war.Referenzen: #6007
[schema] [bug] ¶
Reparierte / implementierte Unterstützung für Primärschlüssel-Beschränkungsnamenskonventionen, die Spaltennamen/Schlüssel/usw. als Teil der Konvention verwenden. Insbesondere wird das Objekt
PrimaryKeyConstraint, das automatisch mit einerTableverknüpft ist, seinen Namen aktualisieren, wenn neue Primärschlüssel-Column-Objekte zur Tabelle und dann zur Beschränkung hinzugefügt werden. Interne Fehler bei der Konstruktion dieser Beschränkung, einschließlich fehlender Spalten, fehlenden Namens oder leerer Namensangaben, werden nun berücksichtigt.Referenzen: #5919
[schema] [bug] ¶
Angepasste Logik, die DROP-Anweisungen für
Sequence-Objekte beim Löschen mehrerer Tabellen ausgibt, so dass alleSequence-Objekte nach allen Tabellen gelöscht werden, auch wenn die gegebeneSequencenur mit einemTable-Objekt und nicht direkt mit dem gesamtenMetaData-Objekt verknüpft ist. Der Anwendungsfall unterstützt die gleicheSequence, die gleichzeitig mit mehr als einerTableverknüpft ist.Referenzen: #6071
postgresql¶
[postgresql] [bug] ¶
Problem behoben, bei dem die Verwendung von
aggregate_order_byunter bestimmten Bedingungen ARRAY(NullType) zurückgab, was die korrekte Rückgabe von Daten durch das Ergebnisobjekt beeinträchtigte.Referenzen: #5989
[postgresql] [bug] [reflection] ¶
Problem bei der PostgreSQL-Reflexion behoben, bei dem eine Spalte, die "NOT NULL" ausdrückt, die Nullbarkeit einer entsprechenden Domäne überschrieb.
Referenzen: #6161
[postgresql] [bug] [types] ¶
Der psycopg2-Dialekt wurde angepasst, um einen expliziten PostgreSQL-Cast für gebundene Parameter auszugeben, die ARRAY-Elemente enthalten. Dies ermöglicht die korrekte Funktion des gesamten Datentypspektrums innerhalb von Arrays. Der asyncpg-Dialekt generierte diese internen Casts bereits in der endgültigen Anweisung. Dies beinhaltet auch die Unterstützung für Array-Slice-Updates sowie die PostgreSQL-spezifische Methode
ARRAY.contains().Referenzen: #6023
mssql¶
1.3.23¶
Veröffentlicht: 1. Februar 2021sql¶
[sql] [bug] ¶
Fehler behoben, bei dem die Verwendung der Methode
TypeEngine.with_variant()für einenTypeDecorator-Typ die Berücksichtigung der verwendeten dialektspezifischen Abbildungen fehlschlug, aufgrund einer Regel inTypeDecorator, die stattdessen versuchte, Ketten vonTypeDecorator-Instanzen zu prüfen.Referenzen: #5816
postgresql¶
[postgresql] [bug] ¶
Nur für SQLAlchemy 1.3 wird pg8000 in setup.py auf eine Version kleiner als 1.16.6 pinned. Version 1.16.6 und höher wird von SQLAlchemy 1.4 unterstützt. Pull-Request von Giuseppe Lumia.
Referenzen: #5645
[postgresql] [bug] ¶
Problem behoben, bei dem die Verwendung von
Table.to_metadata()(in 1.3Table.tometadata()genannt) in Verbindung mit einer PostgreSQLExcludeConstraint, die Ad-hoc-Spaltenausdrücke verwendete, nicht korrekt kopiert wurde.Referenzen: #5850
mysql¶
[mysql] [usecase] ¶
Das Casting zu
FLOATwird nun in MySQL >= (8, 0, 17) und MariaDb >= (10, 4, 5) unterstützt.Referenzen: #5808
[mysql] [bug] [reflection] ¶
Fehler behoben, bei dem die Standard-Reflexion des MySQL-Servers für numerische Werte mit einem Negationssymbol fehlschlug.
Referenzen: #5860
[mysql] [bug] ¶
Langjähriger Fehler im MySQL-Dialekt behoben, bei dem die maximale Bezeichnerlänge von 255 für Namen aller Arten von Beschränkungen zu lang war, nicht nur für Indizes, die alle eine Größenbeschränkung von 64 haben. Da Metadaten-Namenskonventionen zu lange Namen in diesem Bereich erzeugen können, wird das Limit auf den Bezeichnergenerator innerhalb des DDL-Kompilierers angewendet.
Referenzen: #5898
[mysql] [bug] ¶
Deprecations-Warnungen behoben, die infolge der Veröffentlichung von PyMySQL 1.0 aufgetreten waren, einschließlich Deprecations-Warnungen für die Parameter "db" und "passwd", die nun durch "database" und "password" ersetzt wurden.
Referenzen: #5821
[mysql] [bug] ¶
Behebung einer Regression von SQLAlchemy 1.3.20, die durch die Behebung von #5462 verursacht wurde, welche doppelte Klammern für MySQL-Funktionsausdrücke in Indizes hinzufügt, wie es das Backend erfordert. Dies erstreckte sich unbeabsichtigt auf beliebige
text()-Ausdrücke sowie auf Alembics interne Textkomponenten, die von Alembic für beliebige Indexausdrücke benötigt werden, die keine doppelten Klammern implizieren. Die Prüfung wurde auf die direkte Einbeziehung von binären/unären/funktionalen Ausdrücken beschränkt.Referenzen: #5800
oracle¶
[oracle] [bug] ¶
Regression im Oracle-Dialekt, die durch #4894 in SQLAlchemy 1.3.11 eingeführt wurde, behoben, bei der die Verwendung eines SQL-Ausdrucks in RETURNING für ein UPDATE nicht kompiliert wurde, aufgrund einer Prüfung auf "server_default", wenn ein beliebiger SQL-Ausdruck keine Spalte ist.
Referenzen: #5813
[oracle] [bug] ¶
Fehler im Oracle-Dialekt behoben, bei dem der Abruf einer CLOB/BLOB-Spalte über
Insert.returning()fehlschlug, da der LOB-Wert beim Zurückgeben gelesen werden musste; zusätzlich wurde die Unterstützung für den Abruf von Unicode-Werten über RETURNING unter Python 2 repariert.Referenzen: #5812
misc¶
[bug] [ext] ¶
Problem behoben, bei dem die Stringifizierung, die manchmal beim Versuch aufgerufen wird, den "key" für die
.c-Sammlung eines wählbaren Elements zu generieren, fehlschlug, wenn die Spalte ein unbeschriftetes benutzerdefiniertes SQL-Konstrukt war, das diesqlalchemy.ext.compiler-Erweiterung verwendete und keine Standardkompilierungsform bot. Während dies ein ungewöhnlicher Fall zu sein scheint, kann er in einigen ORM-Szenarien aufgerufen werden, z. B. wenn der Ausdruck in einem "order by" in Kombination mit joined eager loading verwendet wird. Das Problem ist, dass das Fehlen einer Standard-CompilerfunktionCompileErrorund nichtUnsupportedCompilationErrorauslöste.Referenzen: #5836
1.3.22¶
Veröffentlicht: 18. Dezember 2020oracle¶
[oracle] [bug] ¶
Regression behoben, die aufgrund von #5755 aufgetreten war, welche die Unterstützung für Isolationsebenen für Oracle implementierte. Es wurde berichtet, dass viele Oracle-Konten tatsächlich keine Berechtigung haben, die Ansicht
v$transactionabzufragen, daher wurde diese Funktion so geändert, dass sie beim Verbindungsaufbau mit der Datenbank zurückfällt, wobei der Dialekt "READ COMMITTED" als Standard-Isolationsebene annimmt, wie es vor SQLAlchemy 1.3.21 der Fall war. Die explizite Verwendung der MethodeConnection.get_isolation_level()muss nun notwendigerweise eine Ausnahme auslösen, da Oracle-Datenbanken mit dieser Einschränkung dem Benutzer die Lesung der aktuellen Isolationsebene ausdrücklich untersagen.Referenzen: #5784
1.3.21¶
Veröffentlicht: 17. Dezember 2020orm¶
[orm] [bug] ¶
Umfassende Prüfung und aussagekräftige Fehlermeldung hinzugefügt für den Fall, dass eine zugeordnete Klasse oder ein zugeordneter Klassenname als String an
relationship.secondaryübergeben wird. Dies ist ein äußerst häufiger Fehler, der eine klare Meldung verdient.Zusätzlich wurde eine neue Regel zur Klassenregistrierungsauflösung hinzugefügt, so dass in Bezug auf den Parameter
relationship.secondary, wenn eine zugeordnete Klasse und ihre Tabelle den identischen Stringnamen haben, dieTablebei der Auflösung dieses Parameters bevorzugt wird. In allen anderen Fällen wird die Klasse weiterhin bevorzugt, wenn Klasse und Tabelle denselben Namen teilen.Referenzen: #5774
[orm] [bug] ¶
Fehler in
Query.update()behoben, bei dem Objekte in der_ormsession.Session, die bereits abgelaufen waren, unnötigerweise einzeln ausgewählt wurden, wenn sie durch die "evaluate" synchronisierungsstrategie aufgefrischt wurden.Referenzen: #5664
[orm] [bug] ¶
Problem mit der Option
restore_load_contextvon ORM-Events wieInstanceEvents.load()behoben, sodass das Flag nicht an Unterklassen weitergegeben wurde, die nach der ersten Einrichtung des Event-Handlers zugeordnet wurden.Referenzen: #5737
sql¶
[sql] [bug] ¶
Eine Warnung wird ausgegeben, wenn eine
returning()-Methode wieInsert.returning()mehrmals aufgerufen wird, da dies noch keine additive Operation unterstützt. Version 1.4 wird dies unterstützen. Außerdem löst jede Kombination der MethodenInsert.returning()undValuesBase.return_defaults()nun einen Fehler aus, da diese Methoden sich gegenseitig ausschließen; zuvor schlug die Operation stillschweigend fehl.Referenzen: #5691
[sql] [bug] ¶
Strukturelles Compiler-Problem behoben, bei dem einige Konstrukte wie MySQL / PostgreSQL "on conflict / on duplicate key" vom Zustand des
Compiler-Objekts abhingen, das gegen ihre Anweisung als oberste Anweisung fixiert war, was in Fällen fehlschlug, in denen diese Anweisungen aus einem anderen Kontext verzweigt wurden, wie z. B. einer DDL-Konstruktion, die mit einer SQL-Anweisung verknüpft war.Referenzen: #5656
postgresql¶
[postgresql] [usecase] ¶
Neuer Parameter
ExcludeConstraint.opszum ObjektExcludeConstrainthinzugefügt, zur Unterstützung der Operator-Klassen-Spezifikation mit dieser Einschränkung. Pull-Request von Alon Menczer.Referenzen: #5604
[postgresql] [bug] [mysql] ¶
Regression in Version 1.3.2 für das PostgreSQL-Dialekt behoben, die auch in Version 1.3.18 auf das MySQL-Dialekt kopiert wurde. Zuvor schlug die Verwendung eines Nicht-
Table-Konstrukts wietext()als Argument fürSelect.with_for_update.offehl, um korrekt in den PostgreSQL- oder MySQL-Compilern verarbeitet zu werden.Referenzen: #5729
mysql¶
[mysql] [bug] [reflection] ¶
Problem behoben, bei dem die Spiegelung eines Server-Defaults auf MariaDB mit einem Dezimalpunkt im Wert fehlschlug, was zu einer gespiegelten Tabelle ohne Server-Default führte.
Referenzen: #5744
[mysql] [sql] ¶
Fehlende Schlüsselwörter zur Liste
RESERVED_WORDSfür das MySQL-Dialekt hinzugefügt:action,level,mode,status,text,time. Pull-Request von Oscar Batori.Referenzen: #5696
sqlite¶
mssql¶
[mssql] [bug] ¶
Fehler behoben, bei dem eine CREATE INDEX-Anweisung falsch gerendert wurde, wenn sowohl
mssql-includeals auchmssql_whereangegeben wurden. Pull-Request von @Adiorz.Referenzen: #5751
[mssql] [bug] ¶
SQL Server-Code "01000" zur Liste der Trennungscodes hinzugefügt.
Referenzen: #5646
[mssql] [reflection] [sqlite] ¶
Problem behoben, bei dem zusammengesetzte Primärschlüsselspalten nicht in der richtigen Reihenfolge gemeldet wurden. Patch von @fulpm.
Referenzen: #5661
oracle¶
[oracle] [usecase] ¶
Unterstützung für die Isolationsstufe SERIALIZABLE für Oracle-Datenbanken implementiert, sowie eine echte Implementierung für
Connection.get_isolation_level().Siehe auch
Referenzen: #5755
1.3.20¶
Veröffentlicht: 12. Oktober 2020orm¶
[orm] [bug] ¶
Ein
ArgumentErrormit mehr Details wird nun ausgelöst, wenn der Zielparameter fürQuery.join()auf ein nicht zugeordnetes Objekt gesetzt ist. Vor dieser Änderung wurde ein weniger detaillierterAttributeErrorausgelöst. Pull-Request von Ramon Williams.Referenzen: #4428
[orm] [bug] ¶
Problem behoben, bei dem die Verwendung einer Ladeoption gegen einen Zeichenkettenattributnamen, der nicht tatsächlich ein zugeordnetes Attribut ist, wie z. B. ein reiner Python-Deskriptor, einen nicht informativen AttributeError auslöste; jetzt wird eine aussagekräftige Fehlermeldung ausgegeben.
Referenzen: #4589
engine¶
[engine] [bug] ¶
Problem behoben, bei dem ein nicht-Zeichenketten-Objekt, das an
SQLAlchemyErroroder eine Unterklasse gesendet wurde, wie es bei einigen Drittanbieter-Dialekten vorkommt, nicht korrekt in eine Zeichenkette umgewandelt werden konnte. Pull-Request von Andrzej Bartosiński.Referenzen: #5599
[engine] [bug] ¶
Ein Funktionsimport, der das standardmäßige späte Importsystem von SQLAlchemy im Modul sqlalchemy.exc nicht verwendete, wurde repariert.
Referenzen: #5632
sql¶
[sql] [bug] ¶
Problem behoben, bei dem die
pickle.dumps()Operation gegen dieOver-Konstruktion zu einem Rekursionsfehler führte.Referenzen: #5644
[sql] [bug] ¶
Problem behoben, bei dem kein Fehler ausgelöst wurde, wenn eine
column()zu mehr als einertable()gleichzeitig hinzugefügt wurde. Dies wurde für die ObjekteColumnundTablekorrekt gemeldet. Wenn dies auftritt, wird jetzt einArgumentErrorausgelöst.Referenzen: #5618
postgresql¶
[postgresql] [usecase] ¶
Das psycopg2-Dialekt unterstützt nun Mehrfachverbindungen zu PostgreSQL-Hosts, indem Host-/Port-Kombinationen an die Abfragezeichenkette übergeben werden. Pull-Request von Ramon Williams.
Siehe auch
Referenzen: #4392
[postgresql] [bug] ¶
Die Methoden
Comparator.any()undComparator.all()wurden angepasst, um eine direkte "NOT"-Operation zur Negation zu implementieren, anstatt den Vergleichsoperator zu negieren.Referenzen: #5518
[postgresql] [bug] ¶
Problem behoben, bei dem der Typ
ENUMdie Schematranslationszuordnung nicht konsultierte, wenn CREATE TYPE oder DROP TYPE ausgegeben wurde, um zu prüfen, ob der Typ existiert oder nicht. Zusätzlich wurde ein Problem behoben, bei dem, wenn dasselbe Enum mehrmals in einer einzigen DDL-Sequenz auftrat, die "Prüfungs"-Abfrage wiederholt ausgeführt wurde, anstatt sich auf einen gecachten Wert zu verlassen.Referenzen: #5520
mysql¶
[mysql] [usecase] ¶
Das MySQL-Dialekt wurde angepasst, um funktionale Indexausdrücke korrekt zu klammern, wie sie von MySQL 8 akzeptiert werden. Pull-Request von Ramon Williams.
Referenzen: #5462
[mysql] [change] ¶
Neue MySQL-reservierte Wörter hinzugefügt:
cube,lateral, die in MySQL 8.0.1 bzw. 8.0.14 hinzugefügt wurden; dies bedeutet, dass diese Begriffe zitiert werden, wenn sie als Tabellen- oder Spaltenbezeichner verwendet werden.Referenzen: #5539
[mysql] [bug] ¶
Das Schlüsselwort "skip_locked", das mit
with_for_update()verwendet wird, gibt eine Warnung aus, wenn es auf MariaDB-Backends verwendet wird, und wird dann ignoriert. Dies ist ein veraltetes Verhalten, das in SQLAlchemy 1.4 zu einem Fehler führt, da eine Anwendung, die "skip locked" anfordert, eine nicht-blockierende Operation sucht, die auf diesen Backends nicht verfügbar ist.Referenzen: #5568
[mysql] [bug] ¶
Problem behoben, bei dem eine UPDATE-Anweisung für einen JOIN im MySQL-Multi-Table-Format die Tabellenpräfix für die Zieltabelle nicht enthielt, wenn die Anweisung keine WHERE-Klausel hatte, da nur die WHERE-Klausel gescannt wurde, um zu diesem Zeitpunkt einen "Multi-Table-Update" zu erkennen. Das Ziel wird nun auch gescannt, wenn es sich um einen JOIN handelt, um die linkeste Tabelle als Haupttabelle und die zusätzlichen Einträge als zusätzliche FROM-Einträge zu erhalten.
Referenzen: #5617
mssql¶
tests¶
misc¶
[bug] [pool] ¶
Problem behoben, bei dem die folgenden Pool-Parameter nicht an den neuen Pool übergeben wurden, der beim Aufruf von
Engine.dispose()erstellt wurde:pre_ping,use_lifo. Zusätzlich werden die Parameterrecycleundreset_on_returnnun für die KlasseAssertionPoolweitergegeben.Referenzen: #5582
[bug] [associationproxy] [ext] ¶
Eine aussagekräftige Fehlermeldung wird nun ausgegeben, wenn versucht wird, ein Assoziations-Proxy-Element als einfache Spaltenexpression zu verwenden, die ausgewählt oder in einer SQL-Funktion verwendet werden soll; dieser Anwendungsfall wird derzeit nicht unterstützt.
1.3.19¶
Veröffentlicht: 17. August 2020orm¶
[orm] [usecase] ¶
Das Verhalten des Zugriffs
Mapper.all_orm_descriptors()wurde angepasst, um die Attribute in der Reihenfolge darzustellen, in der sie deterministisch angeordnet sind, unter der Annahme der Verwendung von Python 3.6 oder höher, das die Sortierreihenfolge von Klassenattributen basierend auf ihrer Deklaration beibehält. Diese Sortierung ist jedoch nicht garantiert, dass sie in allen Fällen der deklarierten Reihenfolge der Attribute entspricht; siehe die Methodendokumentation für das genaue Schema.Referenzen: #5494
orm declarative¶
[orm] [declarative] [usecase] ¶
Der Name der virtuellen Spalte, die bei der Verwendung der Klassen
AbstractConcreteBaseundConcreteBaseverwendet wird, kann nun angepasst werden, um Modelle zu ermöglichen, die eine Spalte mit dem Namentypehaben. Pull-Request von Jesse-Bakker.Referenzen: #5513
sql¶
[sql] [bug] ¶
Ein Problem wurde behoben, bei dem die Klausel "ORDER BY", die einen Labelnamen anstelle eines vollständigen Ausdrucks rendert, was besonders für SQL Server wichtig ist, in einigen Fällen nicht funktionierte, wenn der Ausdruck in einer geklammerten Gruppierung eingeschlossen war. Dieser Fall wurde in die Testunterstützung aufgenommen. Die Änderung passt zusätzlich das Verhalten der ORM-Abfrage "automatisch ORDER BY-Spalten hinzufügen, wenn DISTINCT vorhanden ist", das in 1.4 veraltet ist, an, um Spaltenausdrücke, die bereits vorhanden sind, genauer zu erkennen.
Referenzen: #5470
[sql] [bug] [datatypes] ¶
Die Fehlermeldung
LookupErrorliefert dem Benutzer nun bis zu vier mögliche Werte, auf die eine Spalte überEnumbeschränkt ist. Werte, die länger als 11 Zeichen sind, werden abgeschnitten und durch Ellipsen ersetzt. Pull-Request von Ramon Williams.Referenzen: #4733
[sql] [bug] ¶
Problem behoben, bei dem die Funktion
Connection.execution_options.schema_translate_mapnicht wirkte, wenn die FunktionSequence.next_value()für eineSequenceim ParameterColumn.server_defaultverwendet und die CREATE TABLE DDL ausgegeben wurde.Referenzen: #5500
postgresql¶
[postgresql] [bug] ¶
Problem behoben, bei dem der Rückgabetyp für die verschiedenen RANGE-Vergleichsoperatoren selbst der gleiche RANGE-Typ war und nicht BOOLEAN, was zu einem unerwünschten Ergebnis führte, wenn ein
TypeDecorator, der ergebnisverarbeitendes Verhalten definierte, verwendet wurde. Pull-Request von Jim Bosch.Referenzen: #5476
mysql¶
[mysql] [usecase] ¶
Das MySQL-Dialekt rendert FROM DUAL für eine SELECT-Anweisung, die keine FROM-Klausel hat, aber eine WHERE-Klausel. Dies ermöglicht die Verwendung von Abfragen wie "SELECT 1 WHERE EXISTS (subquery)" sowie anderer Anwendungsfälle.
Referenzen: #5481
[mysql] [bug] ¶
Problem behoben, bei dem CREATE TABLE-Anweisungen das COLLATE-Schlüsselwort nicht korrekt angaben.
Referenzen: #5411
[mysql] [bug] ¶
MariaDB-Code 1927 wurde zu den "Disconnect"-Codes hinzugefügt, da neuere MariaDB-Versionen anscheinend diesen Code verwenden, wenn der Datenbankserver gestoppt wurde.
Referenzen: #5493
sqlite¶
[sqlite] [bug] [mssql] [reflection] ¶
Eine Überprüfung aller enthaltenen Dialekte wurde durchgeführt, um sicherzustellen, dass Namen, die einfache oder doppelte Anführungszeichen enthalten, beim Abfragen von Systemtabellen ordnungsgemäß escaped werden, für alle
Inspector-Methoden, die Objektnamen als Argument akzeptieren (z. B. Tabellennamen, View-Namen usw.). SQLite und MSSQL enthielten zwei Quoting-Probleme, die behoben wurden.Referenzen: #5456
mssql¶
misc¶
1.3.18¶
Veröffentlicht: 25. Juni 2020orm¶
[orm] [usecase] ¶
Verbesserte Fehlermeldung bei Verwendung von
Query.filter_by()in einer Abfrage, bei der die erste Entität keine zugeordnete Klasse ist.Referenzen: #5326
[orm] [usecase] ¶
Neuer Parameter
query_expression.default_exprzur Konstruktionquery_expression()hinzugefügt, der automatisch auf Abfragen angewendet wird, wenn die Optionwith_expression()nicht verwendet wird. Pull-Request von Haoyu Sun.Referenzen: #5198
examples¶
[examples] [change] ¶
Neue Option
--rawzur Performance-Suite der Beispiele hinzugefügt, die das rohe Profil-Testergebnis für die Verwendung durch beliebige Profiling-Visualisierungswerkzeuge ausgibt. Die Option "runsnake" wurde entfernt, da runsnake derzeit schwer zu erstellen ist.
engine¶
[engine] [bug] ¶
Weitere Verfeinerungen der Korrekturen für den "reset"-Agenten, der in #5326 behoben wurde, der nun eine Warnung ausgibt, wenn er nicht korrekt aufgerufen wird, und das Verhalten korrigiert. Zusätzliche Szenarien, in denen diese Warnung ausgegeben wurde, wurden identifiziert und behoben.
Referenzen: #5326
[engine] [bug] ¶
Problem mit dem Objekt
URLbehoben, bei dem die Stringifizierung des Objekts spezielle Zeichen nicht URL-codierte, was verhinderte, dass die URL wieder als echte URL konsumiert werden konnte. Pull-Request von Miguel Grinberg.Referenzen: #5341
sql¶
[sql] [usecase] ¶
Der Konstruktion
table()wurde ein Parameter ".schema" hinzugefügt, der es Ad-hoc-Tabellenausdrücken ermöglicht, auch einen Schemanamen zu enthalten. Pull-Request von Dylan Modesitt.Referenzen: #5309
[sql] [change] [sybase] ¶
Unterstützung für
.offsetfür das Sybase-Dialekt hinzugefügt. Pull-Request von Alan D. Snow.Referenzen: #5294
[sql] [bug] ¶
Selbstgruppierung in Elementen von
type_coercekorrekt angewendet.Das
type_coerce-Element wendete keine Gruppierungsregeln korrekt an, wenn es in einem Ausdruck verwendet wurde.Referenzen: #5344
[sql] [bug] ¶
Die Ausgabe von
Select.with_hint()wurde in die generische SQL-Zeichenkette aufgenommen, die beim Aufruf vonstr()auf eine Anweisung erzeugt wird. Zuvor wurde diese Klausel unter der Annahme, dass sie dialektspezifisch ist, weggelassen. Der Hinweistext wird in Klammern angezeigt, um anzuzeigen, dass die Wiedergabe solcher Hinweise je nach Backend variiert.Referenzen: #5353
[sql] [schema] ¶
Einführung von
IdentityOptionszum Speichern gemeinsamer Parameter für Sequenzen und Identitätsspalten.Referenzen: #5324
schema¶
mysql¶
sqlite¶
[sqlite] [usecase] ¶
SQLite 3.31 fügte Unterstützung für berechnete Spalten hinzu. Diese Änderung ermöglicht deren Unterstützung in SQLAlchemy bei der Ausrichtung auf SQLite.
Referenzen: #5297
[sqlite] [bug] ¶
„exists“ wurde der Liste der reservierten Wörter für SQLite hinzugefügt, damit dieses Wort bei Verwendung als Bezeichnung oder Spaltenname maskiert wird. Pull Request von Thodoris Sotiropoulos.
Referenzen: #5395
mssql¶
[mssql] [change] ¶
Die Anforderung
supports_sane_rowcount_returning = Falsewurde von der EbenePyODBCConnectorzur EbeneMSDialect_pyodbcverschoben, da pyodbc unter bestimmten Umständen korrekt funktioniert.Referenzen: #5321
[mssql] [bug] ¶
Die Logik, die vom SQL Server-Dialekt verwendet wird, um mehrteilige Schemanamen mit vielen Punkten zu interpretieren, wurde verfeinert, sodass keine Punkte verloren gehen, wenn der Name keine Klammern oder Maskierung verwendet. Außerdem wird ein „dbname“-Token unterstützt, das viele Teile enthält und mehrere, unabhängig maskierte Abschnitte haben kann.
[mssql] [bug] [pyodbc] ¶
Ein Problem im pyodbc-Konnektor wurde behoben, bei dem eine Warnung bezüglich des pyodbc „drivername“ ausgegeben wurde, wenn eine vollständig leere URL verwendet wurde. Leere URLs sind normal, wenn ein nicht verbundener Dialektobjekt erzeugt wird oder wenn das Argument „creator“ von create_engine() verwendet wird. Die Warnung wird nun nur ausgegeben, wenn der Treibername fehlt, aber andere Parameter noch vorhanden sind.
Referenzen: #5346
[mssql] [bug] ¶
Problem bei der Zusammenstellung der ODBC-Verbindungszeichenfolge für den pyodbc DBAPI behoben. Tokens, die Semikolons und/oder geschweifte Klammern „{}“ enthielten, wurden nicht korrekt maskiert, was dazu führte, dass der ODBC-Treiber die Verbindungszeichenfolgenattribute falsch interpretierte.
Referenzen: #5373
[mssql] [bug] ¶
Problem behoben, bei dem
datetime.time-Parameter indatetime.datetimekonvertiert wurden, was sie für Vergleiche wie>=gegen eine tatsächlicheTIME-Spalte inkompatibel machte.Referenzen: #5339
[mssql] [bug] ¶
Ein Problem wurde behoben, bei dem die Funktion
is_disconnectim SQL Server pyodbc-Dialekt den Trennungsstatus falsch meldete, wenn die Fehlermeldung eine Teilzeichenfolge enthielt, die einem SQL Server ODBC-Fehlercode entsprach.Referenzen: #5359
oracle¶
[oracle] [bug] [reflection] ¶
Fehler im Oracle-Dialekt behoben, bei dem Indizes, die die vollständige Menge der Primärschlüsselspalten enthielten, fälschlicherweise als der Primärschlüsselindex selbst angesehen wurden, der auch dann ausgelassen wurde, wenn es mehrere gab. Die Prüfung wurde verfeinert, um den Namen der Primärschlüsselbeschränkung mit dem Indexnamen selbst zu vergleichen, anstatt zu versuchen, basierend auf den im Index vorhandenen Spalten zu raten.
Referenzen: #5421
1.3.17¶
Veröffentlicht: 13. Mai 2020orm¶
[orm] [usecase] ¶
Ein Zugriffselement
Comparator.expressionswurde hinzugefügt, das Zugriff auf die Gruppe von Spalten bietet, die unter einem mehrspaltigenColumnProperty-Attribut zugeordnet sind.Referenzen: #5262
[orm] [usecase] ¶
Einführung des Flags
relationship.sync_backrefin einer Beziehung, um zu steuern, ob die Synchronisierungsereignisse, die die In-Python-Attribute verändern, hinzugefügt werden. Dies ersetzt die vorherige Änderung #5149, die davor warnte, dass das Ziel einerviewonly=True-Beziehung einerback_populates- oderbackref-Konfiguration nicht zulässig sein würde.Referenzen: #5237
[orm] [bug] ¶
Fehler behoben, bei dem die Verwendung von
with_polymorphic()als Ziel eines Joins überRelationshipComparator.of_type()auf einem Mapper, der bereits eine Subquery-basiertewith_polymorphic-Einstellung hat, die mit der angeforderten äquivalent ist, die ON-Klausel im Join nicht korrekt aliasen würde.Referenzen: #5288
[orm] [bug] ¶
Problem im Bereich, wo Ladeoptionen wie
selectinload()mit dem „baked query“-System interagieren, wurde behoben, sodass das Caching einer Abfrage nicht erfolgen soll, wenn die Ladeoptionen selbst Elemente wiewith_polymorphic()-Objekte enthalten, die derzeit nicht cache-kompatibel sind. Der „baked loader“ konnte sich in einigen dieser Szenarien manchmal nicht vollständig selbst invalidieren, was zu fehlenden eager loads führte.Referenzen: #5303
[orm] [bug] ¶
Die interne Implementierung des „identity set“, eines Sets, das Objekte auf Basis ihrer
id()anstatt ihrer Hash-Werte hasht, wurde so modifiziert, dass die Methode__hash__()der Objekte, die typischerweise benutzerdefinierte abgebildete Objekte sind, nicht mehr aufgerufen wird. Einige Methoden riefen diese Methode als Nebeneffekt der Implementierung auf.Referenzen: #5304
[orm] [bug] ¶
Eine informative Fehlermeldung wird ausgegeben, wenn ein ORM Many-to-One-Vergleich gegen ein Objekt versucht wird, das keine tatsächliche abgebildete Instanz ist. Vergleiche wie die mit Scalar-Subqueries werden nicht unterstützt; ein verallgemeinerter Vergleich mit Subqueries wird besser mit
Comparator.has()erreicht.Referenzen: #5269
engine¶
[engine] [bug] ¶
Ein kritischer Fehler wurde behoben, bei dem die DBAPI-Verbindung noch im nicht zurückgerollten Zustand an den Connection-Pool zurückgegeben werden konnte. Der für die Rückrollung der Verbindung verantwortliche Reset-Agent konnte beschädigt werden, wenn die Transaktion „geschlossen“ wurde, ohne zurückgerollt oder committet zu werden. Dies kann in einigen Szenarien bei der Verwendung von ORM-Sessions und beim Aufrufen von .close() in einem bestimmten Muster, das Savepoints beinhaltet, auftreten. Die Korrektur stellt sicher, dass der Reset-Agent immer aktiv ist.
Referenzen: #5326
schema¶
[schema] [bug] ¶
Problem behoben, bei dem ein
Index, dessen Zuordnung zu einer Tabelle verzögert wurde, z. B. wenn er eineColumnenthielt, die noch keinerTablezugeordnet war, nicht korrekt angehängt werden konnte, wenn er außerdem einen nicht tabellenorientierten Ausdruck enthielt.Referenzen: #5298
[schema] [bug] ¶
Eine Warnung wird ausgegeben, wenn das Attribut
MetaData.sorted_tablessowie die Funktionsort_tables()verwendet werden und die gegebenen Tabellen aufgrund einer zyklischen Abhängigkeit zwischen Fremdschlüsselbeschränkungen nicht korrekt sortiert werden können. In diesem Fall werden die beteiligten Tabellen nicht mehr nach Fremdschlüssel sortiert und eine Warnung wird ausgegeben. Andere Tabellen, die nicht Teil des Zyklus sind, werden weiterhin in Abhängigkeitsreihenfolge zurückgegeben. Zuvor gab die Routinesorted_tableeine Sammlung zurück, die alle Fremdschlüssel bedingungslos wegließ, wenn ein Zyklus erkannt wurde, und keine Warnung ausgab.Referenzen: #5316
[schema] ¶
Das Attribut
commentwurde zur__repr__-Methode derColumnhinzugefügt.Referenzen: #4138
postgresql¶
[postgresql] [usecase] ¶
Unterstützung für Spalten oder Typen
ARRAYvonEnum,JSONoderJSONBin PostgreSQL hinzugefügt. Zuvor war in diesen Anwendungsfällen eine Umgehung erforderlich.Referenzen: #5265
[postgresql] [usecase] ¶
Eine explizite
CompileErrorwird ausgelöst, wenn eine Tabelle mit einer Spalte vom TypARRAYvonEnumhinzugefügt wird, die mitEnum.native_enumaufFalsekonfiguriert ist, wennEnum.create_constraintnicht aufFalsegesetzt ist.Referenzen: #5266
mssql¶
[mssql] [bug] [reflection] ¶
Eine Regression, die durch die Spiegelung von berechneten Spalten in MSSQL bei Verwendung der Legacy-TDS-Version 4.2 eingeführt wurde, wurde behoben. Der Dialekt versucht, die Protokollversion bei der ersten Verbindung zu erkennen und im Kompatibilitätsmodus zu arbeiten, wenn er sie nicht erkennen kann.
Referenzen: #5255
[mssql] [bug] [reflection] ¶
Eine Regression, die durch die Spiegelung von berechneten Spalten in MSSQL bei Verwendung von SQL Server-Versionen vor 2012 eingeführt wurde, wurde behoben, da diese die Funktion
concatnicht unterstützen.Referenzen: #5271
oracle¶
[oracle] [bug] ¶
Einige Änderungen daran, wie der cx_oracle-Dialekt per-Spalten-Ausgabetyp-Handler für LOB und numerische Datentypen einrichtet, um potenzielle Änderungen in cx_Oracle 8 zu berücksichtigen.
Referenzen: #5246
[oracle] [bug] [performance] ¶
Die Implementierung des Abrufens von CLOB- und BLOB-Objekten wurde geändert, um die native Implementierung von cx_Oracle zu verwenden, die CLOB/BLOB-Objekte inline mit anderen Ergebnisspalten abruft, anstatt einen separaten Abruf durchzuführen. Wie immer kann dies durch Setzen von
auto_convert_lobsaufFalsedeaktiviert werden.Als Teil dieser Änderung gibt das Verhalten eines CLOBs, dem beim INSERT ein leerer String zugewiesen wurde, beim SELECT nun None zurück, was nun mit VARCHAR in Oracle konsistent ist.
Referenzen: #5314
misc¶
1.3.16¶
Veröffentlicht: 7. April 2020orm¶
[orm] [performance] ¶
Die von subqueryload und selectinload verwendeten Abfragen wurden so geändert, dass sie nicht mehr nach dem Primärschlüssel der übergeordneten Entität sortiert werden. Diese Sortierung diente dazu, die eingehenden Zeilen direkt mit einem minimalen Maß an Python-seitiger Sortierung in Listen zu kopieren. Diese ORDER BY-Klauseln können jedoch die Leistung der Abfrage negativ beeinflussen, da in vielen Szenarien diese Spalten aus einer Subquery abgeleitet sind oder anderweitig keine tatsächlichen Primärschlüsselspalten sind, sodass SQL-Planer Indizes nicht nutzen können. Die Python-seitige Sortierung verwendet das native itertools.group_by() zum Sortieren der eingehenden Zeilen und wurde so modifiziert, dass mehrere Zeilengruppen pro Elternteil mit list.extend() zusammengefügt werden können, was immer noch eine relativ schnelle Python-seitige Leistung ermöglicht. Es wird immer noch eine ORDER BY für eine Beziehung vorhanden sein, die einen expliziten order_by-Parameter enthält, dies ist jedoch die einzige ORDER BY, die für beide Ladetypen zur Abfrage hinzugefügt wird.
Referenzen: #5162
[orm] [bug] ¶
Fehler in der Ladeoption
selectinload()behoben, bei der zwei oder mehr Lader, die unterschiedliche Beziehungen mit demselben String-Schlüsselnamen repräsentieren, wie von einer einzelnenwith_polymorphic()-Konstruktion mit mehreren Unterklassen-Mappern referenziert werden, dazu neigten, jede Subquery-Ladung separat aufzurufen, anstatt einen einzelnen String-basierten Slot zu verwenden, der die anderen Lader daran hinderte, aufgerufen zu werden.Referenzen: #5228
[orm] [bug] ¶
Problem behoben, bei dem ein Lazyload, der sessionslokales „get“ gegen eine Ziel-Many-to-One-Beziehung verwendet, bei der ein Objekt mit dem richtigen Primärschlüssel vorhanden ist, aber eine Instanz einer Geschwisterklasse ist, nicht korrekt None zurückgibt, wie es der Fall ist, wenn der Lazy-Lader tatsächlich eine Ladung für diese Zeile ausgibt.
Referenzen: #5210
orm declarative¶
[orm] [declarative] [bug] ¶
Das String-Argument, das als erstes positionelles Argument von der Funktion
relationship()bei Verwendung der Declarative API akzeptiert wird, wird nicht mehr mithilfe der Python-Funktioneval()interpretiert; stattdessen wird der Name punktgetrennt und die Namen werden direkt im Namensauflösungsdictionary nachgeschlagen, ohne den Wert als Python-Ausdruck zu behandeln. Das Übergeben eines String-Arguments an die anderenrelationship()-Parameter, die zwingend Python-Ausdrücke akzeptieren müssen, verwendet weiterhineval(); die Dokumentation wurde klargestellt, um sicherzustellen, dass keine Mehrdeutigkeit besteht, dass dies verwendet wird.Siehe auch
Auswertung von Beziehungsargumenten – Details zur String-Auswertung
Referenzen: #5238
sql¶
schema¶
[schema] [reflection] ¶
Unterstützung für die Spiegelung von „berechneten“ Spalten hinzugefügt, die nun als Teil der von
Inspector.get_columns()zurückgegebenen Struktur zurückgegeben werden. Bei der Spiegelung vollständigerTable-Objekte werden berechnete Spalten mithilfe derComputed-Konstruktion dargestellt.Referenzen: #5063
postgresql¶
[postgresql] [bug] ¶
Problem behoben, bei dem ein „covering“ Index (z. B. mit INCLUDE-Klausel) so gespiegelt wurde, dass alle Spalten in der INCLUDE-Klausel als reguläre Spalten enthalten waren. Eine Warnung wird nun ausgegeben, wenn diese zusätzlichen Spalten erkannt werden, die darauf hinweisen, dass sie derzeit ignoriert werden. Beachten Sie, dass die vollständige Unterstützung für „covering“ Indizes Teil von #4458 ist. Pull Request von Marat Sharafutdinov.
Referenzen: #5205
mysql¶
[mysql] [bug] ¶
Problem im MySQL-Dialekt behoben: Beim Verbinden mit einer Pseudo-MySQL-Datenbank wie der von ProxySQL bereitgestellten, verhindert die anfängliche Überprüfung des Isolationslevels, wenn sie keine Zeile zurückgibt, nicht, dass der Dialekt die Verbindung fortsetzt. Eine Warnung wird ausgegeben, dass das Isolationslevel nicht ermittelt werden konnte.
Referenzen: #5239
sqlite¶
mssql¶
[mssql] [usecase] [mysql] [oracle] ¶
Unterstützung für
ColumnOperators.is_distinct_from()undColumnOperators.isnot_distinct_from()für SQL Server, MySQL und Oracle hinzugefügt.Referenzen: #5137
oracle¶
[oracle] [usecase] ¶
AUTOCOMMIT-Isolationslevel für Oracle bei Verwendung von cx_Oracle implementiert. Ebenfalls wurde ein fester Standard-Isolationslevel von READ COMMITTED für Oracle hinzugefügt.
Referenzen: #5200
[oracle] [bug] [reflection] ¶
Regression / falsche Korrektur, die durch die Korrektur für #5146 verursacht wurde, wurde behoben, bei der der Oracle-Dialekt aus der Sicht „all_tab_comments“ liest, um Tabellenkommentare zu erhalten, aber nicht berücksichtigt, dass der aktuelle Besitzer der angeforderten Tabelle fehlt, was dazu führt, dass der falsche Kommentar gelesen wird, wenn mehrere Tabellen mit demselben Namen in mehreren Schemata existieren.
Referenzen: #5146
tests¶
misc¶
[enum] [types] ¶
Der
Enum-Typ unterstützt nun den ParameterEnum.length, um die Länge der VARCHAR-Spalte anzugeben, die beim Verwenden von nicht-nativen Enums durch Setzen vonEnum.native_enumaufFalseerstellt wird.Referenzen: #5183
[installer] ¶
Sichergestellt, dass die Datei „pyproject.toml“ nicht in Builds enthalten ist, da die Anwesenheit dieser Datei pip anweist, einen PEP-517-Installationsprozess zu verwenden. Da dieser Betriebsmodus von aktuellen Tools/Distributionen anscheinend nicht gut unterstützt wird, werden diese Probleme im Rahmen der SQLAlchemy-Installation durch Weglassen der Datei vermieden.
Referenzen: #5207
1.3.15¶
Veröffentlicht: 11. März 2020orm¶
[orm] [bug] ¶
Die Fehlermeldung, die von
Query.join()ausgegeben wird, wenn eine linke Seite nicht gefunden werden kann, wurde angepasst, sodass die MethodeQuery.select_from()der beste Weg ist, das Problem zu lösen. Außerdem wurde innerhalb der 1.3-Serie eine deterministische Reihenfolge bei der Bestimmung der FROM-Klausel aus einer gegebenen Spaltenentität, die anQueryübergeben wird, verwendet, sodass der gleiche Ausdruck jedes Mal bestimmt wird.Referenzen: #5194
[orm] [bug] ¶
Regression in 1.3.14 aufgrund von #4849 behoben, bei der ein Aufruf von
sys.exc_info()bei einem Flush-Fehler nicht korrekt aufgerufen wurde. Testabdeckung wurde für diesen Ausnahmefall hinzugefügt.Referenzen: #5196
1.3.14¶
Veröffentlicht: 10. März 2020general¶
[general] [bug] [py3k] ¶
Ein expliziter „cause“ (Ursache) wurde den meisten, wenn nicht allen intern ausgelösten Ausnahmen hinzugefügt, die aus einem internen Ausnahme-Catching ausgelöst werden, um irreführende Stack-Traces zu vermeiden, die auf einen Fehler bei der Behandlung einer Ausnahme hindeuten. Obwohl es vorzuziehen wäre, die intern gefangene Ausnahme so zu unterdrücken, wie es das Attribut
__suppress_context__tun würde, gibt es anscheinend noch keinen Weg, dies zu tun, ohne einen umschließenden benutzerdefinierten Kontext zu unterdrücken. Daher wird die intern gefangene Ausnahme vorerst als Ursache offengelegt, damit alle Informationen über den Kontext des Fehlers erhalten bleiben.Referenzen: #4849
orm¶
[orm] [usecase] ¶
Ein neues Flag
InstanceEvents.restore_load_contextundSessionEvents.restore_load_contextwurde hinzugefügt, die für die EreignisseInstanceEvents.load(),InstanceEvents.refresh()undSessionEvents.loaded_as_persistent()gelten. Wenn dieses Flag gesetzt ist, wird der „load context“ des Objekts nach dem Aufruf des Event-Hooks wiederhergestellt. Dies stellt sicher, dass das Objekt innerhalb des „loader context“ der bereits laufenden Ladeoperation verbleibt, anstatt aufgrund von Refresh-Operationen, die im Event aufgetreten sein mögen, in einen neuen Ladekontext übertragen zu werden. Es wird nun eine Warnung ausgegeben, wenn diese Bedingung auftritt, die die Verwendung des Flags zur Behebung dieses Falls empfiehlt. Das Flag ist „opt-in“, sodass bestehenden Anwendungen kein Risiko entsteht.Die Änderung fügt außerdem Unterstützung für das Flag
raw=Truefür Session-Lifecycle-Ereignisse hinzu.Referenzen: #5129
[orm] [bug] ¶
Behobener Regressionfehler, der in 1.3.13 durch #5056 verursacht wurde, bei dem eine Umgestaltung des ORM-Pfadregistrierungssystems dazu führte, dass ein Pfad nicht mehr mit einem leeren Tupel verglichen werden konnte, was in einer bestimmten Art von joined eager loading Pfaden auftreten kann. Der Anwendungsfall "leeres Tupel" wurde gelöst, sodass der Pfadregistry mit einem Pfadregistry in allen Fällen verglichen wird; das
PathRegistryObjekt selbst implementiert nun die Methoden__eq__()und__ne__(), die bei allen Gleichheitsvergleichen greifen und auch in dem nicht erwarteten Fall, dass ein Nicht-PathRegistryObjekt verglichen wird, weiterhin erfolgreich sind, wobei eine Warnung ausgegeben wird, dass dieses Objekt nicht Gegenstand des Vergleichs sein sollte.Referenzen: #5110
[orm] [bug] ¶
Das Setzen einer Beziehung auf viewonly=True, die auch das Ziel einer back_populates- oder backref-Konfiguration ist, gibt nun eine Warnung aus und wird zukünftig nicht mehr zulässig sein. back_populates bezieht sich speziell auf die Mutation eines Attributs oder einer Sammlung, was nicht zulässig ist, wenn das Attribut viewonly=True unterliegt. Das viewonly-Attribut unterliegt keinen Persistenzverhalten, was bedeutet, dass es keine korrekten Ergebnisse widerspiegelt, wenn es lokal mutiert wird.
Referenzen: #5149
[orm] [bug] ¶
Behobene weitere Regression im selben Bereich wie #5080, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine joined Option über ein
with_polymorphic()auf die Basisklasse dieser with_polymorphic und dann weiter auf reguläre gemappte Beziehungen zu erstellen, fehlschlug, da die Basisklassenkomponente sich nicht auf dem Pfad zum Laden hinzufügte, auf dem sie vom Laderstrategie gefunden werden konnte. Die in #5080 angewendeten Änderungen wurden weiter verfeinert, um auch dieses Szenario abzudecken.Referenzen: #5121
engine¶
[engine] [bug] ¶
Erweiterte den Geltungsbereich der Cursor-/Verbindungsbereinigung, wenn eine Anweisung ausgeführt wird, um Fälle einzuschließen, in denen das Ergebnisobjekt nicht konstruiert werden kann, ein after_cursor_execute() Ereignis einen Fehler auslöst oder autocommit / autoclose fehlschlägt. Dies ermöglicht die Bereinigung des DBAPI-Cursors bei Fehlern und ermöglicht bei verbindungsloser Ausführung das Schließen der Verbindung und Rückgabe an den Connection Pool, während sie zuvor bis zur Auslösung der Garbage Collection auf eine Poolrückgabe wartete.
Referenzen: #5182
sql¶
[sql] [bug] [postgresql] ¶
Behobener Fehler, bei dem eine CTE eines INSERT/UPDATE/DELETE, die auch RETURNING verwendet, nicht direkt ausgewählt werden konnte, da der interne Zustand des Compilers versuchte, die äußere SELECT-Anweisung selbst als DELETE-Anweisung zu behandeln und auf nicht vorhandenen Zustand zuzugreifen.
Referenzen: #5181
postgresql¶
[postgresql] [bug] ¶
Behobenes Problem, bei dem das "schema_translate_map"-Feature mit einem nativen PostgreSQL-Enumerationstyp (d.h.
Enum,ENUM) nicht funktionierte, da zwar die "CREATE TYPE"-Anweisung mit dem richtigen Schema ausgegeben wurde, das Schema jedoch in der CREATE TABLE-Anweisung zum Zeitpunkt der Referenzierung der Enumeration nicht gerendert wurde.Referenzen: #5158
[postgresql] [bug] [reflection] ¶
Behobener Fehler, bei dem die PostgreSQL-Reflektion von CHECK-Constraints die Einschränkung nicht parsen konnte, wenn der SQL-Text Zeilenumbrüche enthielt. Der reguläre Ausdruck wurde angepasst, um diesen Fall zu berücksichtigen. Pull Request von Eric Borczuk.
Referenzen: #5170
mysql¶
[mysql] [bug] ¶
Behobenes Problem in der MySQL
Insert.on_duplicate_key_update()-Konstruktion, bei der die Verwendung einer SQL-Funktion oder eines anderen zusammengesetzten Ausdrucks für ein Spaltenargument das SchlüsselwortVALUES, das die Spalte selbst umschließt, nicht korrekt gerendert hätte.Referenzen: #5173
mssql¶
[mssql] [bug] ¶
Behobenes Problem, bei dem der
DATETIMEOFFSET-Typ denNone-Wert nicht berücksichtigte, der als Teil der Fixes für diesen Typ eingeführt wurde, der erstmals in #4983, #5045 eingeführt wurde. Zusätzlich wurde die Unterstützung für die Übergabe eines Backend-spezifischen, Datums-formatierten Strings über diesen Typ hinzugefügt, wie es für Datums-/Zeit-Typen auf den meisten anderen DBAPIs üblich ist.Referenzen: #5132
oracle¶
misc¶
[usecase] [ext] ¶
Schlüsselwortargumente wurden der Funktion
MutableList.sort()hinzugefügt, sodass eine Schlüsselfunktion sowie das Schlüsselwortargument "reverse" übergeben werden können.Referenzen: #5114
[bug] [performance] ¶
Überarbeitete eine interne Änderung am Testsystem, die als Ergebnis von #5085 hinzugefügt wurde, bei der ein auf das Dialekt bezogenes Testmodul bedingungslos geladen wurde, wenn dieses Dialekt verwendet wurde, wodurch das Testframework von SQLAlchemy und auch der ORM in den Modulimportraum gezogen wurden. Dies beeinträchtigte nur die anfängliche Startzeit und den Speicherbedarf in moderatem Umfang, es ist jedoch am besten, wenn diese zusätzlichen Module nicht von der direkten Core-Nutzung abhängen.
Referenzen: #5180
[bug] [installation] ¶
Die Funktion
inspect.formatannotationwurde insqlalchemy.util.compateingebunden, die für die eingebundene Version voninspect.formatargspecbenötigt wird. Die Funktion ist in cPython nicht dokumentiert und ihre Verfügbarkeit in zukünftigen Python-Versionen ist nicht garantiert.Referenzen: #5138
1.3.13¶
Veröffentlicht: 22. Januar 2020orm¶
[orm] [performance] ¶
Identifiziertes Performanceproblem im System, bei dem ein Join basierend auf einer gemappten Beziehung konstruiert wird. Das Klauselanpassungssystem wurde für die Mehrheit der Join-Ausdrücke verwendet, auch in dem gängigen Fall, in dem keine Anpassung erforderlich ist. Die Bedingungen, unter denen diese Anpassung auftritt, wurden verfeinert, sodass durchschnittliche nicht-aliase Joins über eine einfache Beziehung ohne "sekundäre" Tabelle etwa 70% weniger Funktionsaufrufe benötigen.
[orm] [bug] [engine] ¶
Unterstützung für Tests hinzugefügt und eine Vielzahl von unnötigen Referenzzyklen behoben, die für kurzlebige Objekte erstellt wurden, hauptsächlich im Bereich der ORM-Abfragen. Vielen Dank an Carson Ip für die Hilfe dabei.
[orm] [bug] ¶
Behobene Regression in Loader-Optionen, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine Loader-Option mit
PropComparator.of_type()zu erstellen, die auf eine aliasisierte Entität abzielt, die eine ererbte Unterklasse der Entität ist, auf die sich die vorhergehende Beziehung bezieht, kein passendes Pfad erzeugte. Siehe auch #5082, der in dieser Veröffentlichung behoben wurde und eine ähnliche Art von Problem betrifft.Referenzen: #5107
[orm] [bug] ¶
Behobene Regression im joined eager loading, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine joined Option über ein
with_polymorphic()in eine polymorphe Unterklasse unter Verwendung vonRelationshipProperty.of_type()und dann weiter über reguläre gemappte Beziehungen zu erstellen, fehlschlug, da die polymorphe Unterklasse sich nicht auf dem Pfad zum Laden hinzufügte, auf dem sie vom Laderstrategie gefunden werden konnte. Eine Anpassung wurde vorgenommen, um dieses Szenario zu lösen.Referenzen: #5082
[orm] [bug] ¶
Behobene Warnung im ORM-Flush-Prozess, die nicht durch Testabdeckung abgedeckt war, beim Löschen von Objekten, die das "version_id"-Feature verwenden. Diese Warnung ist im Allgemeinen nicht erreichbar, es sei denn, es wird ein Dialekt verwendet, der das Flag "supports_sane_rowcount" auf False setzt, was typischerweise nicht der Fall ist, aber für einige MySQL-Konfigurationen sowie ältere Firebird-Treiber und wahrscheinlich einige Drittanbieter-Dialekte möglich ist.
Referenzen: #5068
[orm] [bug] ¶
Behobener Fehler, bei dem die Verwendung von joined eager loading die Abfrage innerhalb einer Subquery nicht korrekt umschloss, wenn
Query.group_by()auf die Abfrage angewendet wurde. Wenn irgendeine Art von ergebnisbeschränkender Methode verwendet wird, wie DISTINCT, LIMIT, OFFSET, bettet joined eager loading die zeilenbegrenzte Abfrage in eine Subquery ein, damit die Sammlungsresultate nicht beeinträchtigt werden. Aus irgendeinem Grund wurde die GROUP BY-Klausel nie in dieses Kriterium aufgenommen, obwohl sie einen ähnlichen Effekt wie DISTINCT hat. Zusätzlich verhinderte der Fehler die Verwendung von GROUP BY für eine joined eager load-Abfrage für die meisten Datenbankplattformen, die nicht aggregierte, nicht gruppierte Spalten in der Abfrage verbieten, da die zusätzlichen Spalten für den joined eager load von der Datenbank nicht akzeptiert würden.Referenzen: #5065
engine¶
[engine] [bug] ¶
Behobenes Problem, bei dem die Sammlung von Wertverarbeitern auf einem
Compiled-Objekt mutiert wurde, wenn "expanding IN"-Parameter mit einem Datentyp mit Bindungswertverarbeitern verwendet wurden; dies bedeutete insbesondere, dass bei Verwendung von Statement-Caching und/oder gebackenen Abfragen dieselbe compiled._bind_processors-Sammlung gleichzeitig mutiert wurde. Da diese Prozessoren jedes Mal dieselbe Funktion für einen bestimmten Bindungsparameter-Namensraum waren, gab es keine tatsächlichen negativen Auswirkungen dieses Problems, jedoch sollte die Ausführung einesCompiled-Objekts niemals Zustandsänderungen verursachen, insbesondere da sie threadsicher und wiederverwendbar sein sollen, sobald sie vollständig konstruiert sind.Referenzen: #5048
sql¶
[sql] [usecase] ¶
Eine Funktion, die mit
GenericFunctionerstellt wurde, kann nun angeben, ob der Name der Funktion mit oder ohne Anführungszeichen gerendert werden soll, indem diequoted_name-Konstruktion dem .name-Element des Objekts zugewiesen wird. Vor 1.3.4 wurden Anführungszeichen nie auf Funktionsnamen angewendet, und einige Anführungszeichen wurden in #4467 eingeführt, aber es gab keine Möglichkeit, Anführungszeichen für einen gemischten Namen zu erzwingen. Zusätzlich wird diequoted_name-Konstruktion, wenn sie als Name verwendet wird, ihren Kleinbuchstaben-Namen korrekt im Funktionsregister registrieren, sodass der Name über dasfunc.-Register weiterhin verfügbar ist.Siehe auch
Referenzen: #5079
postgresql¶
[postgresql] [usecase] ¶
Unterstützung für Präfixe für die
CTE-Konstruktion hinzugefügt, um Unterstützung für die PostgreSQL 12 "MATERIALIZED" und "NOT MATERIALIZED" Phrasen zu ermöglichen. Pull Request von Marat Sharafutdinov.Siehe auch
Referenzen: #5040
[postgresql] [bug] ¶
Behobenes Problem, bei dem das PostgreSQL-Dialekt eine reflektierte CHECK-Constraint, die eine boolesche Funktion war (im Gegensatz zu einem booleschen Ausdruck), nicht parsen konnte.
Referenzen: #5039
mssql¶
[mssql] [bug] ¶
Behobenes Problem, bei dem ein zeitzonenbewusster
datetime-Wert, der in einen String für die Verwendung als Parameterwert einerDATETIMEOFFSET-Spalte umgewandelt wurde, die Nachkommastellen ausließ.Referenzen: #5045
tests¶
[tests] [bug] ¶
Einige Testfehler, die unter Windows aufgrund von SQLite-Dateisperrproblemen auftraten, sowie einige Timing-Probleme in Tests im Zusammenhang mit dem Connection Pool wurden behoben; Pull Request von Federico Caselli.
Referenzen: #4946
[tests] [postgresql] ¶
Verbesserte Erkennung der Anforderung von Two-Phase-Transaktionen für die PostgreSQL-Datenbank durch Testen, dass max_prepared_transactions auf einen Wert größer als 0 gesetzt ist. Pull Request von Federico Caselli.
Referenzen: #5057
misc¶
[bug] [ext] ¶
Behobener Fehler in sqlalchemy.ext.serializer, bei dem ein eindeutiges
BindParameter-Objekt mit sich selbst in Konflikt geraten konnte, wenn es in der Abbildung selbst und auch in der Filterbedingung der Abfrage vorhanden war, da eine Seite gegen die nicht deserialisierte Version verwendet wurde und die andere Seite die deserialisierte Version verwendete. Die Logik wurde inBindParameterähnlich wie bei der "clone"-Methode hinzugefügt, die den Parameternamen bei der Deserialisierung eindeutig macht, sodass er nicht mit dem Original in Konflikt gerät.Referenzen: #5086
1.3.12¶
Veröffentlicht: 16. Dezember 2019orm¶
[orm] [bug] ¶
Behobenes Problem mit der
lazy="raise"-Strategie, bei der ein ORM-Löschen eines Objekts für eine einfache Many-to-One-Beziehung vom Typ "use-get", bei der lazy="raise" konfiguriert war, einen Fehler auslöste. Dies ist inkonsistent mit der Änderung in 1.3 im Rahmen von #4353, wo festgelegt wurde, dass eine Historienoperation, die keine SQL-Ausgabe erwartet, dielazy="raise"-Prüfung umgehen sollte und stattdessen effektiv alslazy="raise_on_sql"für diesen Fall behandelt werden sollte. Die Korrektur passt die Lazy-Loader-Strategie an, um in dem Fall, dass der Lazy-Load angewiesen wurde, keine SQL-Ausgabe zu generieren, wenn das Objekt nicht vorhanden ist, nicht zu erhöhen.Referenzen: #4997
[orm] [bug] ¶
Behobene Regression, eingeführt in 1.3.0, im Zusammenhang mit der Refaktorierung von Association Proxies in #4351, die verhinderte, dass
composite()-Attribute in Bezug auf einen Association Proxy, der auf sie verweist, funktionierten.Referenzen: #5000
[orm] [bug] ¶
Das Setzen von persistenzbezogenen Flags auf
relationship(), während gleichzeitig viewonly=True gesetzt ist, gibt nun eine reguläre Warnung aus, da diese Flags für eine viewonly=True-Beziehung keinen Sinn ergeben. Insbesondere die "cascade"-Einstellungen haben ihre eigene Warnung, die basierend auf den einzelnen Werten, wie z.B. "delete, delete-orphan", generiert wird und nicht für eine viewonly-Beziehung gelten sollte. Beachten Sie jedoch, dass im Falle von "cascade" diese Einstellungen immer noch fälschlicherweise wirksam werden, obwohl die Beziehung als "viewonly" eingerichtet ist. In 1.4 werden alle persistenzbezogenen Cascade-Einstellungen für eine viewonly=True-Beziehung nicht mehr zulässig sein, um dieses Problem zu beheben.Referenzen: #4993
[orm] [bug] [py3k] ¶
Behobenes Problem, bei dem beim Zuweisen einer Sammlung an sich selbst als Slice die Mutationsoperation fehlschlug, da sie zunächst die zugewiesene Sammlung versehentlich löschte. Da eine Zuweisung, die den Inhalt nicht ändert, keine Ereignisse auslösen sollte, ist die Operation nun ein No-Op. Beachten Sie, dass die Korrektur nur für Python 3 gilt; in Python 2 wird der
__setitem__Hook in diesem Fall nicht aufgerufen; stattdessen wird__setslice__verwendet, was die Liste Element für Element in allen Fällen neu erstellt.Referenzen: #4990
[orm] [bug] ¶
Behobenes Problem, bei dem, wenn das "begin" einer Transaktion auf Core-Engine-/Verbindungsebene fehlschlug, z. B. aufgrund eines Netzwerkfehlers oder einer gesperrten Datenbank für einige transaktionale Rezepte, im Kontext der
Session, die diese Verbindung vom Connection Pool bezog und dann sofort zurückgab, die ORMSessiondie Verbindung nicht schloss, obwohl diese Verbindung nicht im Zustand dieserSessiongespeichert war. Dies führte dazu, dass die Verbindung durch den Connection Pool WeakRef-Handler während der Garbage Collection bereinigt wurde, was ein unerwünschter Code-Pfad ist, der in einigen speziellen Konfigurationen Fehler in Standardfehler ausgeben kann.Referenzen: #5034
sql¶
[sql] [bug] ¶
Behobener Fehler, bei dem das Schlüsselwort "distinct", das an
select()übergeben wurde, einen String-Wert nicht als "Label-Referenz" behandelte, so wie esselect.distinct()tut; stattdessen wurde bedingungslos ein Fehler ausgelöst. Dieses Schlüsselwortargument und andere, die anselect()übergeben wurden, werden für SQLAlchemy 2.0 letztendlich als veraltet erklärt.Referenzen: #5028
[sql] [bug] ¶
Der Text der Ausnahme für "Kann Label-Referenz nicht auflösen" wurde geändert, um andere Arten von Label-Koerzionen einzuschließen, insbesondere dass "DISTINCT" unter dem PostgreSQL-Dialekt ebenfalls in diese Kategorie fällt.
sqlite¶
[sqlite] [bug] ¶
Behobenes Problem als Workaround für das SQLite-Verhalten, numerische Affinität für JSON-Datentypen zuzuweisen, erstmals beschrieben in Unterstützung für SQLite JSON hinzugefügt, das skalare numerische JSON-Werte als Zahl und nicht als Zeichenkette, die JSON deserialisiert werden kann, zurückgibt. Der SQLite-spezifische JSON-Deserializer degradiert nun für diesen Fall als Ausnahme und umgeht die Deserialisierung für einzelne numerische Werte, da sie aus JSON-Sicht bereits deserialisiert sind.
Referenzen: #5014
mssql¶
[mssql] [bug] ¶
Unterstützung für den
DATETIMEOFFSET-Datentyp auf PyODBC repariert, indem PyODBC-spezifische Ergebnis-Handler hinzugefügt wurden, da dieser keinen nativen Support für diesen Datentyp hat. Dies beinhaltet die Verwendung der Python 3 "timezone" tzinfo Unterklasse zur Einrichtung einer Zeitzone, die auf Python 2 eine minimale Portierung von "timezone" in sqlalchemy.util verwendet.Referenzen: #4983
1.3.11¶
Veröffentlicht: 11. November 2019orm¶
[orm] [usecase] ¶
Accessor
Query.is_single_entity()zuQueryhinzugefügt, der angibt, ob die von dieserQueryzurückgegebenen Ergebnisse eine Liste von ORM-Entitäten oder ein Tupel von Entitäten oder Spaltenausdrücken sind. SQLAlchemy hofft, das Verhalten von einzelnen Entitäten / Tupeln in zukünftigen Versionen zu verbessern, sodass das Verhalten von Anfang an explizit wäre, aber dieses Attribut sollte bei aktuellem Verhalten hilfreich sein. Pull Request von Patrick Hayes.Referenzen: #4934
[orm] [bug] ¶
Das Flag
relationship.omit_joinwar nicht dazu bestimmt, manuell auf True gesetzt zu werden, und gibt nun eine Warnung aus, wenn dies geschieht. Die omit_join-Optimierung wird automatisch erkannt, und dasomit_join-Flag war nur dazu gedacht, die Optimierung in dem hypothetischen Fall zu deaktivieren, dass die Optimierung die korrekten Ergebnisse beeinträchtigt hätte, was bei der modernen Version dieses Features nicht beobachtet wurde. Das Setzen des Flags auf True, wenn es nicht automatisch erkannt wird, kann dazu führen, dass das Selectin-Load-Feature nicht korrekt funktioniert, wenn eine nicht-standardmäßige primäre Join-Bedingung verwendet wird.Referenzen: #4954
[orm] [bug] ¶
Es wird eine Warnung ausgegeben, wenn ein Primärschlüsselwert an
Query.get()übergeben wird, der für alle Primärschlüsselspaltenpositionen None enthält. Zuvor führte die Übergabe eines einzelnen None außerhalb eines Tupels zu einemTypeErrorund die Übergabe eines zusammengesetzten None (Tupel von None-Werten) wurde stillschweigend übernommen. Die Korrektur wandelt nun das einzelne None in ein Tupel um, wo es konsistent mit den anderen None-Bedingungen behandelt wird. Vielen Dank an Lev Izraelit für die Hilfe dabei.Referenzen: #4915
[orm] [bug] ¶
Die
BakedQueryspeichert keine Abfragen zwischen, die durch einQueryEvents.before_compile()-Ereignis modifiziert wurden, sodass Kompilierungs-Hooks, die ad-hoc-Modifikationen an Abfragen vornehmen können, bei jeder Ausführung wirksam werden. Dies ist insbesondere hilfreich für Ereignisse, die Abfragen modifizieren, die beim Lazy Loading sowie beim Eager Loading wie dem "select in"-Loading verwendet werden. Um das Caching für eine durch dieses Ereignis modifizierte Abfrage wieder zu aktivieren, wird ein neues Flagbake_okhinzugefügt; siehe Verwendung des before_compile-Ereignisses für Details.Ein längerfristiger Plan zur Bereitstellung einer neuen Form des SQL-Cachings soll diese Art von Problemen umfassender lösen.
Referenzen: #4947
[orm] [bug] ¶
ORM-Bug behoben, bei dem eine "sekundäre" Tabelle, die sich auf ein selektierbares Element bezog, das sich auf irgendeine Weise auf die lokale Primärtabelle bezog, beide Seiten der Join-Bedingung mit Aliasing versah, wenn ein beziehungsbezogener Join, entweder über
Query.join()oder durchjoinedload(), generiert wurde. Die "lokale" Seite wird nun ausgeschlossen.Referenzen: #4974
engine¶
[engine] [bug] ¶
Bug behoben, bei dem die Parameter-Repräsentation, wie sie in der Protokollierung und Fehlerberichterstattung verwendet wird, zusätzlichen Kontext benötigt, um zwischen einer Liste von Parametern für eine einzelne Anweisung und einer Liste von Parameterlisten zu unterscheiden, da die "Liste von Listen"-Struktur auch eine einzelne Parameterliste anzeigen könnte, bei der der erste Parameter selbst eine Liste ist, wie z. B. bei einem Array-Parameter. Die Engine/Verbindung übergibt nun ein zusätzliches Boolesches Flag, das angibt, wie die Parameter betrachtet werden sollen. Das einzige SQLAlchemy-Backend, das Arrays als Parameter erwartet, ist das von psycopg2, das pyformat-Parameter verwendet, sodass dieses Problem bisher nicht sehr deutlich war. Da jedoch andere Treiber, die Positionsangaben verwenden, mehr Funktionen erhalten, ist es wichtig, dass dies unterstützt wird. Es entfällt auch die Notwendigkeit, dass die Parameter-Repräsentationsfunktion basierend auf der übergebenen Parameterstruktur rät.
Referenzen: #4902
[engine] [bug] [postgresql] ¶
Bug in
Inspectorbehoben, bei dem die Generierung von Cache-Schlüsseln keine Argumente berücksichtigte, die in Form von Tupeln übergeben wurden, wie z. B. das Tupel von View-Namensstilen, die für das PostgreSQL-Dialekt zurückgegeben werden sollten. Dies führte dazu, dass der Inspektor für einen spezifischeren Kriterienkatalog zu allgemein zwischenspeicherte. Die Logik wurde angepasst, um jedes Schlüsselwort-Element in den Cache aufzunehmen, da jedes Argument für einen Cache geeignet sein muss, andernfalls sollte der Caching-Decorator vom Dialekt umgangen werden.Referenzen: #4955
sql¶
[sql] [usecase] ¶
Neue Accessoren zu Ausdrücken vom Typ
JSONhinzugefügt, um spezifischen Datentypzugriff und -vergleiche zu ermöglichen, die Strings, Ganzzahlen, numerische und boolesche Elemente abdecken. Dies überarbeitet den dokumentierten Ansatz des CASTings zu String beim Vergleich von Werten und fügt stattdessen spezifische Funktionalität in die Dialekte PostgreSQL, SQlite und MySQL ein, um diese Basistypen in allen Fällen zuverlässig zu liefern.Siehe auch
Referenzen: #4276
[sql] [usecase] ¶
Das Konstrukt
text()unterstützt nun "eindeutige" gebundene Parameter, die sich zur Kompilierungszeit dynamisch eindeutig machen, wodurch mehreretext()-Konstrukte mit denselben Namen gebundener Parameter kombiniert werden können.Referenzen: #4933
[sql] [bug] [py3k] ¶
Die
repr()desquoted_name-Konstrukts wurde unter Python 3 auf die reguläre String-repr() umgestellt, anstatt sie durch "backslashreplace"-Escaping laufen zu lassen, was irreführend sein kann.Referenzen: #4931
schema¶
[schema] [usecase] ¶
DDL-Unterstützung für "berechnete Spalten" hinzugefügt; dies sind DDL-Spaltenspezifikationen für Spalten, die einen serverseitig berechneten Wert haben, entweder bei SELECT (bekannt als "virtuell") oder zum Zeitpunkt ihrer INSERT- oder UPDAT-Operation (bekannt als "gespeichert"). Unterstützung wurde für Postgresql, MySQL, Oracle, SQL Server und Firebird etabliert. Vielen Dank an Federico Caselli für die viele Arbeit an diesem Punkt.
Siehe auch
Referenzen: #4894
[schema] [bug] ¶
Bug behoben, bei dem eine Tabelle, die eine Spaltenbezeichnung hatte, die mit einem einfachen Spaltennamen überlappte, z. B. "foo.id AS foo_id" gegenüber "foo.foo_id", das Attribut
._labelfür eine Spalte vorzeitig generiert hätte, bevor diese Überlappung erkannt werden konnte, aufgrund der Verwendung des Flagsindex=Trueoderunique=Trueauf der Spalte in Verbindung mit der Standardbenennungskonvention von"column_0_label". Dies hätte dann zu Fehlern geführt, wenn._labelspäter zur Generierung eines gebundenen Parameternamens verwendet wurde, insbesondere bei denen, die vom ORM bei der Generierung der WHERE-Klausel für eine UPDATE-Anweisung verwendet wurden. Das Problem wurde behoben, indem ein alternativer._label-Accessor für die DDL-Generierung verwendet wird, der den Zustand derColumnnicht beeinflusst. Der Accessor umgeht auch den Schritt der Schlüssel-Deduplizierung, da dieser für DDL nicht notwendig ist. Die Benennung ist nun konsistent"<tabellenname>_<spaltenname>"ohne nachfolgende numerische Symbole, wenn sie in DDL verwendet wird.Referenzen: #4911
mysql¶
[mysql] [bug] ¶
Die Meldung "Connection was killed" wurde aus der Basisklasse pymysql.Error interpretiert, um geschlossene Verbindungen zu erkennen. Dies basiert auf Berichten, dass diese Meldung über ein pymysql.InternalError()-Objekt ankommt, was darauf hindeutet, dass pymysql sie nicht korrekt behandelt.
Referenzen: #4945
mssql¶
[mssql] [bug] ¶
Problem im MSSQL-Dialekt behoben, bei dem ein ausdrucksbasierter OFFSET-Wert in einem SELECT abgelehnt wurde, obwohl der Dialekt diesen Ausdruck innerhalb eines ROW NUMBER-orientierten LIMIT/OFFSET-Konstrukts rendern kann.
Referenzen: #4973
[mssql] [bug] ¶
Problem in der Methode
Engine.table_names()behoben, bei der der Standard-Schemaname des Dialekts zurück in die Tabellenfunktion auf Dialektebene eingespeist wurde. Dies führte im Falle von SQL Server dazu, dass er als punktgetrennter Schemaname interpretiert wurde, wie er vom mssql-Dialekt gesehen wird, was zum Fehlschlag der Methode führte, wenn der Datenbankbenutzer tatsächlich einen Punkt in seinem Namen hatte. In 1.3 wird diese Methode immer noch von der FunktionMetaData.reflect()verwendet, sodass es sich um einen prominenten Codepfad handelt. In 1.4, der aktuellen Hauptentwicklungszweig, existiert dieses Problem nicht, da sowohlMetaData.reflect()diese Methode nicht verwendet als auch die Methode den Standard-Schemanamen nicht explizit übergibt. Die Korrektur schützt dennoch davor, dass der vom Dialekt zurückgegebene Standard-Servernamenwert unter keinen Umständen als punktgetrennter Name interpretiert wird, indem er in quoted_name() eingekapselt wird.Referenzen: #4923
oracle¶
[oracle] [usecase] ¶
Dialekt-Flag
encoding_errorszum cx_Oracle-Dialekt hinzugefügt, das als Teil voncreate_engine()angegeben werden kann. Dies wird für den sehr ungewöhnlichen Fall, dass fehlerhafte Kodierungen in der Zieldatenbank vorhanden sind, die nur ohne Fehlerbehandlung abgerufen werden können, an den Unicode-Dekodierungskonverter von SQLAlchemy unter Python 2 und an denencodingErrors-Parameter descursor.var()-Objekts unter Python 3 übergeben. Der Wert ist letztendlich einer der Python-"Encoding-Fehler"-Parameter, die andecode()übergeben werden.Referenzen: #4799
[oracle] [bug] [firebird] ¶
Der Ansatz der "Namensnormalisierung" für die Oracle- und Firebird-Dialekte wurde geändert, der von der UPPERCASE-als-case-insensitiv-Konvention dieser Dialekte in Kleinbuchstaben-als-case-insensitiv für SQLAlchemy konvertiert. Dabei wird das Konstrukt
quoted_namenicht automatisch auf einen Namen angewendet, der sich bei Groß- oder Kleinschreibung entspricht, wie es bei vielen nicht-europäischen Zeichen der Fall ist. Alle Namen, die innerhalb von Metadatenstrukturen verwendet werden, werden ohnehin inquoted_name-Objekte konvertiert; die Änderung hier würde nur die Ausgabe einiger Inspektionsfunktionen beeinflussen.Referenzen: #4931
[oracle] [bug] ¶
Der Datentyp
NCHARwird nun bei Verwendung als gebundener Parameter an die DBAPI-Datenbindungencx_Oracle.FIXED_NCHARgebunden, was ein korrektes Vergleichsverhalten gegenüber einem String variabler Länge liefert. Zuvor wurde der DatentypNCHARancx_oracle.NCHARgebunden, das keine feste Länge hat; der DatentypCHARwird bereits ancx_Oracle.FIXED_CHARgebunden, sodass es nun konsistent ist, dassNCHARancx_Oracle.FIXED_NCHARgebunden wird.Referenzen: #4913
tests¶
misc¶
[bug] [installation] [windows] ¶
Ein Workaround für einen Setuptools-bedingten Fehler hinzugefügt, der bei Windows-Installationen beobachtet wurde, bei denen Setuptools einen Build-Fehler nicht korrekt meldet, wenn die MSVC-Build-Abhängigkeiten nicht installiert sind, und daher keine ordnungsgemäße Degradation in Builds ohne C-Erweiterungen zulässt.
Referenzen: #4967
[bug] [firebird] ¶
Zusätzliche "Disconnect"-Meldung "Error writing data to the connection" zur Erkennung von Firebird-Disconnections hinzugefügt. Pull-Request von lukens.
Referenzen: #4903
1.3.10¶
Veröffentlicht: 9. Oktober 2019mssql¶
oracle¶
[oracle] [bug] ¶
Regression im Oracle-Dialekt behoben, die versehentlich die maximale Bezeichnerlänge von 128 Zeichen auf Oracle Server 12.2 und höher verwendete, obwohl der vereinbarte Vertrag für den Rest der 1.3er-Serie vorsah, dass dieser Wert bis Version SQLAlchemy 1.4 bei 30 bleibt. Probleme mit dem Abruf der "Kompatibilitätsversion" wurden ebenfalls behoben, und die Warnung, die ausgegeben wurde, wenn die Ansicht "v$parameter" nicht zugänglich war, wurde entfernt, da dies zu Verwirrung bei den Benutzern führte.
1.3.9¶
Veröffentlicht: 4. Oktober 2019orm¶
[orm] [bug] ¶
Regression in der selectinload-Loader-Strategie, die durch #4775 (veröffentlicht in Version 1.3.6) verursacht wurde, behoben, bei der ein Many-to-One-Attribut von None nicht mehr vom Loader gefüllt wurde. Obwohl dies aufgrund des Lazyloaders, der None beim Abrufen füllte, normalerweise nicht auffiel, würde es zu einem Detached-Instance-Fehler führen, wenn das Objekt getrennt wäre.
Referenzen: #4872
[orm] [bug] ¶
Die Übergabe eines einfachen String-Ausdrucks an
Session.query()ist veraltet, da alle String-Konvertierungen in #4481 entfernt wurden und diese hätte enthalten sein sollen. Die Funktionliteral_column()kann verwendet werden, um einen textuellen Spaltenausdruck zu erzeugen.Referenzen: #4873
[orm] [bug] ¶
Es wird eine Warnung für eine Bedingung ausgegeben, unter der die
Sessionein Objekt implizit aus der Identitätskarte gegen ein anderes Objekt mit demselben Primärschlüssel austauschen kann, wodurch das alte Objekt getrennt wird. Dies kann ein beobachtetes Ergebnis von Ladevorgängen sein, die innerhalb desSessionEvents.after_flush()-Hooks auftreten. Die Warnung soll den Benutzer darüber informieren, dass eine spezielle Bedingung dazu geführt hat, und dass das vorherige Objekt möglicherweise nicht im erwarteten Zustand ist.Referenzen: #4890
engine¶
[engine] [usecase] ¶
Neuer Parameter
create_engine.max_identifier_lengthfürcreate_engine()hinzugefügt. Dieser überschreibt die im Dialekt kodierte "maximale Bezeichnerlänge", um Datenbanken zu berücksichtigen, die diese Länge kürzlich geändert haben und der SQLAlchemy-Dialekt noch nicht angepasst wurde, um dies für diese Version zu erkennen. Dieser Parameter interagiert mit dem bestehenden Parametercreate_engine.label_length, da er den maximalen (und Standard-)Wert für anonym generierte Bezeichnungen festlegt. Darüber hinaus wurde die Erkennung der maximalen Bezeichnerlängen nach der Verbindung zum Dialektsystem hinzugefügt. Dieses Feature wird zuerst vom Oracle-Dialekt genutzt.Siehe auch
Maximale Bezeichnerlängen - in der Dokumentation des Oracle-Dialekts
Referenzen: #4857
sql¶
[sql] [usecase] ¶
Explizite Fehlermeldung hinzugefügt für den Fall, dass Objekte, die an
Tableübergeben werden, keineSchemaItem-Objekte sind, anstatt auf einen AttributeError aufzulösen.Referenzen: #4847
[sql] [bug] ¶
Zeichen, die "pyformat" oder "named" Formate in gebundenen Parametern stören, nämlich
%, (, )und das Leerzeichen, sowie einige andere typischerweise unerwünschte Zeichen, werden frühzeitig für einenbindparam()entfernt, der einen anonymisierten Namen verwendet. Dieser wird typischerweise automatisch aus einer benannten Spalte generiert, die selbst diese Zeichen in ihrem Namen enthält und keine.keyverwendet. Dadurch wird verhindert, dass sie sowohl die Verwendung der String-Formatierung des SQLAlchemy-Compilers als auch die Parsing des Parameters auf Treiberebene stören, was beides vor der Korrektur demonstriert werden konnte. Die Änderung gilt nur für anonymisierte Parameternamen, die intern generiert und verarbeitet werden, nicht für vom Endbenutzer definierte Namen, sodass die Änderung keine Auswirkungen auf bestehenden Code haben sollte. Gilt insbesondere für den psycopg2-Treiber, der spezielle Parameternamen nicht anderweitig in Anführungszeichen setzt, aber auch führende Unterstriche entfernt, um Oracle gerecht zu werden (aber noch keine führenden Zahlen, da einige anonyme Parameter derzeit rein numerisch/unterstrichelbasiert sind); Oracle setzt in jedem Fall weiterhin Parameternamen mit Sonderzeichen in Anführungszeichen.Referenzen: #4837
sqlite¶
mssql¶
[mssql] [bug] ¶
Identifizierungszeichensetzung zum Schemanamen hinzugefügt, der auf die "use"-Anweisung angewendet wird, die aufgerufen wird, wenn ein SQL Server-Multipart-Schemaname innerhalb einer
Tableverwendet wird, die reflektiert wird, sowie fürInspector-Methoden wieInspector.get_table_names(). Dies berücksichtigt Sonderzeichen oder Leerzeichen im Datenbanknamen. Darüber hinaus wird die "use"-Anweisung nicht ausgegeben, wenn die aktuelle Datenbank mit dem zu übergebenden Zielbesitzer-Datenbanknamen übereinstimmt.Referenzen: #4883
oracle¶
[oracle] [usecase] ¶
Der Oracle-Dialekt gibt nun eine Warnung aus, wenn Oracle Version 12.2 oder höher verwendet wird und der Parameter
create_engine.max_identifier_lengthnicht gesetzt ist. Die Version in diesem speziellen Fall wird standardmäßig auf die "Kompatibilitäts"-Version gesetzt, die in der Oracle-Serverkonfiguration konfiguriert ist, nicht auf die tatsächliche Serverversion. In Version 1.4 wird die Standard-max_identifier_length für 12.2 oder höher auf 128 Zeichen gesetzt. Um die Abwärtskompatibilität zu gewährleisten, sollten Anwendungencreate_engine.max_identifier_lengthauf 30 setzen, um das gleiche Längenverhalten beizubehalten, oder auf 128, um das kommende Verhalten zu testen. Diese Länge bestimmt unter anderem, wie generierte Constraint-Namen für Anweisungen wieCREATE CONSTRAINTundDROP CONSTRAINTgekürzt werden, was bedeutet, dass die neue Länge einen Namenskonflikt mit einem Namen erzeugen kann, der mit der alten Länge generiert wurde, was Datenbankmigrationen beeinträchtigt.Siehe auch
Maximale Bezeichnerlängen - in der Dokumentation des Oracle-Dialekts
Referenzen: #4857
[oracle] [bug] ¶
Das Hinzufügen von cx_Oracle.DATETIME zum Aufruf setinputsizes() wurde wiederhergestellt, wenn ein SQLAlchemy
Date-,DateTime- oderTime-Datentyp verwendet wird, da einige komplexe Abfragen dies erfordern. Dies wurde in der 1.2er-Serie aus beliebigen Gründen entfernt.Referenzen: #4886
tests¶
[tests] [bug] ¶
Einheitstest-Regression behoben, die in 1.3.8 veröffentlicht wurde und zu Fehlern für Oracle, SQL Server und andere nicht-native ENUM-Plattformen führte, aufgrund neuer Enumerationstests, die als Teil von #4285 Enum-Sortierbarkeit in der Unit-of-Work hinzugefügt wurden; die Enumerationen erzeugten Constraints, die nach Namen dupliziert wurden.
Referenzen: #4285
1.3.8¶
Veröffentlicht: 27. August 2019orm¶
[orm] [usecase] ¶
Unterstützung für die Verwendung eines
Enum-Datentyps mit Python pep-435 Enumerationsobjekten als Werte für die Verwendung als von der ORM zugeordneter Primärschlüsselspalte hinzugefügt. Da diese Werte nicht von Natur aus sortierbar sind, wie von der ORM für Primärschlüssel gefordert, wird ein neues AttributTypeEngine.sort_key_functionzum Typsystem hinzugefügt, das es jedem SQL-Typ ermöglicht, eine Sortierung für Python-Objekte seines Typs zu implementieren, die von der Unit-of-Work konsultiert wird. DerEnum-Typ definiert dies dann anhand des Datenbankwerts einer gegebenen Enumeration. Das Sortierschema kann auch neu definiert werden, indem ein Callable an den ParameterEnum.sort_key_functionübergeben wird. Pull-Request von Nicolas Caniart.Referenzen: #4285
[orm] [bug] ¶
Bug behoben, bei dem
Load-Objekte aufgrund des Mapper-/Relationship-Status im internen Kontextwörterbuch nicht pickelbar waren. Diese Objekte werden nun unter Verwendung ähnlicher Techniken wie andere Elemente im Loader-Optionssystem, die seit langem serialisierbar sind, in pickelbare umgewandelt.Referenzen: #4823
engine¶
[engine] [feature] ¶
Neuer Parameter
create_engine.hide_parametershinzugefügt. Wenn dieser auf True gesetzt ist, werden SQL-Parameter nicht mehr protokolliert und nicht mehr in der String-Darstellung einesStatementError-Objekts angezeigt.Referenzen: #4815
[engine] [bug] ¶
Problem behoben, bei dem der "initialize"-Prozess des Dialekts, der bei der ersten Verbindung auftritt, bei einer unerwarteten Ausnahme fehlschlug. Der Initialisierungsprozess konnte nicht abgeschlossen werden und wurde dann bei nachfolgenden Verbindungsversuchen nicht mehr versucht, wodurch der Dialekt im Geltungsbereich von Parametern, die basierend auf der Inspektion einer Live-Verbindung festgelegt werden müssen, in einem nicht initialisierten oder teilweise initialisierten Zustand verblieb. Die "einmalige Ausführung"-Logik im Ereignissystem wurde überarbeitet, um dieses Vorkommnis zu berücksichtigen, indem neue, private API-Funktionen verwendet werden, die einen "exec once"-Hook einrichten, der den Initialisierer weiterhin bei nachfolgenden Verbindungen auslösen wird, bis er ohne Ausnahme abgeschlossen ist. Dies hat keine Auswirkungen auf das Verhalten des bestehenden
once=True-Flags im Ereignissystem.Referenzen: #4807
postgresql¶
[postgresql] [usecase] ¶
Hinzugefügte Unterstützung für die Reflexion von CHECK-Constraints, die den speziellen PostgreSQL-Qualifizierer „NOT VALID“ enthalten, welcher für CHECK-Constraints vorhanden sein kann, die mit der Direktive, dass sie nicht auf vorhandene Daten in der Tabelle angewendet werden sollen, zu einer bestehenden Tabelle hinzugefügt wurden. Das PostgreSQL-Wörterbuch für CHECK-Constraints, wie es von
Inspector.get_check_constraints()zurückgegeben wird, kann einen zusätzlichen Eintragdialect_optionsenthalten, der wiederum einen Eintrag"not_valid": Trueenthält, wenn dieses Symbol erkannt wird. Pull-Request von Bill Finn.Referenzen: #4824
[postgresql] [bug] ¶
Überarbeitete den Ansatz für die gerade hinzugefügte Unterstützung für die psycopg2 „execute_values()“-Funktion, die in 1.3.7 für #4623 hinzugefügt wurde. Der Ansatz beruhte auf einem regulären Ausdruck, der bei komplexeren INSERT-Anweisungen, wie z. B. solchen mit Subqueries, nicht übereinstimmte. Der neue Ansatz stimmt exakt mit dem String überein, der als VALUES-Klausel gerendert wurde.
Referenzen: #4623
[postgresql] [bug] ¶
Behob einen Fehler, bei dem Postgresql-Operatoren wie
Comparator.contains()undComparator.contained_by()für Nicht-Ganzzahlwerte nicht korrekt funktionierten, wenn sie gegen einarray-Objekt verwendet wurden, aufgrund einer fehlerhaften Assert-Anweisung.Referenzen: #4822
sqlite¶
[sqlite] [bug] [reflection] ¶
Behob einen Fehler, bei dem ein FOREIGN KEY, der so eingerichtet war, dass er nur über den Tabellennamen auf die übergeordnete Tabelle verwies, ohne die Spaltennamen, nicht korrekt reflektiert wurde, was die Einrichtung der „referenzierten Spalten“ betraf, da SQLite’s PRAGMA diese Spalten nicht meldet, wenn sie nicht explizit angegeben wurden. Aus irgendeinem Grund wurde dies hartkodiert, um den Namen der lokalen Spalte anzunehmen, was in manchen Fällen funktionieren mag, aber nicht korrekt ist. Der neue Ansatz reflektiert den Primärschlüssel der referenzierten Tabelle und verwendet die Liste der Constraint-Spalten als Liste der referenzierten Spalten, wenn die entfernten Spalten nicht direkt im reflektierten PRAGMA vorhanden sind.
Referenzen: #4810
1.3.7¶
Veröffentlicht: 14. August 2019orm¶
[orm] [bug] ¶
Behob eine Regression, die durch das neue selectinload für Many-to-One-Logik verursacht wurde, bei der eine Primaryjoin-Bedingung, die nicht auf tatsächlichen Fremdschlüsseln basierte, zu einem KeyError führte, wenn ein verwandtes Objekt für einen bestimmten Schlüsselwert im übergeordneten Objekt nicht existierte.
Referenzen: #4777
[orm] [bug] ¶
Behob einen Fehler, bei dem die Verwendung von
Query.first()oder ein Slice-Ausdruck in Verbindung mit einer Abfrage, die einen ausdrucksbasierten „offset“ angewendet hat, einen TypeError auslöste, aufgrund einer „oder“-Bedingung gegen „offset“, die nicht erwartete, dass es sich um einen SQL-Ausdruck handelt, im Gegensatz zu einer Ganzzahl oder None.Referenzen: #4803
sql¶
[sql] [bug] ¶
Behob ein Problem, bei dem ein
Index-Objekt, das eine Mischung aus funktionalen Ausdrücken enthielt, die nicht auf eine bestimmte Spalte abgebildet werden konnten, in Kombination mit zeichenkettenbasierten Spaltennamen, seinen internen Zustand nicht korrekt initialisierte, was zu Fehlern bei der DDL-Kompilierung führte.Referenzen: #4778
[sql] [bug] ¶
Behob einen Fehler, bei dem die Methode
TypeEngine.column_expression()nicht auf nachfolgende SELECT-Anweisungen innerhalb eines UNION oder eines anderen_selectable.CompoundSelectangewendet wurde, obwohl die SELECT-Anweisungen auf der obersten Ebene der Anweisung gerendert werden. Neue Logik unterscheidet nun zwischen dem Rendern des Spaltenausdrucks, der für alle SELECTs in der Liste benötigt wird, und dem Sammeln des zurückgegebenen Datentyps für die Ergebniszeile, der nur für den ersten SELECT benötigt wird.Referenzen: #4787
[sql] [bug] ¶
Behob ein Problem, bei dem das interne Klonen von SELECT-Konstrukten zu einem Schlüsselwertfehler führen konnte, wenn die Kopie des SELECT seinen Zustand änderte, sodass sich seine Spaltenliste änderte. Dies trat in einigen ORM-Szenarien auf, die spezifisch für 1.3 und höher sein könnten, und ist daher teilweise eine Regression-Korrektur.
Referenzen: #4780
postgresql¶
[postgresql] [usecase] ¶
Hinzugefügte neue Dialekt-Flagge für den psycopg2-Dialekt,
executemany_mode, die die vorherige experimentelleuse_batch_mode-Flagge ersetzt.executemany_modeunterstützt sowohl die „execute batch“- als auch die „execute values“-Funktionen von psycopg2, letztere wird für kompilierteinsert()-Konstrukte verwendet. Pull-Request von Yuval Dinari.Siehe auch
Referenzen: #4623
mysql¶
[mysql] [usecase] ¶
Hinzugefügte reservierte Wörter ARRAY und MEMBER zur Liste der reservierten Wörter von MySQL, da MySQL 8.0 diese nun reserviert hat.
Referenzen: #4783
[mysql] [bug] ¶
Die MySQL-Dialekte geben am Anfang einer Verbindung „SET NAMES“ aus, wenn die Zeichensatzkodierung an den MySQL-Treiber übergeben wird, um ein offensichtliches Verhalten von MySQL 8.0 zu umgehen, das einen Kollisionsfehler auslöst, wenn ein UNION Zeichenketten-Spalten mit Spalten der Form CAST(NULL AS CHAR(..)) vereint, was die Funktion polymorphic_union von SQLAlchemy tut. Das Problem schien PyMySQL mindestens ein Jahr lang betroffen zu haben, ist aber seit mysqlclient 1.4.4 aufgrund von Änderungen in der Art und Weise, wie dieser DBAPI eine Verbindung herstellt, aufgetreten. Da die Anwesenheit dieser Direktive drei separate MySQL-Zeichensatzkodierungs-Einstellungen beeinflusst, die jeweils komplexe Auswirkungen auf Basis ihrer Anwesenheit haben, gibt SQLAlchemy die Direktive nun bei neuen Verbindungen aus, um das korrekte Verhalten zu gewährleisten.
Referenzen: #4804
[mysql] [bug] ¶
Eine weitere Korrektur für ein Upstream-MySQL-8-Problem, bei dem ein Groß-/Kleinschreibung-sensitiver Tabellenname bei der Fremdschlüssel-Reflexion falsch gemeldet wird. Dies ist eine Erweiterung der Korrektur, die zuerst für #4344 hinzugefügt wurde und einen Groß-/Kleinschreibung-sensitiven Spaltennamen betrifft. Das neue Problem tritt bis MySQL 8.0.17 auf, sodass die allgemeine Logik der 88718-Korrektur erhalten bleibt.
Siehe auch
https://bugs.mysql.com/bug.php?id=96365 - Upstream-Bug
Referenzen: #4751
sqlite¶
[sqlite] [bug] ¶
Die Dialekte, die JSON unterstützen, sollen Argumente
json_serializerundjson_deserializerauf der create_engine()-Ebene akzeptieren, jedoch nennt der SQLite-Dialekt sie_json_serializerund_json_deserilalizer. Die Namen wurden korrigiert, die alten Namen werden mit einer Warnung akzeptiert und diese Parameter werden nun alscreate_engine.json_serializerundcreate_engine.json_deserializerdokumentiert.Referenzen: #4798
[sqlite] [bug] ¶
Behob einen Fehler, bei dem die Verwendung von „PRAGMA table_info“ im SQLite-Dialekt dazu führte, dass Reflexionsfunktionen zur Erkennung der Tabellenexistenz, der Liste der Tabellenspalten und der Liste der Fremdschlüssel standardmäßig auf jede Tabelle in jeder angehängten Datenbank griffen, wenn kein Schemaname angegeben war und die Tabelle nicht im Basisschema existierte. Die Korrektur führt explizit PRAGMA für das Schema ‚main‘ und dann für das Schema ‚temp‘ aus, wenn ‚main‘ keine Zeilen zurückgegeben hat, um das Verhalten von Tabellen + temporären Tabellen im Namensraum „ohne Schema“ und angehängten Tabellen nur im Namensraum „Schema“ beizubehalten.
Referenzen: #4793
mssql¶
[mssql] [usecase] ¶
Hinzugefügte neue
try_cast()-Konstruktion für SQL Server, die die Syntax „TRY_CAST“ ausgibt. Pull-Request von Leonel Atencio.Referenzen: #4782
misc¶
[bug] [events] ¶
Behob ein Problem im Ereignissystem, bei dem die Verwendung der Flagge
once=Truemit dynamisch generierten Listener-Funktionen dazu führte, dass die Registrierung zukünftiger Ereignisse fehlschlug, wenn diese Listener-Funktionen nach ihrer Verwendung vom Garbage Collector eingesammelt wurden, aufgrund der Annahme, dass eine lauschende Funktion stark referenziert wird. Der „once“-Wrapper wurde nun modifiziert, um die innere Funktion dauerhaft stark zu referenzieren, und die Dokumentation wurde aktualisiert, dass die Verwendung von „once“ keine automatische Deregistrierung von Listener-Funktionen impliziert.Referenzen: #4794
1.3.6¶
Veröffentlicht: 21. Juli 2019orm¶
[orm] [feature] ¶
Hinzugefügte neue Loader-Optionsmethode
Load.options(), die es ermöglicht, Loader-Optionen hierarchisch zu konstruieren, sodass viele Unteroptionen auf einen bestimmten Pfad angewendet werden können, ohnedefaultload()viele Male aufrufen zu müssen. Danke an Alessio Bogon für die Idee.Referenzen: #4736
[orm] [performance] ¶
Die Optimierung, die in #4340 für selectin-Laden angewendet wurde, bei der ein JOIN nicht benötigt wird, um verwandte Elemente eifrig zu laden, wird nun auch auf Many-to-One-Beziehungen angewendet, sodass nur die verwandte Tabelle für eine einfache JOIN-Bedingung abgefragt wird. In diesem Fall werden die verwandten Elemente basierend auf dem Wert einer Fremdschlüsselspalte des übergeordneten Objekts abgefragt; wenn diese Spalten verzögert sind oder anderweitig nicht auf einem der übergeordneten Objekte in der Sammlung geladen werden, fällt der Loader auf die JOIN-Methode zurück.
Referenzen: #4775
[orm] [bug] ¶
Behob eine Regression, die durch #4365 verursacht wurde, bei der ein JOIN von einer Entität zu sich selbst ohne Aliase keine informative Fehlermeldung mehr auslöste, sondern bei einer Assertion fehlschlug. Die informative Fehlerbedingung wurde wiederhergestellt.
Referenzen: #4773
[orm] [bug] ¶
Behob ein Problem, bei dem die Methode
_ORMJoin.join(), eine nicht-intern verwendete ORM-Methode, die den normalerweise internen Prozess vonQuery.join()exponiert, die Schlüsselwörterfullundouterjoinnicht korrekt weitergab. Pull-Request von Denis Kataev.Referenzen: #4713
[orm] [bug] ¶
Behob einen Fehler, bei dem eine Many-to-One-Beziehung, die
uselist=Trueangab, bei einer Änderung des Primärschlüssels, bei der sich eine verwandte Spalte ändern musste, nicht korrekt aktualisiert wurde.Referenzen: #4772
[orm] [bug] ¶
Behob einen Fehler, bei dem die Erkennung von Many-to-One- oder One-to-One-Verwendung mit einer „dynamischen“ Beziehung, die eine ungültige Konfiguration ist, nicht auslöste, wenn die Beziehung mit
uselist=Truekonfiguriert war. Die aktuelle Korrektur besteht darin, dass eine Warnung ausgegeben wird, anstatt einen Fehler auszulösen, da dies andernfalls rückwärtskompatibel wäre; in einer zukünftigen Version wird jedoch ein Fehler ausgelöst.Referenzen: #4772
[orm] [bug] ¶
Behob einen Fehler, bei dem ein Synonym, das gegen ein noch nicht vorhandenes zugeordnetes Attribut erstellt wurde, wie es der Fall ist, wenn es auf eine Backref verweist, bevor Mappers konfiguriert sind, Rekursionsfehler auslöste, wenn versucht wurde, Attribute darauf zu testen, die letztendlich nicht existieren (wie es bei der Verarbeitung von Klassen durch Sphinx Autodoc geschieht), da der unkonfigurierte Zustand des Synonyms es in eine Endlosschleife „Attribut nicht gefunden“ versetzen würde.
Referenzen: #4767
engine¶
[engine] [bug] ¶
Behob einen Fehler, bei dem die Verwendung von Reflexionsfunktionen wie
MetaData.reflect()mit einemEngine-Objekt, auf das Ausführungsoptionen angewendet wurden, fehlschlug, da das resultierendeOptionEngineProxy-Objekt kein Attribut.engineenthielt, das in den Reflexionsroutinen verwendet wurde.Referenzen: #4754
sql¶
[sql] [bug] ¶
Angepasste die Initialisierung für
Enum, um zu minimieren, wie oft das Attribut.__members__eines gegebenen PEP-435-Enumerationsobjekts aufgerufen wird, um Fälle zu berücksichtigen, in denen dieses Attribut teuer auszuführen ist, wie es bei einigen beliebten externen Enumerationsbibliotheken der Fall ist.Referenzen: #4758
[sql] [bug] [postgresql] ¶
Behob ein Problem, bei dem die
array_agg-Konstruktion in Kombination mitFunctionElement.filter()nicht die korrekte Operatorrangfolge in Kombination mit dem Array-Index-Operator erzeugte.Referenzen: #4760
[sql] [bug] ¶
Behob ein unwahrscheinliches Problem, bei dem die Routine für die „korrespondierende Spalte“ für Unions und andere
_selectable.CompoundSelect-Objekte in einigen überlappenden Spaltensituationen die falsche Spalte zurückgeben konnte, was möglicherweise einige ORM-Operationen beeinträchtigt, wenn Mengenoperationen verwendet werden, da ein zwischengespeicherter Wert nicht gelöscht wurde.Referenzen: #4747
postgresql¶
[postgresql] [usecase] ¶
Hinzugefügte Unterstützung für die Reflexion von Indizes auf PostgreSQL partitionierten Tabellen, die ab Version 11 zu PostgreSQL hinzugefügt wurde.
Referenzen: #4771
[postgresql] [usecase] ¶
Hinzugefügte Unterstützung für mehrdimensionale Postgresql-Array-Literale durch Verschachtelung des
array-Objekts innerhalb eines anderen. Der mehrdimensionale Array-Typ wird automatisch erkannt.Siehe auch
Referenzen: #4756
mysql¶
[mysql] [bug] ¶
Behob einen Fehler, bei dem die spezielle Logik zum Rendern von „NULL“ für den
TIMESTAMP-Datentyp, wennnullable=Truewar, nicht funktionierte, wenn der Datentyp der Spalte einTypeDecoratoroder einVariantwar. Die Logik stellt nun sicher, dass sie bis zum ursprünglichenTIMESTAMPentpackt wird, damit dieses spezielle NULL-Schlüsselwort korrekt gerendert wird, wenn es angefordert wird.Referenzen: #4743
[mysql] [bug] ¶
Verbesserte das Parsen von MySQL/MariaDB-Versionsstrings, um exotische MariaDB-Versionsstrings zu berücksichtigen, bei denen das Wort „MariaDB“ in andere alphanumerische Zeichen eingebettet ist, wie z. B. „MariaDBV1“. Diese Erkennung ist entscheidend, um API-Funktionen, die zwischen MySQL und MariaDB aufgeteilt wurden, wie die Systemvariable „transaction_isolation“, korrekt zu berücksichtigen.
Referenzen: #4624
sqlite¶
[sqlite] [usecase] ¶
Hinzugefügte Unterstützung für zusammengesetzte (Tupel) IN-Operatoren mit SQLite, indem das VALUES-Schlüsselwort für dieses Backend gerendert wird. Da andere Backends wie DB2 bekannt dafür sind, die gleiche Syntax zu verwenden, wird die Syntax im Basiscompiler über eine Dialekt-Flagge
tuple_in_valuesaktiviert. Die Änderung umfasst auch die Unterstützung für „leere IN-Tupel“-Ausdrücke für SQLite, wenn „in_()“ zwischen einem Tupelwert und einer leeren Menge verwendet wird.Referenzen: #4766
mssql¶
[mssql] [bug] ¶
Sichergestellt, dass die Abfragen zur Reflexion von Indizes und Ansichtdefinitionen explizit String-Parameter in NVARCHAR CASTen, da viele SQL Server-Treiber Zeichenkettenwerte, insbesondere solche mit Nicht-ASCII-Zeichen oder längere Zeichenkettenwerte, häufig als TEXT behandeln, was aus irgendeinem Grund oft nicht korrekt mit VARCHAR-Zeichen in den Information-Schema-Tabellen von SQL Server verglichen wird. Diese CAST-Operationen finden bereits für Reflexionsabfragen gegen
information_schema.-Tabellen von SQL Server statt, fehlten jedoch in drei zusätzlichen Abfragen, die gegensys.-Tabellen gerichtet sind.Referenzen: #4745
1.3.5¶
Veröffentlicht: 17. Juni 2019orm¶
[orm] [bug] ¶
Behob eine Reihe verwandter Fehler bezüglich joined table inheritance, die mehr als zwei Ebenen tief waren, in Verbindung mit der Änderung von Primärschlüsselwerten, wobei diese Primärschlüsselspalten auch in einer Fremdschlüsselbeziehung verknüpft sind, wie es für joined table inheritance typisch ist. Die Zwischen-Tabelle in einer dreistufigen Vererbungshierarchie erhält nun ein UPDATE, wenn sich nur der Primärschlüsselwert geändert hat und passive_updates=False (z. B. Fremdschlüssel-Constraints werden nicht erzwungen), während sie zuvor übersprungen wurde; ebenso wird bei passive_updates=True (z. B. ON UPDATE CASCADE in Kraft) die Drittstufen-Tabelle kein UPDATE-Statement erhalten, wie es zuvor der Fall war und zu einem Fehler führen würde, da CASCADE es bereits geändert hat. In einem verwandten Problem wird eine Beziehung, die über den Primärschlüssel einer Zwischen-Tabelle einer joined-inheritance-Hierarchie mit einer dreistufigen Vererbungshierarchie verknüpft ist, ebenfalls korrekt ihre Fremdschlüsselspalte aktualisieren, wenn der Primärschlüssel des übergeordneten Objekts geändert wird, auch wenn dieses übergeordnete Objekt eine Unterklasse der verknüpften übergeordneten Klasse ist, während diese Klassen zuvor nicht gezählt wurden.
Referenzen: #4723
[orm] [bug] ¶
Behob einen Fehler, bei dem der Zugriff
Mapper.all_orm_descriptorseinen Eintrag für denMapperselbst unter dem deklarativen Schlüssel__mapper__zurückgab, obwohl dies kein Deskriptor ist. Das Flag.is_attribute, das auf allenInspectionAttr-Objekten vorhanden ist, wird nun konsultiert, was auch für einen Assoziationsproxy aufTruegesetzt wurde, da es zuvor fälschlicherweise aufFalsefür dieses Objekt gesetzt war.Referenzen: #4729
[orm] [bug] ¶
Behob eine Regression in
Query.join(), bei der das Flagaliased=Truedie Klauselanpassung für Filterkriterien nicht richtig anwandte, wenn zuvor ein Join zur selben Entität durchgeführt wurde. Dies lag daran, dass die Adapter in der falschen Reihenfolge platziert waren. Die Reihenfolge wurde umgekehrt, sodass der Adapter des zuletzt aufgerufenenaliased=TrueAufrufs Vorrang hat, wie es in 1.2 und früheren Versionen der Fall war. Dies brach unter anderem die „elementtree“-Beispiele.Referenzen: #4704
[orm] [bug] [py3k] ¶
Ersetzte die Python-Kompatibilitätsroutinen für
getfullargspec()durch eine vollständig integrierte Version von Python 3.3. Ursprünglich gab Python in Python 3.8-Alphas Deprecation-Warnungen für diese Funktion aus. Obwohl diese Änderung rückgängig gemacht wurde, wurde festgestellt, dass Python 3-Implementierungen fürgetfullargspec()ab der Serie 3.4, wo sie gegenSignatureneu geschrieben wurde, um eine Größenordnung langsamer sind. Während Python plant, diese Situation zu verbessern, verwenden SQLAlchemy-Projekte vorerst eine einfache Ersetzung, um zukünftige Probleme zu vermeiden.Referenzen: #4674
[orm] [bug] ¶
Überarbeitete die Attributmechanismen, die von
AliasedClassverwendet werden, sodass nicht mehr__getattribute__auf dem MRO der umschlossenen Klasse aufgerufen wird. Stattdessen wird das Attribut normal auf der umschlossenen Klasse mittels getattr() aufgelöst und dann entpackt/angepasst. Dies ermöglicht eine größere Bandbreite von Attributstilen auf der zugeordneten Klasse, einschließlich spezieller__getattr__()-Schemata; es macht den Code aber auch im Allgemeinen einfacher und robuster.Referenzen: #4694
sql¶
[sql] [bug] ¶
Behandelte eine Reihe von Problemen bei der Anführungszeichensetzung, die aus der Verwendung des Konstrukts
literal_column`()resultierten. Wenn dieses Konstrukt über eine Unterabfrage "proxy-fähig" gemacht und mit einem Label referenziert wurde, das mit seinem Text übereinstimmte, wurden auf das Label keine Anführungszeichenregeln angewendet, selbst wenn der String imLabelmithilfe einesquoted_name`-Konstrukts eingerichtet wurde. Das Nichtanwenden von Anführungszeichen auf den Text desLabelist ein Fehler, da dieser Text streng genommen ein SQL-Bezeichnername und keine SQL-Expression ist und der String nicht bereits Anführungszeichen enthalten sollte, im Gegensatz zuliteral_column(), auf das er angewendet werden kann. Das bestehende Verhalten eines nicht beschriftetenliteral_column(), das unverändert außerhalb einer Unterabfrage weitergegeben wird, wird beibehalten, um manuelle Anführungszeichenschemata zu unterstützen, obwohl unklar ist, ob für ein solches Konstrukt in jedem Fall gültiges SQL generiert werden kann.Referenzen: #4730
postgresql¶
[postgresql] [usecase] ¶
Unterstützung für Spaltensortierungsflags beim Reflektieren von Indizes für PostgreSQL hinzugefügt, einschließlich ASC, DESC, NULLSFIRST, NULLS LAST. Dies erweitert auch das Reflexionssystem im Allgemeinen, das in zukünftigen Versionen auf andere Dialekte angewendet werden kann. Pull Request von Eli Collins.
Referenzen: #4717
[postgresql] [bug] ¶
Behobenen Fehler, bei dem der PostgreSQL-Dialekt einen ENUM-Datentyp ohne Mitglieder nicht korrekt reflektieren konnte, indem eine Liste mit
Nonefür den Aufrufget_enums()zurückgegeben und ein TypeError beim Reflektieren einer Spalte mit einem solchen Datentyp ausgelöst wurde. Die Inspektion gibt nun eine leere Liste zurück.Referenzen: #4701
mysql¶
1.3.4¶
Veröffentlicht: 27. Mai 2019orm¶
[orm] [bug] ¶
Behobenen Problem, bei dem das Flag
AttributeEvents.active_historyfür einen Ereignis-Listener, der über das FlagAttributeEvents.propagatean eine Unterklasse weitergegeben wurde, nicht gesetzt wurde. Dieser Fehler bestand während der gesamten Lebensdauer desAttributeEvents-Systems.Referenzen: #4695
[orm] [bug] ¶
Behobenen Regression, bei der das neue Assoziations-Proxy-System immer noch keine Hybrid-Attribute proxyte, wenn diese den Dekorator
@hybrid_property.expressionverwendeten, um eine alternative SQL-Expression zurückzugeben, oder wenn das Hybrid-Objekt ein beliebigesPropComparatorauf Expressionsebene zurückgab. Dies beinhaltete eine weitere Verallgemeinerung der Heuristiken zur Erkennung des proxyten Objekttyps auf Ebene vonQueryableAttribute, um besser zu erkennen, ob der Deskriptor letztendlich zu gemappten Klassen oder Spalten-Expressions dient.Referenzen: #4690
[orm] [bug] ¶
Den Mapper „configure mutex“ auf den deklarativen Klassenmapping-Prozess angewendet, um den Wettlauf zu verhindern, der auftreten kann, wenn Mapper verwendet werden, während dynamische Modulimportschemata noch dabei sind, Mapper für zugehörige Klassen zu konfigurieren. Dies schützt nicht vor allen möglichen Wettlaufbedingungen, z. B. wenn der gleichzeitige Import die abhängigen Klassen noch nicht angetroffen hat, schützt jedoch so weit wie möglich innerhalb des SQLAlchemy-Deklarationsprozesses.
Referenzen: #4686
[orm] [bug] ¶
Eine Warnung wird nun für den Fall ausgegeben, dass ein transientes Objekt mit
Session.merge()in die Sitzung zusammengeführt wird, wenn dieses Objekt bereits in derSessiontransient ist. Dies warnt vor dem Fall, dass das Objekt normalerweise doppelt eingefügt würde.Referenzen: #4647
[orm] [bug] ¶
Behobenen Regression in der neuen Logik für den Vergleich von Many-to-One-Beziehungen, die erstmals in Verbesserung des Verhaltens von Many-to-One-Query-Expressions eingeführt wurde, beim Vergleich mit einem Attribut, das als NULL gespeichert ist und sich im Zustand „nicht abgerufen“ in der gemappten Instanz befindet. Da das Attribut keinen expliziten Standardwert hat, muss es standardmäßig NULL sein, wenn es in einer persistenten Einstellung aufgerufen wird.
Referenzen: #4676
engine¶
[engine] [bug] [postgresql] ¶
Der „Rollback“, der während der Dialektinitialisierung auftritt, wurde verschoben, sodass er nach zusätzlichen dialektspezifischen Initialisierungsschritten erfolgt, insbesondere denen des psycopg2-Dialekts, die versehentlich Transaktionsstatus auf der ersten neuen Verbindung hinterließen, was einige psycopg2-spezifische APIs beeinträchtigen könnte, die erfordern, dass keine Transaktion gestartet wird. Pull Request von Matthew Wilkes.
Referenzen: #4663
sql¶
[sql] [bug] ¶
Behobenen Fehler, dass die Klasse
GenericFunctionsich selbst versehentlich als eine der benannten Funktionen registrierte. Pull Request von Adrien Berchet.Referenzen: #4653
[sql] [bug] ¶
Behobenen Problem, bei dem die doppelte Negation einer booleschen Spalte den „NOT“-Operator nicht zurückgesetzt hätte.
Referenzen: #4618
[sql] [bug] ¶
Der Namespace
GenericFunctionwird migriert, sodass Funktionsnamen fallunabhängig gesucht werden, da SQL-Funktionen keine Kollisionen aufgrund von Fallunterschieden aufweisen und dies auch bei benutzerdefinierten Funktionen oder gespeicherten Prozeduren nicht der Fall ist. Suchen nach Funktionen, die mitGenericFunctiondeklariert wurden, verwenden nun ein fallunabhängiges Schema. Es wird jedoch ein Deprecationsfall unterstützt, der es ermöglicht, dass zwei oder mehrGenericFunction-Objekte mit demselben Namen, aber unterschiedlicher Groß- und Kleinschreibung existieren. Dies führt dazu, dass für diesen spezifischen Namen fallabhängige Suchen durchgeführt werden, während bei der Registrierung der Funktion eine Warnung ausgegeben wird. Vielen Dank an Adrien Berchet für die umfangreiche Arbeit an diesem komplexen Feature.Referenzen: #4569
postgresql¶
mysql¶
[mysql] [bug] ¶
Unterstützung für DROP CHECK-Constraint hinzugefügt, das für MySQL 8.0.16 zum Löschen eines CHECK-Constraints erforderlich ist; MariaDB unterstützt Plain DROP CONSTRAINT. Die Logik unterscheidet zwischen den beiden Syntaxen, indem sie die Serverversionszeichenfolge auf die Anwesenheit von MariaDB prüft. Alembic-Migrationen hatten dieses Problem bereits durch die Implementierung eines eigenen DROP für MySQL / MariaDB CHECK-Constraints umgangen. Diese Änderung implementiert es nun direkt in Core, sodass es allgemein verfügbar ist. Pull Request von Hannes Hansen.
Referenzen: #4650
mssql¶
[mssql] [feature] ¶
Unterstützung für SQL Server gefilterte Indizes hinzugefügt, über den Parameter
mssql_where, der ähnlich wie diepostgresql_where-Indexfunktion im PostgreSQL-Dialekt funktioniert.Siehe auch
Referenzen: #4657
[mssql] [bug] ¶
Fehlercode 20047 zu „is_disconnect“ für pymssql hinzugefügt. Pull Request von Jon Schuff.
Referenzen: #4680
misc¶
1.3.3¶
Veröffentlicht: 15. April 2019orm¶
[orm] [bug] ¶
Behobenen 1.3-Regression in der neuen Abfrage-Logik für „mehrdeutige FROMs“, die in Query.join() behandelt Mehrdeutigkeit bei der Entscheidung der „linken“ Seite expliziter eingeführt wurde, bei der eine
Query, die eine Entität explizit mitQuery.select_from()in die FROM-Klausel einfügt und sich auch mitQuery.join()mit dieser verbindet, später eine „mehrdeutige FROM“-Fehlermeldung verursachen würde, wenn diese Entität in zusätzlichen Joins verwendet würde, da die Entität zweimal in der „from“-Liste derQueryerscheint. Die Korrektur löst diese Mehrdeutigkeit, indem die eigenständige Entität in den Join, zu dem sie bereits gehört, eingefügt wird, so wie es letztendlich geschieht, wenn die SELECT-Anweisung gerendert wird.Referenzen: #4584
[orm] [bug] ¶
Die Methode
Query.filter_by()wurde so angepasst, dass sie nicht internand()gegen mehrere Kriterien aufruft, sondern diese als Reihe von Kriterien anQuery.filter()übergibt, anstatt als ein einzelnes Kriterium. Dies ermöglichtQuery.filter_by(), die Behandlung von variablen Klauseln durchQuery.filter()zu übernehmen, einschließlich des Falls, in dem die Liste leer ist. In diesem Fall hat dasQuery-Objekt keine.whereclause, was nachfolgenden Methoden ohne whereclause wieQuery.select_from()ermöglicht, konsistent zu arbeiten.Referenzen: #4606
postgresql¶
[postgresql] [bug] ¶
Behobenen Regression aus Version 1.3.2, verursacht durch #4562, bei der eine URL, die nur eine Query-Zeichenfolge und keinen Hostnamen enthielt, wie z. B. zur Angabe einer Service-Datei mit Verbindungsinformationen, nicht mehr ordnungsgemäß an psycopg2 weitergegeben wurde. Die Änderung in #4562 wurde angepasst, um den genauen Anforderungen von psycopg2 besser gerecht zu werden, nämlich dass, wenn überhaupt Verbindungsparameter vorhanden sind, der Parameter „dsn“ nicht mehr erforderlich ist. In diesem Fall werden die Query-String-Parameter allein übergeben.
Referenzen: #4601
mssql¶
[mssql] [bug] ¶
Behobenen Problem im SQL Server-Dialekt, bei dem, wenn ein gebundener Parameter in einer ORDER BY-Expression vorhanden war, die letztendlich nicht in der SQL Server-Version der Anweisung gerendert wurde, die Parameter dennoch Teil der Ausführungsparameter waren, was zu DBAPI-Fehlern führte. Pull Request von Matt Lewellyn.
Referenzen: #4587
misc¶
[bug] [pool] ¶
Behobenen Verhaltensregression infolge der Deprekation des Flags „use_threadlocal“ für
Pool, bei derSingletonThreadPooldiese Option nicht mehr verwendet, was dazu führt, dass die Logik „Rollback bei Rückgabe“ stattfindet, wenn dasselbeEnginemehrmals im Kontext einer Transaktion verwendet wird, um eine Verbindung herzustellen oder implizit auszuführen, wodurch die Transaktion abgebrochen wird. Obwohl dies nicht der empfohlene Weg ist, mit Engines und Verbindungen zu arbeiten, handelt es sich dennoch um eine verwirrende Verhaltensänderung, da bei Verwendung vonSingletonThreadPooldie Transaktion offen bleiben sollte, unabhängig davon, was sonst mit derselben Engine im selben Thread geschieht. Das Flaguse_threadlocalist weiterhin veraltet, jedoch implementiertSingletonThreadPoolnun eine eigene Version derselben Logik.Referenzen: #4585
[bug] [ext] ¶
Behobenen Fehler, bei dem die Verwendung von
copy.copy()odercopy.deepcopy()aufMutableListdazu führte, dass die Elemente in der Liste dupliziert wurden, aufgrund einer Inkonsistenz in der Art und Weise, wie Python Pickle und Copy beide__getstate__()und__setstate__()bezüglich Listen verwenden. Um dies zu beheben, musste eine__reduce_ex__-Methode zuMutableListhinzugefügt werden. Um die Abwärtskompatibilität mit bestehenden Pickle-Objekten, die auf__getstate__()basieren, zu gewährleisten, bleibt die__setstate__()-Methode ebenfalls erhalten; die Testsuite stellt sicher, dass Pickle-Objekte, die mit der alten Version der Klasse erstellt wurden, immer noch vom Pickle-Modul deserialisiert werden können.Referenzen: #4603
1.3.2¶
Veröffentlicht: 2. April 2019orm¶
[orm] [bug] [ext] ¶
Instanzebene Unterstützung für einfache Python-Deskriptoren, z. B.
@property-Objekte, in Verbindung mit Assoziations-Proxys wiederhergestellt, sodass, wenn das proxyte Objekt überhaupt nicht im ORM-Geltungsbereich liegt, es als „mehrdeutig“ klassifiziert wird, aber direkt proxyed wird. Für den Zugriff auf Klassenebene gibt ein grundlegendes Klassen-Level``__get__()`` nun direktAmbiguousAssociationProxyInstancezurück, anstatt seine Ausnahme auszulösen, was die engste Annäherung an das vorherige Verhalten ist, dasAssociationProxyselbst zurückgab, die möglich ist. Außerdem wurde die Stringifizierung dieser Objekte verbessert, um den aktuellen Zustand genauer zu beschreiben.[orm] [bug] ¶
Behobenen Fehler, bei dem die Verwendung von
with_polymorphic()oder anderen aliasen Konstrukten nicht ordnungsgemäß angepasst wurde, wenn das aliase Ziel alsSelect.correlate_except()-Ziel einer Unterabfrage innerhalb einercolumn_property()verwendet wurde. Dies erforderte eine Korrektur der Klauselanpassungsmechanismen, um ein wählbares Element, das in der Liste „correlate except“ erscheint, ordnungsgemäß zu behandeln, ähnlich wie bei wählbaren Elementen, die in der Liste „correlate“ erscheinen. Dies ist letztendlich ein ziemlich grundlegender Fehler, der schon lange besteht, aber schwer zu finden ist.Referenzen: #4537
[orm] [bug] ¶
Behobenen Regression, bei der eine neue Fehlermeldung, die beim Versuch, eine Beziehungsoption mit einer AliasedClass ohne Verwendung von
PropComparator.of_type()zu verknüpfen, ausgelöst werden sollte, stattdessen einenAttributeErrorauslöste. Beachten Sie, dass es in 1.3 nicht mehr zulässig ist, einen Optionspfad von einer einfachen Mapper-Beziehung zu einerAliasedClasszu erstellen, ohnePropComparator.of_type()zu verwenden.Referenzen: #4566
sql¶
[sql] [bug] [documentation] ¶
Dank TypeEngine-Methoden bind_expression, column_expression arbeiten mit Variant, typspezifischen Typen müssen wir uns nicht mehr auf Rezepte verlassen, die direkt von dialektspezifischen Typen abgeleitet sind.
TypeDecoratorkann nun alle Fälle behandeln. Zusätzlich erschwerte die obige Änderung die direkte Ableitung von einem Basis-SQLAlchemy-Typ, was irreführend sein konnte. Die Dokumentation wurde aktualisiert, umTypeDecoratorfür diese Beispiele zu verwenden, einschließlich des PostgreSQL „ArrayOfEnum“-Beispieldatentyps, und die direkte Unterstützung für das „Ableiten eines Typs direkt“ wurde entfernt.Referenzen: #4580
postgresql¶
[postgresql] [feature] ¶
Unterstützung für parameterlose Verbindungs-URLs für den psycopg2-Dialekt hinzugefügt. Das bedeutet, die URL kann an
create_engine()als"postgresql+psycopg2://"ohne zusätzliche Argumente übergeben werden, um ein leeres DSN an libpq anzuzeigen, was eine Verbindung zu „localhost“ ohne Benutzername, Passwort oder Datenbank bedeutet. Pull Request von Julian Mehnle.Referenzen: #4562
[postgresql] [bug] ¶
Den Parameter
Select.with_for_update.ofmodifiziert, sodass, wenn ein Join oder ein anderes zusammengesetztes wählbares Element übergeben wird, die einzelnenTable-Objekte daraus gefiltert werden. Dies ermöglicht die Übergabe eines Join()-Objekts an den Parameter, wie es normalerweise bei der Verwendung von joined table inheritance mit dem ORM geschieht. Pull Request von Raymond Lu.Referenzen: #4550
1.3.1¶
Veröffentlicht: 9. März 2019orm¶
mssql¶
[mssql] [bug] ¶
Ein Commit() wird nach einer Änderung des Isolationsgrads auf SNAPSHOT ausgegeben, da sowohl pyodbc als auch pymssql eine implizite Transaktion öffnen, die nachfolgende SQL-Anweisungen in der aktuellen Transaktion blockiert.
Diese Änderung wird auch **zurückportiert** auf: 1.2.19
Referenzen: #4536
[mssql] [bug] ¶
Behobenen Regression in der SQL Server-Reflexion aufgrund von #4393, bei der die Entfernung von offenen
**kwaus demFloat-Datentyp die Reflexion dieses Typs aufgrund eines übergebenen „scale“-Arguments zum Fehlschlag brachte.Referenzen: #4525
1.3.0¶
Veröffentlicht: 4. März 2019orm¶
[orm] [feature] ¶
Die Methode
Query.get()kann nun ein Dictionary von Attributschlüsseln und -werten als Mittel zur Angabe des zu ladenden Primärschlüsselwerts akzeptieren; dies ist besonders nützlich für zusammengesetzte Primärschlüssel. Pull Request von Sanjana S.Referenzen: #4316
[orm] [feature] ¶
Eine SQL-Expression kann nun einem Primärschlüsselattribut für einen ORM-Flush auf die gleiche Weise zugewiesen werden wie normale Attribute, wie in Einbettung von SQL INSERT/UPDATE-Expressions in einen Flush beschrieben, wo die Expression ausgewertet und dann über RETURNING an das ORM zurückgegeben wird, oder im Fall von pysqlite funktioniert sie über das Attribut cursor.lastrowid. Erfordert entweder eine Datenbank, die RETURNING unterstützt (z. B. Postgresql, Oracle, SQL Server), oder pysqlite.
Referenzen: #3133
engine¶
[engine] [feature] ¶
Die Formatierung für
StatementErrorbei der Stringifizierung wurde überarbeitet. Jedes Fehlerdetail wird auf mehrere Zeilen aufgeteilt, anstatt auf einer einzigen Zeile angeordnet zu sein. Zusätzlich rendert die SQL-Darstellung nun die SQL-Anweisung als String und verwendet nichtrepr(), sodass neue Zeilen wie sie sind gerendert werden. Pull Request von Nate Clark.Referenzen: #4500
sql¶
[sql] [bug] ¶
Die Klasse
Aliasund verwandte Unterklassen wieCTE,LateralundTableSamplewurden überarbeitet, sodass es nicht mehr möglich ist, die Objekte direkt zu konstruieren. Diese Konstrukte erfordern die Verwendung der Standalone-Konstruktionsfunktion oder der wählbaren Methode, um neue Objekte zu instanziieren.Referenzen: #4509
schema¶
[schema] [feature] ¶
Neue Parameter
Table.resolve_fksundMetaData.reflect.resolve_fkshinzugefügt, die, wenn auf False gesetzt, die automatische Reflexion von verwandten Tabellen, die inForeignKey-Objekten angetroffen werden, deaktivieren. Dies kann sowohl den SQL-Overhead für weggelassene Tabellen reduzieren als auch Tabellen vermeiden, die aus datenbankspezifischen Gründen nicht reflektiert werden können. ZweiTable-Objekte, die sich in derselbenMetaData-Sammlung befinden, können immer noch aufeinander verweisen, auch wenn die Reflexion der beiden Tabellen separat erfolgte.Referenzen: #4517
1.3.0b3¶
Veröffentlicht: 8. Februar 2019orm¶
[orm] [bug] ¶
Das Verhalten von
with_polymorphic()in Verbindung mit Loader-Optionen, insbesondere mit Wildcard-Operationen sowieload_only(), wurde verbessert. Das polymorphe Objekt wird genauer adressiert, sodass spaltenbasierte Optionen für die Entität korrekt greifen. Das Problem ist eine Fortsetzung derselben Art von Korrekturen, die in #4468 vorgenommen wurden.Referenzen: #4469
orm declarative¶
[orm] [declarative] [bug] ¶
Einige Hilfsexzeptionsklassen wurden hinzugefügt, die ausgelöst werden, wenn eine Abbildung basierend auf
AbstractConcreteBase,DeferredReflectionoderAutoMapverwendet wird, bevor die Abbildung bereit ist, verwendet zu werden. Diese Ausnahmen enthalten aussagekräftige Informationen über die Klasse, anstatt in andere weniger aussagekräftige Fehlermodi zu fallen.Referenzen: #4470
sql¶
[sql] [bug] ¶
Das Verhalten, dass Strings, die direkt als Komponenten eines
select()- oderQuery-Objekts übergeben werden, automatisch zutext()-Konstrukten koerziert wird, wurde vollständig entfernt. Die bisher ausgegebene Warnung ist nun einArgumentErroroder im Falle vonorder_by()/group_by()einCompileError. Dies hat seit Version 1.0 eine Warnung ausgegeben, aber seine Existenz birgt weiterhin Bedenken hinsichtlich des Missbrauchs dieses Verhaltens.Beachten Sie, dass für
order_by()/group_by()öffentliche CVEs veröffentlicht wurden, die durch diesen Commit behoben werden: CVE-2019-7164 CVE-2019-7548Referenzen: #4481
[sql] [bug] ¶
Das Quoting wird auf
Function-Namen angewendet, die üblicherweise, aber nicht notwendigerweise, aus demsqlalchemy.sql.expression.func-Konstrukt generiert werden, zur Kompilierungszeit, wenn sie illegale Zeichen wie Leerzeichen oder Satzzeichen enthalten. Die Namen werden wie bisher als nicht case-sensitiv behandelt, was bedeutet, dass das alleinige Vorhandensein von Groß- oder gemischten Groß-/Kleinschreibungszeichen kein Quoting auslöst. Die Nicht-Case-Sensitivität wird derzeit aus Kompatibilitätsgründen beibehalten.Referenzen: #4467
[sql] [bug] ¶
„SQL-Phrasengültigkeitsprüfung“ wurde zu wichtigen DDL-Phrasen hinzugefügt, die als einfache Strings akzeptiert werden, darunter
ForeignKeyConstraint.on_delete,ForeignKeyConstraint.on_update,ExcludeConstraint.using,ForeignKeyConstraint.initially, für Bereiche, in denen nur eine Reihe von SQL-Schlüsselwörtern erwartet wird. Alle Nicht-Leerzeichen-Zeichen, die darauf hindeuten, dass die Phrase gequotet werden müsste, lösen einenCompileErroraus. Diese Änderung steht im Zusammenhang mit der Reihe von Änderungen, die im Rahmen von #4481 vorgenommen wurden.Referenzen: #4481
postgresql¶
[postgresql] [bug] ¶
Problem behoben, bei dem die Verwendung eines Großbuchstaben-Namens für einen Indextyp (z. B. GIST, BTREE usw.) oder eine EXCLUDE-Beschränkung diesen als zu quotierenden Bezeichner behandelte, anstatt ihn so auszugeben, wie er ist. Das neue Verhalten wandelt diese Typen in Kleinbuchstaben um und stellt sicher, dass sie nur gültige SQL-Zeichen enthalten.
Referenzen: #4473
tests¶
misc¶
[bug] [ext] ¶
Eine umfassendere Zuweisungsoperation (z. B. „Bulk-Replace“) wurde implementiert, wenn ein Association Proxy mit Sets oder Dictionaries verwendet wird. Behebt das Problem, dass redundante Proxy-Objekte erstellt werden, um die alten zu ersetzen, was zu übermäßigen Ereignissen und SQL führt und im Falle von Unique Constraints dazu führt, dass der Flush fehlschlägt.
Referenzen: #2642
1.3.0b2¶
Veröffentlicht: 25. Januar 2019general¶
[general] [change] ¶
Eine umfangreiche Änderung in der gesamten Bibliothek hat sichergestellt, dass alle als veraltet oder Legacy gekennzeichneten Objekte, Parameter und Verhaltensweisen nun
DeprecationWarning-Warnungen ausgeben, wenn sie aufgerufen werden. Da der Python 3 Interpreter standardmäßig Deprecation Warnings anzeigt und moderne Test-Frameworks wie tox und pytest dazu neigen, Deprecation Warnings anzuzeigen, sollte diese Änderung es einfacher machen, veraltete API-Features zu erkennen. Ein Hauptgrund für diese Änderung ist, dass lang veraltete Features, die dennoch weiterhin in der Praxis verwendet werden, in naher Zukunft endlich entfernt werden können; das größte Beispiel hierfür sind die KlassenSessionExtensionundMapperExtensionsowie eine Handvoll anderer Pre-Event-Extension-Hooks, die seit Version 0.7 veraltet sind, aber immer noch in der Bibliothek vorhanden sind. Ein weiterer Grund ist, dass mehrere langjährige Hauptverhaltensweisen ebenfalls als veraltet gekennzeichnet werden, darunter die Thread-Local-Engine-Strategie, dasconvert_unicode-Flag und Non-Primary-Mappers.Siehe auch
Deprecation Warnings werden für alle veralteten Elemente ausgegeben; neue Veralterungen hinzugefügt
Referenzen: #4393
orm¶
[orm] [feature] ¶
Eine neue Funktion wurde implementiert, bei der der
AliasedClass-Konstrukt nun als Ziel einerrelationship()verwendet werden kann. Dies macht das Konzept der „Non-Primary-Mappers“ überflüssig, da dieAliasedClasseinfacher zu konfigurieren ist und automatisch alle Beziehungen der abgebildeten Klasse erbt, während die Möglichkeit für Loader-Optionen, normal zu funktionieren, erhalten bleibt.Referenzen: #4423
[orm] [feature] ¶
Ein neues Ereignis
MapperEvents.before_mapper_configured()wurde hinzugefügt. Dieses Ereignis ergänzt die anderen „configure“-Stage Mapper-Ereignisse mit einem per-Mapper-Ereignis, das jedenMapperkurz vor seinem Konfigurationsschritt empfängt und zusätzlich verwendet werden kann, um die Konfiguration bestimmterMapper-Objekte durch einen neuen Rückgabewertinterfaces.EXT_SKIPzu verhindern oder zu verzögern. Siehe den Dokumentationslink für ein Beispiel.Siehe auch
Referenzen: #4397
[orm] [change] ¶
Eine neue Funktion
close_all_sessions()wurde hinzugefügt, die die Aufgabe der MethodeSession.close_all()übernimmt, die nun als veraltet gilt, da sie als Klassenmethode verwirrend ist. Pull-Request von Augustin Trancart.Referenzen: #4412
[orm] [bug] ¶
Langjähriges Problem behoben, bei dem doppelte Sammlungsmitglieder dazu führten, dass ein Backref die Verbindung zwischen dem Mitglied und seinem übergeordneten Objekt löschte, wenn eines der Duplikate entfernt wurde, was als Nebeneffekt des Austauschs zweier Objekte in einer Anweisung geschah.
Siehe auch
Many-to-one Backref prüft auf doppelte Sammlungsmitglieder während des Entfernungsvorgangs
Referenzen: #1103
[orm] [bug] ¶
Die Korrektur, die erstmals im Rahmen von #3287 vorgenommen wurde, bei der eine auf einer Unterklasse mit einem Wildcard angewendete Loader-Option sich selbst erweiterte, um die Anwendung des Wildcards auch auf Attribute der Oberklassen auszudehnen, wurde nun auf eine „gebundene“ Loader-Option erweitert, z. B. in einem Ausdruck wie
Load(SomeSubClass).load_only('foo'). Spalten, die Teil der Oberklasse vonSomeSubClasssind, werden ebenfalls auf die gleiche Weise ausgeschlossen, als ob die ungebundene Optionload_only('foo')verwendet worden wäre.Referenzen: #4373
[orm] [bug] ¶
Verbesserte Fehlermeldungen, die vom ORM im Bereich der Loader-Options-Traversal ausgegeben werden. Dies beinhaltet die frühzeitige Erkennung von nicht übereinstimmenden Loader-Strategien sowie eine klarere Erklärung, warum diese Strategien nicht übereinstimmen.
Referenzen: #4433
[orm] [bug] ¶
Das „remove“-Ereignis für Sammlungen wird nun vor dem Entfernen des Elements aufgerufen, im Falle der Methode
collection.remove(), wie es für die meisten anderen Formen der Entfernung von Sammlungs-Elementen konsistent ist (wie z. B.__delitem__, Ersetzung unter__setitem__). Fürpop()-Methoden wird das remove-Ereignis immer noch nach der Operation ausgelöst.[orm] [bug] [engine] ¶
Zugriffsmethoden für Ausführungsoptionen wurden zu Core und ORM hinzugefügt, über
Query.get_execution_options(),Connection.get_execution_options(),Engine.get_execution_options()undExecutable.get_execution_options(). PR von Daniel Lister.Referenzen: #4464
[orm] [bug] ¶
Problem bei Association Proxy behoben, das aufgrund von #3423 dazu führte, dass die Verwendung von benutzerdefinierten
PropComparator-Objekten mit Hybrid-Attributen, wie dem im Beispieldictlike-polymorphicgezeigten, innerhalb eines Association Proxy nicht funktionierte. Die in #3423 hinzugefügte Striktheit wurde gelockert, und zusätzliche Logik zur Berücksichtigung eines Association Proxy, der auf einen benutzerdefinierten Hybrid verweist, wurde hinzugefügt.Referenzen: #4446
[orm] [bug] ¶
Die Methode
.get_history(), die auch die Verfügbarkeit vonAttributeState.historyimpliziert, wurde fürsynonym()-Attribute implementiert. Zuvor würde der Versuch, die Attributhistorie über ein Synonym abzurufen, einenAttributeErrorauslösen.Referenzen: #3777
orm declarative¶
[bug] [orm declarative] ¶
Eine
__clause_element__()-Methode wurde zuColumnPropertyhinzugefügt, die die Verwendung einer nicht vollständig deklarierten Spalte oder eines verzögerten Attributs in einer deklarativ abgebildeten Klasse etwas benutzerfreundlicher gestaltet, wenn sie in einer Beschränkung oder einem anderen spaltenorientierten Szenario innerhalb der Klassendeklaration verwendet wird. Dies kann jedoch immer noch nicht in offen definierten Ausdrücken funktionieren; rufen Sie stattdessen das AttributColumnProperty.expressionauf, wenn Sie einenTypeErrorerhalten.Referenzen: #4372
engine¶
[engine] [feature] ¶
Eine öffentliche Zugriffsmethode
QueuePool.timeout()wurde hinzugefügt, die das konfigurierte Timeout für einQueuePool-Objekt zurückgibt. Pull-Request von Irina Delamare.Referenzen: #3689
[engine] [change] ¶
Die „Threadlocal“-Engine-Strategie, die seit etwa Version 0.2 ein Legacy-Feature von SQLAlchemy ist, ist nun veraltet, zusammen mit dem Parameter
Pool.threadlocalvonPool, der in den meisten modernen Anwendungsfällen keine Wirkung hat.Siehe auch
Referenzen: #4393
sql¶
[sql] [feature] ¶
Die Klasse
AnsiFunction, die Basis gängiger SQL-Funktionen wieCURRENT_TIMESTAMP, wurde so geändert, dass sie Positionsargumente wie eine reguläre Ad-hoc-Funktion akzeptiert. Dies geschieht, um dem Fall gerecht zu werden, dass viele dieser Funktionen auf bestimmten Backends Argumente wie „Nachkommastellenpräzision“ akzeptieren. Wenn die Funktion mit Argumenten erstellt wird, werden die Klammern und die Argumente gerendert. Wenn keine Argumente vorhanden sind, generiert der Compiler die Form ohne Klammern.Referenzen: #4386
[sql] [change] ¶
Die Parameter
create_engine.convert_unicodeundString.convert_unicodewurden veraltet. Diese Parameter wurden entwickelt, als die meisten Python DBAPIs wenig bis gar keine Unterstützung für Python Unicode-Objekte hatten und SQLAlchemy die sehr komplexe Aufgabe übernehmen musste, Daten und SQL-Strings performant zwischen Unicode und Bytestrings im gesamten System zu marshaling. Dank Python 3 mussten sich DBAPIs an Unicode-fähige APIs anpassen, und heute unterstützen alle von SQLAlchemy unterstützten DBAPIs Unicode nativ, auch unter Python 2. Dies ermöglicht es, diese langjährige und sehr komplizierte Funktion endlich (weitgehend) zu entfernen. Es gibt natürlich immer noch einige Python 2 Edge Cases, bei denen SQLAlchemy mit Unicode umgehen muss, aber diese werden automatisch gehandhabt; im modernen Gebrauch sollte kein Endbenutzer mit diesen Flags interagieren müssen.Siehe auch
Referenzen: #4393
mssql¶
[mssql] [bug] ¶
Der
literal_processorfür die DatentypenUnicodeundUnicodeTextgibt nun einN-Zeichen vor dem literal string expression aus, wie es von SQL Server für Unicode-Zeichenkettenwerte in SQL-Ausdrücken erforderlich ist.Referenzen: #4442
misc¶
[bug] [ext] ¶
Ein Regression in 1.3.0b1, verursacht durch #3423, wurde behoben. Diese führte dazu, dass Association Proxy-Objekte, die auf ein Attribut zugreifen, das nur auf einer polymorphen Unterklasse vorhanden ist, einen
AttributeErrorauslösten, obwohl die tatsächlich aufgerufene Instanz eine Instanz dieser Unterklasse war.Referenzen: #4401
1.3.0b1¶
Veröffentlicht: 16. November 2018orm¶
[orm] [feature] ¶
Eine neue Funktion
Query.only_return_tuples()wurde hinzugefügt. Sie veranlasst dasQuery-Objekt, bedingungslos Keyed-Tuple-Objekte zurückzugeben, auch wenn die Abfrage auf eine einzelne Entität abzielt. Pull-Request von Eric Atkin.Diese Änderung wird auch **zurückportiert** auf: 1.2.5
[orm] [feature] ¶
Ein neues Flag
Session.bulk_save_objects.preserve_orderwurde zur MethodeSession.bulk_save_objects()hinzugefügt, die standardmäßig auf True gesetzt ist. Wenn sie auf False gesetzt ist, werden die angegebenen Abbildungen nach Objekttyp in Einfüge- und Aktualisierungsgruppen eingeteilt, um größere Möglichkeiten zur Stapelverarbeitung gängiger Operationen zu ermöglichen. Pull-Request von Alessandro Cucci.[orm] [feature] ¶
Die „selectin“-Loader-Strategie lässt nun den JOIN im Falle eines einfachen One-to-Many-Loads weg, wo stattdessen nur von der zugehörigen Tabelle geladen wird, wobei die Fremdschlüsselspalten der zugehörigen Tabelle verwendet werden, um die Primärschlüssel der Elterntabelle abzugleichen. Diese Optimierung kann durch Setzen des Flags
relationship.omit_joinauf False deaktiviert werden. Vielen Dank an Jayson Reis für die Bemühungen hierzu.Referenzen: #4340
[orm] [feature] ¶
Ein
.info-Dictionary wurde zur KlasseInstanceStatehinzugefügt, dem Objekt, das durch Aufruf voninspect()auf einem abgebildeten Objekt entsteht.Referenzen: #4257
[orm] [bug] ¶
Bug behoben, bei dem die Verwendung des
Lateral-Konstrukts in Verbindung mitQuery.join()sowieQuery.select_entity_from()keine Klauselanpassung auf der rechten Seite des Joins anwendete. „Lateral“ führt den Anwendungsfall ein, bei dem die rechte Seite eines Joins korrelierbar ist. Zuvor wurde die Anpassung dieser Klausel nicht berücksichtigt. Beachten Sie, dass in 1.2 nur ein durchQuery.subquery()eingeführter Selektierbarer aufgrund von #4304 immer noch nicht angepasst wird; der Selektierbare muss von der Funktionselect()erzeugt werden, um die rechte Seite des „Lateral“-Joins zu sein.Diese Änderung wird auch **zurückportiert** auf: 1.2.12
Referenzen: #4334
[orm] [bug] ¶
Problem behoben bezüglich
passive_deletes="all", wo das Fremdschlüsselattribut eines Objekts auch nach dem Entfernen des Objekts aus seiner übergeordneten Sammlung seinen Wert behält. Zuvor setzte die Unit of Work dies auf NULL, obwohlpassive_deletesangab, dass es nicht geändert werden sollte.Siehe auch
passive_deletes='all'belässt den FK unverändert für Objekte, die aus der Sammlung entfernt werdenReferenzen: #3844
[orm] [bug] ¶
Verbessertes Verhalten eines beziehungsgebundenen Many-to-One-Objektausdrucks, sodass der Abruf von Spaltenwerten des zugehörigen Objekts nun widerstandsfähig gegen das Ablösen des Objekts von seiner übergeordneten
Sessionist, auch wenn das Attribut abgelaufen ist. Neue Funktionen innerhalb vonInstanceStatewerden verwendet, um den letzten bekannten Wert eines bestimmten Spaltenattributs zu memoizsieren, bevor es abläuft, sodass der Ausdruck immer noch ausgewertet werden kann, wenn das Objekt gleichzeitig abgelöst und abgelaufen ist. Fehlerbedingungen werden ebenfalls mithilfe moderner Attributzustandsfunktionen verbessert, um bei Bedarf spezifischere Meldungen zu erzeugen.Referenzen: #4359
[orm] [bug] [mysql] [postgresql] ¶
Das ORM verdoppelt nun die „FOR UPDATE“-Klausel innerhalb der Subquery, die in einigen Fällen in Verbindung mit joined eager loading gerendert wird, da beobachtet wurde, dass MySQL die Zeilen aus einer Subquery nicht sperrt. Dies bedeutet, dass die Abfrage mit zwei FOR UPDATE-Klauseln gerendert wird; beachten Sie, dass auf einigen Backends wie Oracle FOR UPDATE-Klauseln bei Subqueries stillschweigend ignoriert werden, da sie unnötig sind. Darüber hinaus wird im Fall der „OF“-Klausel, die hauptsächlich mit PostgreSQL verwendet wird, FOR UPDATE nur auf der inneren Subquery gerendert, wenn diese verwendet wird, damit der Selektierbare auf die Tabelle innerhalb der SELECT-Anweisung gezielt werden kann.
Siehe auch
FOR UPDATE-Klausel wird sowohl innerhalb als auch außerhalb der Joined Eager Load Subquery gerendert
Referenzen: #4246
[orm] [bug] ¶
Refactored
Query.join(), um die einzelnen Komponenten der Join-Strukturierung weiter zu verdeutlichen. Dieses Refactoring fügt die Fähigkeit hinzu, dassQuery.join()die am besten geeignete "linke" Seite des Joins bestimmen kann, wenn mehr als ein Element in der FROM-Liste vorhanden ist oder die Abfrage gegen mehrere Entitäten gerichtet ist. Wenn mehr als ein FROM/Entität übereinstimmt, wird ein Fehler ausgelöst, der zur Auflösung der Mehrdeutigkeit die Angabe einer ON-Klausel verlangt. Insbesondere zielt dies auf die Regression ab, die wir in #4363 gesehen haben, ist aber auch allgemein nützlich. Die Codepfade innerhalb vonQuery.join()sind nun leichter nachzuvollziehen und die Fehlerfälle werden früher im Ablauf spezifischer entschieden.Referenzen: #4365
[orm] [bug] ¶
Behoben wurde ein langjähriges Problem in
Query, bei dem eine skalare Unterabfrage, wie sie vonQuery.exists(),Query.as_scalar()und anderen Ableitungen vonQuery.statementerzeugt wird, nicht korrekt angepasst wurde, wenn sie in einer neuenQueryverwendet wurde, die eine Entitätsanpassung erforderte, z. B. wenn die Abfrage in ein Union oder ein from_self() umgewandelt wurde. Die Änderung entfernt die "keine Anpassung"-Annotation aus demselect()-Objekt, das vomQuery.statement-Accessor erzeugt wird.Referenzen: #4304
[orm] [bug] ¶
Eine informative Ausnahme wird erneut ausgelöst, wenn ein Primärschlüsselwert während eines ORM-Flushes unter Python 3 in Python nicht sortierbar ist, z. B. eine
Enumohne__lt__()Methode; normalerweise löst Python 3 in diesem Fall einenTypeErroraus. Der Flush-Prozess sortiert persistente Objekte nach Primärschlüssel in Python, daher müssen die Werte sortierbar sein.Referenzen: #4232
[orm] [bug] ¶
Der von der
MappedCollectionKlasse verwendete Collections-Konverter wurde entfernt. Dieser Konverter diente nur dazu, zu überprüfen, ob die eingehenden Dictionary-Schlüssel mit denen ihrer entsprechenden Objekte übereinstimmen, und das nur während eines Bulk-Set-Vorgangs. Der Konverter kann mit einem benutzerdefinierten Validator oder einemAttributeEvents.bulk_replace()-Listener kollidieren, der eingehende Werte weiter konvertieren möchte. DerTypeError, der von diesem Konverter ausgelöst würde, wenn ein eingehender Schlüssel nicht mit dem Wert übereinstimmte, wurde entfernt; eingehende Werte während einer Massenzuweisung werden mit ihrem werksgenerierten Schlüssel indiziert und nicht mit dem Schlüssel, der explizit im Dictionary vorhanden ist.Insgesamt wird @converter durch den Ereignis-Handler
AttributeEvents.bulk_replace()abgelöst, der als Teil von #3896 hinzugefügt wurde.Referenzen: #3604
[orm] [bug] ¶
Neues Verhalten wurde zum Lazy-Loading hinzugefügt, das beim Abrufen des "alten" Werts eines Many-to-One-Objekts stattfindet, sodass Ausnahmen, die entweder durch
lazy="raise"oder einen Detached-Session-Fehler ausgelöst würden, übersprungen werden.Referenzen: #4353
[orm] [bug] ¶
Ein langjähriges Versäumnis im ORM, die
__delete__Methode für eine Many-to-One-Beziehung war funktionsunfähig, z.B. für eine Operation wiedel a.b. Dies ist nun implementiert und entspricht dem Setzen des Attributs aufNone.Siehe auch
Referenzen: #4354
orm deklarativ¶
[orm] [declarative] [bug] ¶
Ein Fehler wurde behoben, bei dem die deklarative Methode den Zustand des
Mapperin Bezug auf vorhandene Attribute nicht aktualisierte, wenn zusätzliche Attribute nach dem Aufruf und Memoizing der Mapper-Attributsammlungen hinzugefügt oder entfernt wurden. Zusätzlich wird nun einNotImplementedErrorausgelöst, wenn ein vollständig zugeordnetes Attribut (z. B. Spalte, Beziehung usw.) aus einer Klasse gelöscht wird, die derzeit zugeordnet ist, da der Mapper nicht korrekt funktioniert, wenn das Attribut entfernt wurde.Referenzen: #4133
engine¶
[engine] [feature] ¶
Der
QueuePoolwurde um einen neuen Modus "lifo" (Last-In, First-Out) erweitert, der typischerweise durch Setzen des Flagscreate_engine.pool_use_lifoauf True aktiviert wird. Der "lifo"-Modus bedeutet, dass dieselbe Verbindung, die gerade zurückgegeben wurde, die erste ist, die wieder ausgecheckt wird, was es ermöglicht, überschüssige Verbindungen vom Server während Perioden, in denen der Pool nur teilweise ausgelastet ist, zu bereinigen. Pull Request von Taem Park.
sql¶
[sql] [feature] ¶
Der
SQLCompilerwurde überarbeitet, um eine MethodeSQLCompiler.group_by_clause()ähnlich den MethodenSQLCompiler.order_by_clause()undSQLCompiler.limit_clause()verfügbar zu machen, die von Dialekten überschrieben werden können, um anzupassen, wie GROUP BY gerendert wird. Pull Request von Samuel Chou.Diese Änderung wird auch nach zurückportiert zu: 1.2.13
[sql] [feature] ¶
Dem "String SQL"-System wurde eine
Sequencehinzugefügt, die einen aussagekräftigen String-Ausdruck ("<next sequence value: my_sequence>") rendert, wenn eine Anweisung, die einen "sequence nextvalue"-Ausdruck enthält, ohne Dialekt stringifiziert wird, anstatt einen Kompilierungsfehler auszulösen.Referenzen: #4144
[sql] [feature] ¶
Neue Benennungskonvention-Token
column_0N_name,column_0_N_nameusw. wurden hinzugefügt, die die Namen / Schlüssel / Labels für alle Spalten rendern, auf die von einer bestimmten Einschränkung in einer Sequenz verwiesen wird. Um die Länge einer solchen Benennungskonvention zu berücksichtigen, wendet der SQL-Compiler seine automatische Kürzung nun auch auf Einschränkungsnamen an, wodurch ein verkürzter, deterministisch generierter Name für die Einschränkung erstellt wird, der auf ein Ziel-Backend angewendet wird, ohne das Zeichenlimit dieses Backends zu überschreiten.Die Änderung behebt auch zwei weitere Probleme. Zum einen war das Token
column_0_keynicht verfügbar, obwohl dieses Token dokumentiert war. Zum anderen rendert das Tokenreferred_column_0_nameversehentlich den.keyund nicht den.nameder Spalte, wenn diese beiden Werte unterschiedlich waren.Referenzen: #3989
[sql] [feature] ¶
Neue Logik wurde zur "expanding IN"-Funktion für gebundene Parameter hinzugefügt, bei der, wenn die gegebene Liste leer ist, ein spezieller "leerer Satz"-Ausdruck generiert wird, der für verschiedene Backends spezifisch ist. Dies ermöglicht IN-Ausdrücke, die vollständig dynamisch sind, einschließlich leerer IN-Ausdrücke.
Referenzen: #4271
[sql] [feature] ¶
Das eingebaute Python-Funktion
dir()wird nun für ein SQLAlchemy-Objekt "properties" unterstützt, wie z.B. eine Core-Spaltenkollektion (z. B..c),mapper.attrsusw. Dies ermöglicht auch die iPython-Autovervollständigung. Pull Request von Uwe Korn.[sql] [feature] ¶
Die neue Funktion
FunctionElement.as_comparison()wurde hinzugefügt, die es einer SQL-Funktion ermöglicht, als binäre Vergleichsoperation zu fungieren, die innerhalb des ORM verwendet werden kann.Referenzen: #3831
[sql] [bug] ¶
"Like"-basierte Operatoren wurden als "Vergleichsoperatoren" hinzugefügt, einschließlich
ColumnOperators.startswith()ColumnOperators.endswith()ColumnOperators.ilike()ColumnOperators.notilike()und viele andere, so dass all diese Operatoren die Grundlage für eine ORM-"primaryjoin"-Bedingung bilden können.Referenzen: #4302
[sql] [bug] ¶
Ein Problem mit den Methoden
TypeEngine.bind_expression()undTypeEngine.column_expression()wurde behoben, bei denen diese Methoden nicht funktionierten, wenn der Zieltyp Teil einesVariantwar, oder ein anderer Zieltyp einesTypeDecorator. Zusätzlich ruft der SQL-Compiler nun die dialekt-spezifische Implementierung auf, wenn er diese Methoden rendert, sodass Dialekte nun SQL-seitige Verarbeitung für eingebaute Typen bereitstellen können.Referenzen: #3981
postgresql¶
[postgresql] [feature] ¶
Ein neuer PG-Typ
REGCLASSwurde hinzugefügt, der beim Casten von Tabellennamen zu OID-Werten hilft. Pull Request von Sebastian Bank.Diese Änderung wird auch nach zurückportiert zu: 1.2.7
Referenzen: #4160
[postgresql] [feature] ¶
Rudimentäre Unterstützung für die Reflexion von PostgreSQL-Partitionstabellen wurde hinzugefügt, z. B. relkind=’p’ wird zu den Reflexionsabfragen hinzugefügt, die Tabelleninformationen zurückgeben.
Referenzen: #4237
mysql¶
[mysql] [feature] ¶
Unterstützung für die "WITH PARSER"-Syntax von CREATE FULLTEXT INDEX in MySQL wurde hinzugefügt, unter Verwendung des Schlüsselwortarguments
mysql_with_parser. Die Reflexion wird ebenfalls unterstützt, was das spezielle Kommentarformat von MySQL zur Berichterstattung über diese Option berücksichtigt. Zusätzlich werden die Präfixe "FULLTEXT" und "SPATIAL" nun in die Indexoptionmysql_prefixzurückreflektiert.Referenzen: #4219
[mysql] [feature] ¶
Unterstützung für die Parameter in einer ON DUPLICATE KEY UPDATE-Anweisung auf MySQL wurde hinzugefügt, um sie zu ordnen, da die Parameterreihenfolge in einer MySQL UPDATE-Klausel wichtig ist, ähnlich wie bei Parameter Ordered Updates beschrieben. Pull Request von Maxim Bublis.
[mysql] [feature] ¶
Die "Pre-Ping"-Funktion des Connection Pools verwendet nun die
ping()Methode der DBAPI-Verbindung im Falle von mysqlclient, PyMySQL und mysql-connector-python. Pull Request von Maxim Bublis.
sqlite¶
[sqlite] [feature] ¶
Unterstützung für die JSON-Funktionalität von SQLite wurde über die neue SQLite-Implementierung für
JSON,JSONhinzugefügt. Der für den Typ verwendete Name istJSON, gemäß einem Beispiel in der eigenen Dokumentation von SQLite. Pull Request von Ilja Everilä.Siehe auch
Referenzen: #3850
[sqlite] [feature] ¶
Die
ON CONFLICT-Klausel von SQLite wurde implementiert, wie auf DDL-Ebene verstanden, z.B. für Primärschlüssel-, Unique- und CHECK-Constraints sowie auf einerColumnangegeben, um Inline-Primärschlüssel und NOT NULL zu erfüllen. Pull Request von Denis Kataev.Referenzen: #4360
mssql¶
[mssql] [feature] ¶
Der SQL Server pyodbc-Dialekt wurde um den Parameter
fast_executemany=Trueerweitert, der die Nutzung der gleichnamigen neuen Performance-Funktion von pyodbc bei Verwendung von Microsoft ODBC-Treibern ermöglicht.Siehe auch
Referenzen: #4158
[mssql] [bug] ¶
Die Verwendung von
Sequencemit SQL Server zur Beeinflussung von "Start" und "Inkrement" des IDENTITY-Werts wurde zugunsten neuer Parametermssql_identity_startundmssql_identity_increment, die diese Parameter direkt setzen, als veraltet markiert.Sequencewird in einer zukünftigen Version verwendet, um echteCREATE SEQUENCEDDLs mit SQL Server zu generieren.Siehe auch
Neue Parameter zur Beeinflussung von IDENTITY Start und Inkrement, Verwendung von Sequence veraltet
Referenzen: #4362
oracle¶
[oracle] [feature] ¶
Ein neues Ereignis, das derzeit nur vom cx_Oracle-Dialekt verwendet wird, wurde hinzugefügt:
DialectEvents.setiputsizes(). Das Ereignis übergibt ein Dictionary vonBindParameter-Objekten an DBAPI-spezifische Typobjekte, die nach der Konvertierung in Parameternamen an die Methodecursor.setinputsizes()von cx_Oracle übergeben werden. Dies ermöglicht sowohl die Sichtbarkeit des setinputsizes-Prozesses als auch die Möglichkeit, das Verhalten der an diese Methode übergebenen Datentypen zu ändern.Siehe auch
Feingranulare Kontrolle über die Performance der cx_Oracle-Datenbindung mit setinputsizes
Diese Änderung wird auch nach zurückportiert zu: 1.2.9
Referenzen: #4290
[oracle] [bug] ¶
Die Parameter, die an das cx_Oracle DBAPI übergeben werden können, wurden aktualisiert, um sowohl alle aktuellen als auch zukünftige, noch nicht hinzugefügte Parameter zu ermöglichen. Zusätzlich wurden nicht verwendete Parameter entfernt, die in Version 1.2 als veraltet markiert wurden, und außerdem wird "threaded" jetzt standardmäßig auf False gesetzt.
Referenzen: #4369
[oracle] [bug] ¶
Der Oracle-Dialekt wird die NCHAR/NCLOB-Datentypen zur Darstellung von generischen Unicode-Strings oder Clob-Feldern in Verbindung mit
UnicodeundUnicodeTextnicht mehr verwenden, es sei denn, das Flaguse_nchar_for_unicode=Truewird ancreate_engine()übergeben - dies schließt das CREATE TABLE-Verhalten sowiesetinputsizes()für gebundene Parameter ein. Auf der Leseseite wurde unter Python 2 eine automatische Unicode-Konvertierung für CHAR/VARCHAR/CLOB-Ergebniszeilen hinzugefügt, um das Verhalten von cx_Oracle unter Python 3 anzupassen. Um die Performance-Einbußen unter Python 2 abzumildern, werden unter Python 2 die sehr performanten (wenn C-Erweiterungen kompiliert sind) nativen Unicode-Handler von SQLAlchemy verwendet.Referenzen: #4242
misc¶
[feature] [ext] ¶
Neues Attribut
Query.lazy_loaded_fromhinzugefügt, das mit einemInstanceStategefüllt wird, das dieseQueryzum Lazy-Loading einer Beziehung verwendet. Der Grund dafür ist, dass es als Hinweis für die horizontale Sharding-Funktion dient, sodass das Identitätstoken des Zustands als Standardidentitätstoken für die Abfrage innerhalb von id_chooser() verwendet werden kann.Diese Änderung wird auch nach zurückportiert zu: 1.2.9
Referenzen: #4243
[feature] [ext] ¶
Die neue Funktion
BakedQuery.to_query()wurde hinzugefügt, die eine saubere Möglichkeit bietet, eineBakedQueryals Unterabfrage innerhalb einer anderenBakedQueryzu verwenden, ohne explizit auf eineSessionverweisen zu müssen.Referenzen: #4318
[feature] [ext] ¶
Der
AssociationProxyverfügt nun über Standard-Spaltenvergleichsoperationen wieColumnOperators.like()undColumnOperators.startswith(), wenn das Zielattribut eine einfache Spalte ist – der EXISTS-Ausdruck, der sich mit der Ziel-Tabelle verbindet, wird wie gewohnt gerendert, aber der Spaltenausdruck wird dann innerhalb der WHERE-Bedingung von EXISTS verwendet. Beachten Sie, dass dies das Verhalten der Methode.contains()des Association Proxy ändert, umColumnOperators.contains()zu verwenden, wenn sie auf einem spaltenbasierten Attribut verwendet wird.Referenzen: #4351
[feature] [ext] ¶
Unterstützung für Massen-
Query.update()undQuery.delete()wurde zur KlasseShardedQueryin der horizontalen Sharding-Erweiterung hinzugefügt. Dies fügt auch einen zusätzlichen Erweiterungshaken zu den Massen-Update/Delete-MethodenQuery._execute_crud()hinzu.Referenzen: #4196
[bug] [ext] ¶
AssociationProxywurde umgearbeitet, um klassenspezifische Zustände in einem separaten Objekt zu speichern, so dass ein einzelnerAssociationProxyfür mehrere Elternklassen dienen kann, wie es bei Vererbung der Fall ist, ohne Mehrdeutigkeiten im zurückgegebenen Zustand. Eine neue MethodeAssociationProxy.for_class()wird hinzugefügt, um die Inspektion von klassenspezifischem Zustand zu ermöglichen.Referenzen: #3423
[bug] [ext] ¶
Das langjährige Verhalten der Association-Proxy-Sammlung, nur eine schwache Referenz auf das Elternobjekt zu speichern, wurde rückgängig gemacht; der Proxy speichert nun eine starke Referenz auf das Elternobjekt, solange die Proxy-Sammlung selbst im Speicher ist, wodurch der Fehler "stale association proxy" eliminiert wird. Diese Änderung wird experimentell vorgenommen, um zu sehen, ob Anwendungsfälle auftreten, in denen sie zu Nebenwirkungen führt.
Siehe auch
Referenzen: #4268
[bug] [ext] ¶
Mehrere Probleme im Zusammenhang mit der Deassoziation von skalaren Objekten mit dem Association Proxy wurden behoben.
delfunktioniert nun, und zusätzlich wird ein neues FlagAssociationProxy.cascade_scalar_deleteshinzugefügt. Wenn dieses auf True gesetzt ist, zeigt es an, dass das Setzen eines skalaren Attributs aufNoneoder das Löschen überdelauch die Quellassoziation aufNonesetzt.Referenzen: #4308
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