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
- Vorheriger: 1.0 Changelog
- Nächster: 0.8 Changelog
- Nach oben: Startseite
- Auf dieser Seite
0.9 Changelog¶
0.9.10¶
Veröffentlicht: 22. Juli 2015orm¶
[orm] [feature] ¶
Ein neuer Eintrag
"entity"wurde zu den vonQuery.column_descriptionszurückgegebenen Dictionaries hinzugefügt. Dieser verweist auf die primäre ORM-zugeordnete Klasse oder die aliasisierte Klasse, auf die durch den Ausdruck verwiesen wird. Im Vergleich zum vorhandenen Eintrag für"type"wird dies immer eine zugeordnete Entität sein, auch wenn sie aus einem Spaltenausdruck extrahiert wurde, oder None, wenn der gegebene Ausdruck ein reiner Core-Ausdruck ist. Siehe auch #3403, der eine Regression in diesem Feature behoben hat, das in 0.9.10 nicht veröffentlicht, aber in der 1.0-Version veröffentlicht wurde.Referenzen: #3320
[orm] [bug] ¶
Queryunterstützt keine Joins, Subselects oder spezielle FROM-Klauseln bei Verwendung der MethodenQuery.update()oderQuery.delete(); anstatt diese Felder stillschweigend zu ignorieren, wenn Methoden wieQuery.join()oderQuery.select_from()aufgerufen wurden, wird eine Warnung ausgegeben. Ab 1.0.0b5 wird ein Fehler ausgelöst.Referenzen: #3349
[orm] [bug] ¶
behoben, dass die Zustandsverfolgung bei mehreren, verschachtelten Operationen von
Session.begin_nested()das „dirty“-Flag für ein innerhalb des inneren Savepoints aktualisiertes Objekt nicht korrekt weitergab, sodass, wenn der umschließende Savepoint zurückgerollt wurde, das Objekt nicht Teil des Zustands war, der abgelaufen und somit auf seinen Datenbankzustand zurückgesetzt wurde.Referenzen: #3352
engine¶
[engine] [bug] ¶
Der Zeichenkettenwert
"none"wurde zu den vom ParameterPool.reset_on_returnakzeptierten Werten hinzugefügt, als Synonym fürNone, damit Zeichenkettenwerte für alle Einstellungen verwendet werden können, was Hilfsprogrammen wieengine_from_config()problemlos nutzbar macht.Referenzen: #3375
sql¶
[sql] [feature] ¶
Offizielle Unterstützung für eine CTE, die vom SELECT innerhalb von
Insert.from_select()verwendet wird, wurde hinzugefügt. Dieses Verhalten funktionierte bis 0.9.9 versehentlich, als es aufgrund unrelated Änderungen als Teil von #3248 nicht mehr funktionierte. Beachten Sie, dass dies die Darstellung der WITH-Klausel nach dem INSERT, vor dem SELECT ist; die volle Funktionalität von CTEs, die auf der obersten Ebene von INSERT, UPDATE, DELETE dargestellt werden, ist ein neues Feature, das für eine spätere Version geplant ist.Referenzen: #3418
[sql] [bug] ¶
behoben, dass ein
MetaData-Objekt, das eine Benennungskonvention verwendete, nicht richtig mit Pickle funktionierte. Das Attribut wurde übersprungen, was zu Inkonsistenzen und Fehlern führte, wenn das entpickelteMetaData-Objekt zum Basis für weitere Tabellen verwendet wurde.Referenzen: #3362
postgresql¶
[postgresql] [bug] ¶
behoben, dass der Typ
Enum, wenn er mit dem psycopg2-Dialekt in Verbindung mit Nicht-ASCII-Werten undnative_enum=Falseverwendet wurde, die Rückergebnisse nicht korrekt dekodieren konnte. Dies rührte daher, dass der PGENUM-Typ früher ein eigenständiger Typ ohne eine „nicht-native“ Option war.Referenzen: #3354
mysql¶
[mysql] [bug] [pymysql] ¶
behoben, dass die Unicode-Unterstützung für PyMySQL bei Verwendung einer „executemany“-Operation mit Unicode-Parametern funktionierte. SQLAlchemy übergibt nun sowohl die Anweisung als auch die gebundenen Parameter als Unicode-Objekte, da PyMySQL intern im Allgemeinen die Zeichenketteninterpolation verwendet, um die endgültige Anweisung zu erzeugen, und im Falle von executemany den „encode“-Schritt nur auf der endgültigen Anweisung durchführt.
Referenzen: #3337
[mysql] [bug] [py3k] ¶
behoben, dass der Typ
BITunter Py3K die Funktionord()nicht korrekt verwendete. Pull-Request von David Marin.Referenzen: #3333
sqlite¶
tests¶
misc¶
[bug] [ext] ¶
behoben, dass bei Verwendung des erweiterten Attribut-Instrumentierungssystems nicht die richtige Ausnahme ausgelöst wurde, wenn
class_mapper()mit ungültigen Eingaben aufgerufen wurde, die zufällig auch nicht schwach referenzierbar waren, wie z. B. eine ganze Zahl.Referenzen: #3408
[bug] [ext] ¶
behoben, dass das Symbol
as_declarative()aus dem Namespacesqlalchemy.ext.declarativeentfernt wurde.Referenzen: #3324
0.9.9¶
Veröffentlicht: 10. März 2015orm¶
[orm] [feature] ¶
Neuer Parameter
Session.connection.execution_optionswurde hinzugefügt, der verwendet werden kann, um Ausführungsoptionen für eineConnectioneinzurichten, wenn sie zum ersten Mal ausgecheckt wird, bevor die Transaktion begonnen hat. Dies wird verwendet, um Optionen wie das Isolationsniveau der Verbindung vor Beginn der Transaktion festzulegen.Siehe auch
Setzen von Transaktionsisolationsstufen / DBAPI AUTOCOMMIT - neuer Dokumentationsabschnitt, der Best Practices für das Setzen der Transaktionsisolation mit Sessions beschreibt.
Referenzen: #3296
[orm] [feature] ¶
Neue Methode
Session.invalidate()wurde hinzugefügt. Funktioniert ähnlich wieSession.close(), ruft jedoch auchConnection.invalidate()auf allen Verbindungen auf und garantiert, dass diese nicht an den Connection-Pool zurückgegeben werden. Dies ist nützlich in Situationen, z. B. bei der Behandlung von gevent-Timeouts, wenn die Verbindung nicht mehr sicher verwendet werden kann, selbst für Rollbacks.[orm] [bug] ¶
behoben, dass ORM-Objektvergleiche fehlschlugen, wenn der Vergleich von Many-to-One
!= Nonefehlschlug, wenn die Quelle eine aliasisierte Klasse war oder wenn die Abfrage aufgrund von aliasisierten Joins oder polimorpher Abfragen spezielle Aliase auf den Ausdruck anwenden musste; auch ein Fehler wurde behoben, wenn der Vergleich eines Many-to-One mit einem Objektzustand fehlschlug, wenn die Abfrage aufgrund von aliasisierten Joins oder polimorpher Abfragen spezielle Aliase anwenden musste.Referenzen: #3310
[orm] [bug] ¶
behoben, dass eine interne Assertion fehlschlug, wenn ein
after_rollback()Handler für eineSessionfälschlicherweise Zustände zu dieserSessioninnerhalb des Handlers hinzufügte, und die Aufgabe, diese Zustände zu warnen und zu entfernen (gemäß #2389), versuchte fortzufahren.Referenzen: #3309
[orm] [bug] ¶
behoben, dass ein TypeError ausgelöst wurde, wenn
Query.join()mit unbekannten Keyword-Argumenten aufgerufen wurde, was aufgrund fehlerhafter Formatierung einen eigenen TypeError auslöste. Pull-Request von Malthe Borch.[orm] [bug] ¶
behoben, dass die SQL-Konstruktion für das Lazy-Loading, bei der ein komplexer PrimaryJoin, der auf dieselbe „lokale“ Spalte mehrmals im Stil „Spalte, die auf sich selbst verweist“ von selbst-referenziellen Joins verwies, nicht in allen Fällen ersetzt wurde. Die Logik zur Bestimmung der Ersetzungen wurde überarbeitet, um offener zu sein.
Referenzen: #3300
[orm] [bug] ¶
Die „Wildcard“-Loader-Optionen, insbesondere diejenige, die durch die Option
load_only()eingerichtet wird, um alle nicht explizit genannten Attribute abzudecken, berücksichtigen nun die Oberklassen einer gegebenen Entität, wenn diese Entität mit Vererbungsmaping zugeordnet ist, so dass auch Attributnamen innerhalb der Oberklassen aus dem Ladevorgang weggelassen werden. Zusätzlich wird die polymorphe Diskriminatorspalte bedingungslos in die Liste aufgenommen, genauso wie die Primärschlüsselspalten, sodass auch bei eingerichteter load_only() die polymorphe Ladung von Untertypen weiterhin korrekt funktioniert.Referenzen: #3287
[orm] [bug] [pypy] ¶
behoben, dass, wenn eine Ausnahme zu Beginn einer
Queryauftrat, bevor Ergebnisse geladen wurden, insbesondere wenn Zeilenprozessoren nicht gebildet werden konnten, der Cursor offen blieb und Ergebnisse ausstanden und nicht tatsächlich geschlossen wurden. Dies ist typischerweise nur bei einem Interpreter wie PyPy ein Problem, bei dem der Cursor nicht sofort GC’ed wird, und kann unter bestimmten Umständen dazu führen, dass Transaktionen/Sperren länger offen bleiben als erwünscht.Referenzen: #3285
[orm] [bug] ¶
behoben, dass ein Leck auftrat, wenn eine Beziehung auf einer fest zugeordneten Klasse mehrmals ersetzt wurde, die auf eine beliebig wachsende Anzahl von Zielzuordnungen verwies. Eine Warnung wird ausgegeben, wenn die alte Beziehung ersetzt wird. Wenn die Zuordnung jedoch bereits für Abfragen verwendet wurde, würde die alte Beziehung immer noch in einigen Registrierungen referenziert.
Referenzen: #3251
[orm] [bug] [sqlite] ¶
behoben, dass Ausdrucksveränderungen, die sich als „Spalte konnte nicht gefunden werden“-Fehler äußerten, wenn
Queryzum Auswählen aus mehreren, anonymen Spaltenentitäten beim Abfragen gegen SQLite verwendet wurde, als Nebeneffekt des „Join-Rewriting“-Features, das vom SQLite-Dialekt verwendet wird.Referenzen: #3241
[orm] [bug] ¶
behoben, dass die ON-Klausel für
Query.join()undQuery.outerjoin()zu einer Single-Inheritance-Unterklasse mitof_type()die „Single-Table-Kriterien“ in der ON-Klausel nicht rendert, wenn das Flagfrom_joinpoint=Truegesetzt war.Referenzen: #3232
examples¶
[examples] [bug] ¶
Das Beispiel Versionierung mit einer Historientabelle wurde aktualisiert, so dass zugeordnete Spalten neu zugeordnet werden, um Spaltennamen sowie Gruppierungen von Spalten abzugleichen. Insbesondere ermöglicht dies Spalten, die in einem joined-inheritance-Szenario mit gleichem Spaltennamen explizit gruppiert sind, so zugeordnet zu werden, wie die Historienzuordnungen, wodurch Warnungen vermieden werden, die in der 0.9-Serie zu diesem Muster hinzugefügt wurden, und die gleiche Ansicht von Attributschlüsseln ermöglicht wird.
[examples] [bug] ¶
behoben, dass die Unterklassen von AddressAssociation im Beispiel examples/generic_associations/discriminator_on_association.py nicht als „single table inheritance“ zugeordnet wurden, was zu Problemen führte, wenn die Zuordnungen weiter verwendet wurden.
engine¶
[engine] [feature] ¶
Neue Benutzer-Zugriffsmethoden zur Anzeige von Transaktionsisolationsstufen wurden hinzugefügt;
Connection.get_isolation_level(),Connection.default_isolation_level.[engine] [bug] ¶
behoben, dass die Methode
Connection.invalidate()inConnectionund Pool oder eine Invalidation aufgrund eines Datenbanktrenners fehlschlug, wenn der Parameterisolation_levelmitConnection.execution_options()verwendet worden war; der „Finalizer“, der die Isolationsebene zurücksetzt, wurde auf der nicht mehr geöffneten Verbindung aufgerufen.Referenzen: #3302
[engine] [bug] ¶
Eine Warnung wird ausgegeben, wenn der Parameter
isolation_levelmitConnection.execution_options()verwendet wird, wenn eineTransactionim Spiel ist; DBAPIs und/oder SQLAlchemy-Dialekte wie psycopg2, MySQLdb können die Transaktion implizit zurückrollen oder committen oder die Einstellung bis zur nächsten Transaktion nicht ändern, daher ist dies nie sicher.Referenzen: #3296
sql¶
[sql] [bug] ¶
Das Flag
native_enumwurde zur Ausgabe von__repr__()vonEnumhinzugefügt, was hauptsächlich wichtig ist, wenn es mit Alembic autogenerate verwendet wird. Pull-Request von Dimitris Theodorou.[sql] [bug] ¶
behoben, dass die Verwendung eines
TypeDecorator, der einen Typ implementierte, der ebenfalls einTypeDecoratorwar, mit Pythons „Cannot create a consistent method resolution order (MRO)“-Fehler fehlschlug, wenn irgendein SQL-Vergleichsausdruck gegen ein Objekt mit diesem Typ verwendet wurde.Referenzen: #3278
[sql] [bug] ¶
behoben, dass die Spalten aus einem SELECT, das in ein INSERT eingebettet war, entweder über die VALUES-Klausel oder als „from select“, die Spaltentypen des Ergebnissatzes der RETURNING-Klausel verunreinigten, wenn Spalten aus beiden Anweisungen denselben Namen hatten, was zu möglichen Fehlern oder Fehladaptionen beim Abrufen der zurückgegebenen Zeilen führte.
Referenzen: #3248
schema¶
[schema] [bug] ¶
behoben, dass die Logik zur Verknüpfung eines
ForeignKeymit seinem Elternteil fehlschlug, wenn der Fremdschlüssel „link_to_name=True“ in Verbindung mit einem Ziel-Tableverwendete, das seine Elternspalte erst später erhielt, z. B. innerhalb eines Reflexions- + „useexisting“-Szenarios, wenn die Zielspalte tatsächlich einen Schlüsselwert hatte, der sich von ihrem Namen unterschied, wie es bei der Reflexion vorkommen würde, wenn Spalten-Reflexionsereignisse verwendet wurden, um die .key von reflektiertenColumn-Objekten zu ändern, so dass link_to_name bedeutsam wird. Auch die Unterstützung für Spaltentypen über FK-Übertragung wurde in ähnlicher Weise repariert, wenn Zielspalten einen anderen Schlüssel hatten und über link_to_name referenziert wurden.
postgresql¶
[postgresql] [feature] ¶
Unterstützung für das Schlüsselwort
CONCURRENTLYfür PostgreSQL-Indizes wurde hinzugefügt, eingerichtet mitpostgresql_concurrently. Pull-Request von Iuri de Silvio.Siehe auch
[postgresql] [bug] ¶
behoben, dass die Unterstützung für PostgreSQL UUID-Typen in Verbindung mit dem ARRAY-Typ bei Verwendung von psycopg2 funktionierte. Der psycopg2-Dialekt verwendet nun den Hook psycopg2.extras.register_uuid(), damit UUID-Werte immer als UUID()-Objekte zum/vom DBAPI übergeben werden. Das Flag
UUID.as_uuidwird weiterhin berücksichtigt, außer bei psycopg2 müssen wir zurückgegebene UUID-Objekte wieder in Zeichenketten konvertieren, wenn dies deaktiviert ist.Referenzen: #2940
[postgresql] [bug] ¶
Unterstützung für den Datentyp
postgresql.JSONBbei Verwendung von psycopg2 2.5.4 oder neuer wurde hinzugefügt, der native Konvertierung von JSONB-Daten aufweist, so dass die Konverter von SQLAlchemy deaktiviert werden müssen; zusätzlich wird die neu hinzugefügte psycopg2-Erweiterungextras.register_default_jsonbverwendet, um einen JSON-Deserializer einzurichten, der über das Argumentjson_deserializeran den Dialekt übergeben wird. Auch die PostgreSQL-Integrations tests wurden repariert, die den JSONB-Typ nicht tatsächlich als JSON-Typ round-trippten. Pull-Request von Mateusz Susik.[postgresql] [bug] ¶
behoben, dass das Flag „array_oid“ bei der Registrierung des HSTORE-Typs mit älteren psycopg2-Versionen vor 2.4.3, die dieses Flag nicht unterstützen, sowie die Verwendung des nativen JSON-Serializer-Hooks „register_default_json“ mit benutzerdefinierten
json_deserializerauf psycopg2-Versionen vor 2.5, die kein natives JSON enthalten, repariert wurde.[postgresql] [bug] ¶
behoben, dass der PostgreSQL-Dialekt einen Ausdruck in einem
Indexnicht rendern konnte, der nicht direkt einer tabellengebundenen Spalte entsprach; typischerweise wenn eintext()-Konstrukt einer der Ausdrücke im Index war; oder die Liste der Ausdrücke falsch interpretieren konnte, wenn einer oder mehrere davon ein solches Konstrukt waren.Referenzen: #3174
mysql¶
[mysql] [change] ¶
Der
gaerdbms-Dialekt ist nicht mehr erforderlich und gibt eine Deprecation-Warnung aus. Google empfiehlt nun, den MySQLdb-Dialekt direkt zu verwenden.Referenzen: #3275
[mysql] [bug] ¶
Eine Versionsprüfung wurde zum MySQLdb-Dialekt hinzugefügt, die die Prüfung auf die Kollation „utf8_bin“ umgibt, da diese auf MySQL-Servern vor 5.0 fehlschlägt.
Referenzen: #3274
sqlite¶
[sqlite] [feature] ¶
Unterstützung für partielle Indizes (z. B. mit einer WHERE-Klausel) auf SQLite wurde hinzugefügt. Pull-Request von Kai Groner.
Siehe auch
[sqlite] [feature] ¶
Ein neuer SQLite-Backend für das SQLCipher-Backend wurde hinzugefügt. Dieses Backend ermöglicht verschlüsselte SQLite-Datenbanken mit dem pysqlcipher Python-Treiber, der dem pysqlite-Treiber sehr ähnlich ist.
Siehe auch
misc¶
[bug] [ext] [py3k] ¶
behoben, dass die Association-Proxy-Listenklasse unter Py3K Slices nicht korrekt interpretierte. Pull-Request von Gilles Dartiguelongue.
0.9.8¶
Veröffentlicht: 13. Oktober 2014orm¶
[orm] [bug] [engine] ¶
behoben, dass ein Fehler auftrat, der generell dieselben Klassen von Ereignissen wie in #3199 betraf, wenn der Parameter
named=Trueverwendet wurde. Einige Ereignisse konnten nicht registriert werden, und andere riefen die Ereignisargumente nicht korrekt auf, im Allgemeinen wenn ein Ereignis für eine Adaption auf andere Weise „verpackt“ wurde. Die „named“-Mechanismen wurden neu angeordnet, um die von internen Wrapper-Funktionen erwartete Argumentensignatur nicht zu beeinträchtigen.Referenzen: #3197
[orm] [bug] ¶
Behobenen Fehler, der viele Klassen von Ereignissen betraf, insbesondere ORM-Ereignisse, aber auch Engine-Ereignisse, bei denen die übliche Logik des „Deduplizierens“ eines redundanten Aufrufs von
listen()mit denselben Argumenten fehlschlug, für solche Ereignisse, bei denen die Listener-Funktion gekapselt war. Eine Assertion wurde in registry.py ausgelöst. Diese Assertion wurde nun in die Deduplizierungsprüfung integriert, mit dem zusätzlichen Vorteil einer einfacheren Möglichkeit, die Deduplizierung insgesamt zu überprüfen.Referenzen: #3199
[orm] [bug] ¶
Behobene Warnung, die ausgegeben wurde, wenn ein komplexer, selbstbezüglicher primaryjoin Funktionen enthielt, während gleichzeitig remote_side angegeben war; die Warnung schlug vor, „remote side“ einzustellen. Sie wird nun nur noch ausgegeben, wenn remote_side nicht vorhanden ist.
Referenzen: #3194
orm deklarativ¶
[orm] [declarative] [bug] ¶
Behobener Fehler „‘NoneType’ object has no attribute ‘concrete‘“, wenn
AbstractConcreteBasein Verbindung mit einer Unterklasse verwendet wird, die__abstract__deklariert.Referenzen: #3185
engine¶
[engine] [bug] ¶
Die an eine
Engineübergebenen Ausführungsoptionen, entweder übercreate_engine.execution_optionsoderEngine.update_execution_options(), werden nicht an die spezielleConnectionübergeben, die zur Initialisierung des Dialekts innerhalb des „first connect“-Ereignisses verwendet wird; Dialekte führen in dieser Phase normalerweise ihre eigenen Abfragen aus, und keine der derzeit verfügbaren Optionen sollte hier angewendet werden. Insbesondere die Option „autocommit“ führte zu dem Versuch, innerhalb dieser anfänglichen Verbindung automatisch zu committen, was mit einem AttributeError aufgrund des nicht standardmäßigen Zustands derConnectionfehlschlug.Referenzen: #3200
[engine] [bug] ¶
Die String-Schlüssel, die zur Bestimmung der betroffenen Spalten für ein INSERT oder UPDATE verwendet werden, werden jetzt sortiert, wenn sie zum „compiled cache“-Cache-Schlüssel beitragen. Diese Schlüssel waren zuvor nicht deterministisch geordnet, was bedeutet, dass dieselbe Anweisung mehrmals mit äquivalenten Schlüsseln gecacht werden konnte, was sowohl Speicher als auch Leistung kostete.
Referenzen: #3165
sql¶
[sql] [bug] ¶
Behobener Fehler, bei dem eine beträchtliche Anzahl von SQL-Elementen innerhalb des sql-Pakets nicht erfolgreich
__repr__()aufrufen konnte, aufgrund eines fehlendendescription-Attributs, das dann einen Rekursionsüberlauf auslöste, wenn ein interner AttributeError dann erneut__repr__()aufrief.Referenzen: #3195
[sql] [bug] ¶
Eine Anpassung der Tabellen-/Index-Reflexion, so dass, wenn ein Index eine Spalte meldet, die nicht in der Tabelle gefunden wird, eine Warnung ausgegeben und die Spalte übersprungen wird. Dies kann bei einigen speziellen Systemspaltensituationen auftreten, wie sie bei Oracle beobachtet wurden.
Referenzen: #3180
[sql] [bug] ¶
Behobener Fehler in CTE, bei dem das Compiler-Argument
literal_bindsnicht immer korrekt weitergegeben wurde, wenn eine CTE sich auf eine andere aliasierte CTE in einer Anweisung bezog.Referenzen: #3154
[sql] [bug] ¶
Behobene Regression von 0.9.7, verursacht durch #3067 in Verbindung mit einem falsch benannten Unit-Test, so dass sogenannte „Schema“-Typen wie
BooleanundEnumnicht mehr gepickelt werden konnten.
postgresql¶
[postgresql] [feature] [pg8000] ¶
Unterstützung für „sane multi row count“ mit dem pg8000-Treiber wurde hinzugefügt, was hauptsächlich für die Versionsverwaltung mit dem ORM gilt. Das Feature wird versionsabhängig erkannt, basierend auf pg8000 1.9.14 oder neuer. Pull Request von Tony Locke.
[postgresql] [bug] ¶
Eine Überarbeitung dieses Problems, das erstmals in 0.9.5 behoben wurde. Anscheinend ist der Zugriff auf
.closedvon psycopg2 nicht so zuverlässig, wie wir angenommen hatten. Daher haben wir eine explizite Prüfung auf die Fehlermeldungen „SSL SYSCALL error: Bad file descriptor“ und „SSL SYSCALL error: EOF detected“ hinzugefügt, um ein Disconnect-Szenario zu erkennen. Wir werden weiterhin aufconnection.closedvon psycopg2 als erste Prüfung zurückgreifen.Referenzen: #3021
[postgresql] [bug] ¶
Behobener Fehler, bei dem der PostgreSQL JSON-Typ einen SQL NULL-Spaltenwert nicht speichern oder anderweitig rendern konnte, anstatt eines JSON-kodierten
'null'. Zur Unterstützung dieses Falls sind die Änderungen wie folgt:Der Wert
null()kann jetzt angegeben werden, was immer zu einem NULL-Wert in der Anweisung führt.Ein neuer Parameter
JSON.none_as_nullwurde hinzugefügt, der bei True angibt, dass der Python-WertNoneals SQL NULL gespeichert werden soll, anstatt als JSON-kodiertes'null'.
Das Abrufen von NULL als None wurde auch für DBAPIs außer psycopg2, nämlich pg8000, repariert.
Referenzen: #3159
[postgresql] [bug] ¶
Das Ausnahme-Wrapping-System für DBAPI-Fehler kann nun nicht standardmäßige DBAPI-Ausnahmen aufnehmen, wie z. B. die psycopg2 TransactionRollbackError. Diese Ausnahmen werden nun mithilfe der nächstgelegenen verfügbaren Unterklasse in
sqlalchemy.excausgelöst, im Fall von TransactionRollbackErrorsqlalchemy.exc.OperationalError.Referenzen: #3075
[postgresql] [bug] ¶
Behobener Fehler im
array-Objekt, bei dem der Vergleich mit einer einfachen Python-Liste den richtigen Array-Konstruktor nicht verwendete. Pull Request von Andrew.Referenzen: #3141
[postgresql] [bug] ¶
Eine unterstützte Methode
FunctionElement.alias()für Funktionen, z. B. dasfunc-Konstrukt, wurde hinzugefügt. Zuvor war das Verhalten für diese Methode undefiniert. Das aktuelle Verhalten spiegelt das von vor 0.9.4 wider, nämlich dass die Funktion in eine Single-Column-FROM-Klausel mit dem gegebenen Aliasnamen umgewandelt wird, wobei die Spalte selbst anonym benannt wird.Referenzen: #3137
mysql¶
[mysql] [bug] [mysqlconnector] ¶
Mysqlconnector erwartet ab Version 2.0, wahrscheinlich als Nebeneffekt des Python-3-Merges, keine verdoppelten Prozentzeichen mehr (z. B. wie beim Modulo-Operator und anderen), selbst wenn das „pyformat“-Format für gebundene Parameter verwendet wird (diese Änderung wird von Mysqlconnector nicht dokumentiert). Der Dialekt prüft nun auf py2k und auf mysqlconnector kleiner als Version 2.0, um zu erkennen, ob der Modulo-Operator als
%%oder%gerendert werden soll.[mysql] [bug] [mysqlconnector] ¶
Unicode SQL wird nun für MySQLconnector Version 2.0 und höher übergeben; für Py2k und MySQL < 2.0 werden Strings kodiert.
sqlite¶
[sqlite] [bug] ¶
Beim Auswählen aus einem UNION mit einer angehängten Datenbankdatei meldet der pysqlite-Treiber Spaltennamen in cursor.description als ‚dbname.tablename.colname‘ anstelle von ‚tablename.colname‘, wie er es normalerweise für ein UNION tut (beachten Sie, dass es für beide nur ‚colname‘ sein sollte, aber wir umgehen dies). Die Logik zur Spaltenübersetzung wurde angepasst, um das rechteste Token statt des zweiten Tokens abzurufen, sodass es in beiden Fällen funktioniert. Workaround von Tony Roberts.
Referenzen: #3211
mssql¶
oracle¶
misc¶
[bug] [declarative] ¶
Behobene unwahrscheinliche Race-Condition, die in einigen exotischen Endbenutzer-Setups beobachtet wurde, bei der der Versuch, auf „doppelte Klassennamen“ im Deklarativen zu prüfen, auf eine nicht vollständig bereinigte Weak-Referenz stieß, die sich auf eine andere zu entfernende Klasse bezog. Die Prüfung stellt nun sicher, dass die Weakref immer noch auf ein Objekt verweist, bevor sie weiter darauf zugreift.
Referenzen: #3208
[bug] [ext] ¶
Behobener Fehler in der Sortierliste, bei dem die Reihenfolge der Elemente während eines Collection-Replace-Ereignisses durcheinandergebracht wurde, wenn das `reorder_on_append`-Flag auf True gesetzt war. Die Korrektur stellt sicher, dass die Sortierliste nur die Liste beeinflusst, die explizit mit dem Objekt verbunden ist.
Referenzen: #3191
[bug] [ext] ¶
Behobener Fehler, bei dem
MutableDictdie Dictionary-Methodeupdate()nicht implementierte und somit keine Änderungen erfasste. Pull Request von Matt Chisholm.[bug] [ext] ¶
Behobener Fehler, bei dem eine benutzerdefinierte Unterklasse von
MutableDictbei einer „coerce“-Operation nicht angezeigt wurde und stattdessen ein einfachesMutableDictzurückgegeben wurde. Pull Request von Matt Chisholm.[bug] [pool] ¶
Behobener Fehler in der Protokollierung des Connection-Pools, bei dem die Debug-Protokollmeldung „connection checked out“ nicht ausgegeben wurde, wenn die Protokollierung mit
logging.setLevel()eingerichtet wurde und nicht mit derecho_pool-Flag. Tests zur Bestätigung dieser Protokollierung wurden hinzugefügt. Dies ist eine Regression, die in 0.9.0 eingeführt wurde.Referenzen: #3168
0.9.7¶
Veröffentlicht: 22. Juli 2014orm¶
[orm] [bug] [eagerloading] ¶
Behobene Regression, die durch #2976 in 0.9.4 verursacht wurde, bei der die „outer join“-Propagation entlang einer Kette von joined eager loads eine „inner join“-Propagation entlang eines Geschwister-Join-Pfades fälschlicherweise in ein „outer join“ umwandelte, obwohl nur Nachfahrts-Pfade die „outer join“-Propagation erhalten sollten; zusätzlich wurde ein verwandtes Problem behoben, bei dem die „nested“ Join-Propagation unangemessen zwischen zwei Geschwister-Join-Pfaden stattfand.
Referenzen: #3131
[orm] [bug] ¶
Behobene Regression von 0.9.0 aufgrund von #2736, bei der die Methode
Query.select_from()die „from entity“ desQuery-Objekts nicht mehr korrekt einrichtete, sodass nachfolgende Aufrufe vonQuery.filter_by()oderQuery.join()beim Suchen nach Attributen anhand von Zeichenkettennamen die entsprechende „from“-Entität nicht überprüften.[orm] [bug] ¶
Der „Evaluator“ für query.update()/delete() funktioniert nicht mit Multi-Table-Updates und muss auf synchronize_session=False oder synchronize_session=’fetch’ gesetzt werden; es wird nun eine Warnung ausgegeben. In 1.0 wird dies zu einer vollständigen Ausnahme befördert.
Referenzen: #3117
[orm] [bug] ¶
Behobener Fehler, bei dem Elemente, die innerhalb eines Savepoints gespeichert, gelöscht oder einen Primärschlüsselwechsel erfahren hatten, nach dem Rollback der äußeren Transaktion nicht in ihren früheren Zustand (nicht in der Sitzung, in der Sitzung, vorheriger PK) zurückversetzt wurden.
Referenzen: #3108
[orm] [bug] ¶
Behobener Fehler bei der Subquery-Eager-Ladung in Verbindung mit
with_polymorphic(). Die Zielsetzung von Entitäten und Spalten in der Subquery-Ladung wurde für diese Art von Entität und andere präziser.Referenzen: #3106
[orm] [bug] ¶
Behobener Fehler bei dynamischen Attributen, der eine Regression von #3060 aus Version 0.9.5 war. Eine selbstbezügliche Beziehung mit lazy=’dynamic’ löste während eines Flush-Vorgangs einen TypeError aus.
Referenzen: #3099
engine¶
sql¶
[sql] [bug] ¶
Behobener Fehler bei
Enumund anderen Unterklassen vonSchemaType, bei denen die direkte Zuordnung des Typs zu einemMetaDatazu einem Hängenbleiben führte, wenn Ereignisse (wie Erstellungsereignisse) auf demMetaDataausgelöst wurden.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3124
[sql] [bug] ¶
Fehler im benutzerdefinierten Operator Plus
TypeEngine.with_variant()behoben, bei dem die Verwendung einesTypeDecoratorin Verbindung mit Varianten mit einem MRO-Fehler fehlschlug, wenn ein Vergleichsoperator verwendet wurde.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3102
[sql] [bug] ¶
Fehler bei der Benennungskonventionsfunktion behoben, bei der die Verwendung einer Check-Constraint-Konvention, die
constraint_nameenthielt, alleBooleanundEnumTypen dazu zwang, ebenfalls Namen zu benötigen, da diese implizit eine Constraint erstellen, selbst wenn das letztendliche Ziel-Backend eines ist, das keine Generierung der Constraint erfordert, wie z. B. PostgreSQL. Die Mechanik von Benennungskonventionen für diese speziellen Constraints wurde neu organisiert, sodass die Namensbestimmung zur Zeit der DDL-Kompilierung und nicht zur Zeit der Constraint-/Tabellenerstellung erfolgt.Referenzen: #3067
[sql] [bug] ¶
Behobener Fehler bei Common Table Expressions (CTE), bei dem positionelle gebundene Parameter in der falschen Endreihenfolge ausgedrückt werden konnten, wenn CTEs auf bestimmte Weise verschachtelt waren.
Referenzen: #3090
[sql] [bug] ¶
Behobener Fehler, bei dem die mehrwertige
Insert-Konstruktion Werte-Einträge nach dem ersten, für literale SQL-Ausdrücke angegebenen, nicht mehr korrekt prüfte.Referenzen: #3069
[sql] [bug] ¶
Ein „str()“-Schritt wurde zur Iteration von dialect_kwargs für Python-Versionen < 2.6.5 hinzugefügt, um den Fehler „no unicode keyword arg“ zu umgehen, da diese Argumente innerhalb einiger Reflexionsprozesse als Schlüsselwortargumente übergeben werden.
Referenzen: #3123
[sql] [bug] ¶
Die Methode
TypeEngine.with_variant()akzeptiert nun eine Typklasse als Argument, die intern in eine Instanz umgewandelt wird, wobei dieselbe Konvention wie bei anderen Konstrukten wieColumnverwendet wird.Referenzen: #3122
postgresql¶
[postgresql] [feature] ¶
Das Schlüsselwortargument
postgresql_regconfigwurde dem OperatorColumnOperators.match()hinzugefügt. Es ermöglicht die Angabe des Arguments „reg config“ für die Funktionto_tsquery(). Pull Request von Jonathan Vanasco.Referenzen: #3078
[postgresql] [feature] ¶
Unterstützung für PostgreSQL JSONB über
JSONBhinzugefügt. Pull Request von Damian Dimmich.[postgresql] [bug] [pg8000] ¶
Behobener Fehler, der in 0.9.5 durch die neue pg8000-Isolationslevel-Funktion eingeführt wurde und bei dem der Isolationslevel-Parameter auf Engine-Ebene beim Verbindungsaufbau einen Fehler verursachte.
Referenzen: #3134
mysql¶
[mysql] [bug] ¶
MySQL-Fehler 2014 "commands out of sync" wird in modernen MySQL-Python-Versionen als ProgrammingError und nicht als OperationalError ausgelöst; alle MySQL-Fehlercodes, die auf "disconnect" geprüft werden, werden nun unabhängig voneinander innerhalb von OperationalError und ProgrammingError geprüft.
Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3101
sqlite¶
[sqlite] [bug] ¶
Behobenes Problem mit der Join-Rewriting-Logik von SQLite, bei dem eine Subquery, die als Skalarsubquery eingebettet war, wie z. B. innerhalb eines IN, unangemessene Ersetzungen von der umschließenden Abfrage erhielt, wenn dieselbe Tabelle innerhalb der Subquery wie in der umschließenden Abfrage vorhanden war, z. B. bei einem Joined-Inheritance-Szenario.
Referenzen: #3130
mssql¶
[mssql] [feature] ¶
„Multivalues insert“ für SQL Server 2008 aktiviert. Pull Request von Albert Cervin. Die Prüfungen für den „IDENTITY INSERT“-Modus wurden erweitert, um auch dann zu gelten, wenn der Identity-Schlüssel in der VALUEs-Klausel der Anweisung enthalten ist.
[mssql] [bug] ¶
Die Anweisungskodierung wurde zu den Anweisungen "SET IDENTITY_INSERT" hinzugefügt, die ausgeführt werden, wenn ein expliziter INSERT in eine IDENTITY-Spalte eingefügt wird, um Nicht-ASCII-Tabellenbezeichner auf Treibern wie pyodbc + unix + py2k zu unterstützen, die keine Unicode-Anweisungen unterstützen.
Diese Änderung wird auch **zurückportiert** nach: 0.8.7
[mssql] [bug] ¶
Im SQL Server pyodbc-Dialekt wurde die Implementierung des Dialektparameters
description_encodingrepariert, die, wenn sie nicht explizit gesetzt war, die Analyse von cursor.description verhinderte, wenn Ergebnismengen Namen in alternativen Kodierungen enthielten. Dieser Parameter sollte zukünftig nicht mehr benötigt werden.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3091
[mssql] [bug] ¶
Behobene Regression von 0.9.5, verursacht durch #3025, bei der die Abfrage zur Bestimmung des „default schema“ in SQL Server 2000 ungültig war. Für SQL Server 2000 wird wieder auf den „schema name“-Parameter des Dialekts zurückgegriffen, der konfigurierbar ist, aber standardmäßig auf ‚dbo‘ gesetzt ist.
Referenzen: #3025
oracle¶
tests¶
[tests] [bug] ¶
Behobener Fehler, bei dem „python setup.py test“ nicht ordnungsgemäß in distutils aufgerufen wurde und am Ende der Test-Suite Fehler ausgegeben wurden.
misc¶
0.9.6¶
Veröffentlicht: 23. Juni 2014orm¶
[orm] [bug] ¶
Die Änderung für #3060 wurde rückgängig gemacht. Dies ist eine Unit-of-Work-Korrektur, die in 1.0 unter #3061 umfassender aktualisiert wird. Die Korrektur in #3060 führt leider zu einem neuen Problem, bei dem ein eager load eines Many-to-One-Attributs ein Ereignis erzeugen kann, das als Attributänderung interpretiert wird.
Referenzen: #3060
0.9.5¶
Veröffentlicht: 23. Juni 2014orm¶
[orm] [feature] ¶
Das „primaryjoin“-Modell wurde etwas erweitert, um eine Join-Bedingung zuzulassen, die strikt von einer einzelnen Spalte zu sich selbst reicht, übersetzt durch eine Art SQL-Funktion oder einen Ausdruck. Dies ist eine Art experimentelles Vorgehen, aber der erste Proof of Concept ist eine „materialisierte Pfad“-Join-Bedingung, bei der ein Pfadstring mit „like“ verglichen wird. Der Operator
ColumnOperators.like()wurde ebenfalls der Liste der gültigen Operatoren für eine primaryjoin-Bedingung hinzugefügt.Referenzen: #3029
[orm] [feature] ¶
Neue Dienstprogrammfunktion
make_transient_to_detached()hinzugefügt, die verwendet werden kann, um Objekte zu erzeugen, die sich so verhalten, als wären sie aus einer Session geladen und dann getrennt worden. Nicht vorhandene Attribute werden als abgelaufen markiert, und das Objekt kann einer Session hinzugefügt werden, wo es sich wie ein persistentes verhält.Referenzen: #3017
[orm] [bug] ¶
Fehler in der Subquery-Eager-Ladung behoben, bei der eine lange Kette von Eager-Ladungen über eine polymorphe Klassengrenze in Verbindung mit polymorpher Ladung die Unterklasse-Verknüpfung in der Kette nicht finden konnte und mit einem fehlenden Eigenschaftsnamen bei einer
AliasedClassfehlschlug.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3055
[orm] [bug] ¶
ORM-Fehler behoben, bei dem die Funktion
class_mapper()AttributeErrors oder KeyErrors maskierte, die aufgrund von Benutzerfehlern während der Mapper-Konfiguration ausgelöst werden sollten. Die Behandlung von Attribut-/Schlüssel-Fehlern wurde spezifischer gemacht, um den Konfigurationsschritt nicht einzuschließen.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3047
[orm] [bug] ¶
Zusätzliche Prüfungen wurden für den Fall hinzugefügt, dass ein erbender Mapper implizit eines seiner spaltenbasierten Attribute mit dem des übergeordneten Elements kombiniert, wo diese Spalten normalerweise nicht unbedingt den gleichen Wert teilen müssen. Dies ist eine Erweiterung einer bestehenden Prüfung, die über #1892 hinzugefügt wurde; diese neue Prüfung gibt jedoch nur eine Warnung aus, anstatt eine Ausnahme, um Anwendungen zu ermöglichen, die sich auf das bestehende Verhalten verlassen.
Referenzen: #3042
[orm] [bug] ¶
Das Verhalten von
load_only()wurde geändert, so dass Primärschlüsselspalten immer zur Liste der zu „undeferrenden“ Spalten hinzugefügt werden; andernfalls kann die ORM die Identität der Zeile nicht laden. Anscheinend kann man die zugeordneten Primärschlüssel aufschieben und die ORM wird fehlschlagen, das wurde nicht geändert. Aber da load_only im Wesentlichen „alle bis auf X aufschieben“ bedeutet, ist es kritischer, dass PK-Spalten nicht Teil dieses Aufschiebens sind.Referenzen: #3080
[orm] [bug] ¶
Einige Randfälle im sogenannten „Zeilenwechsel“-Szenario, in dem ein INSERT/DELETE in ein UPDATE umgewandelt werden kann, wurden behoben. In dieser Situation wird eine Many-to-One-Beziehung, die auf None gesetzt ist, oder in einigen Fällen ein Skalarattribut, das auf None gesetzt ist, möglicherweise nicht als Nettowertänderung erkannt, und daher würde das UPDATE nicht zurücksetzen, was auf der vorherigen Zeile war. Dies liegt an einigen noch ungelösten Nebenwirkungen der Art und Weise, wie die Attributhistorie funktioniert, in Bezug auf die implizite Annahme, dass None nicht wirklich eine „Änderung“ für ein zuvor nicht gesetztes Attribut ist. Siehe auch #3061.
Hinweis
Diese Änderung wurde in Version 0.9.6 **RÜCKGÄNGIG GEMACHT**. Die vollständige Behebung erfolgt in Version 1.0 von SQLAlchemy.
Referenzen: #3060
[orm] [bug] ¶
Bezüglich #3060 wurde eine Anpassung an der Unit of Work vorgenommen, so dass das Laden von zugehörigen Many-to-One-Objekten etwas aggressiver ist, im Fall eines Graphen von selbst-referenziellen Objekten, die gelöscht werden sollen; das Laden von zugehörigen Objekten soll helfen, die korrekte Reihenfolge für die Löschung zu bestimmen, wenn passive_deletes nicht gesetzt ist.
[orm] [bug] ¶
Fehler bei der SQLite-Join-Umschreibung behoben, bei der anonymisierte Spaltennamen aufgrund von Wiederholungen in Unterabfragen nicht korrekt umgeschrieben wurden. Dies würde SELECT-Abfragen mit jeder Art von Unterabfrage + Join beeinträchtigen.
Referenzen: #3057
[orm] [bug] [sql] ¶
Korrekturen an der neu verbesserten booleschen Konvertierung in #2804, bei der die neuen Regeln für „where“ und „having“ für die Schlüsselwörter „whereclause“ und „having“ des
select()-Konstrukts nicht wirksam wurden, was auch der Fall ist, denQueryverwendet, sodass es auch in der ORM nicht funktionierte.Referenzen: #3013
Beispiele¶
[examples] [feature] ¶
Ein neues Beispiel, das materialisierte Pfade mit den neuesten Beziehungsfunktionen illustriert, wurde hinzugefügt. Beispiel bereitgestellt von Jack Zhou.
engine¶
[engine] [bug] ¶
Fehler behoben, der auftrat, wenn eine DBAPI-Ausnahme beim ersten Verbindungsaufbau des Engines auftrat und die Ausnahme keine Trennungsausnahme war, aber der Cursor einen Fehler auslöste, als wir versuchten, ihn zu schließen. In diesem Fall wurde die eigentliche Ausnahme unterdrückt, als wir versuchten, die Ausnahme beim Schließen des Cursors über den Connection Pool zu protokollieren, und scheiterten, da wir auf den Logger des Pools in einer Weise zugreifen wollten, die in diesem sehr spezifischen Szenario unangemessen ist.
Referenzen: #3063
[engine] [bug] ¶
Einige „doppelte Invalidierungs“-Situationen wurden erkannt, bei denen eine Verbindungsinvalidierung innerhalb eines bereits kritischen Abschnitts wie connection.close() auftreten konnte; letztendlich werden diese Bedingungen durch die Änderung in #2907 verursacht, da die Funktion „reset on return“ die Connection/Transaction aufruft, um sie zu handhaben, wo „disconnect detection“ erfasst werden könnte. Es ist jedoch möglich, dass die neuere Änderung in #2985 die Wahrscheinlichkeit, dass dies als „connection invalidate“-Operation angesehen wird, erhöht hat, da diese Operation viel schneller ist und das Problem unter 0.9.4 reproduzierbarer ist als unter 0.9.3.
Es werden nun Prüfungen innerhalb jedes Abschnitts hinzugefügt, in dem eine Invalidierung auftreten kann, um weitere nicht zulässige Operationen auf der invalidierten Verbindung zu stoppen. Dies beinhaltet zwei Korrekturen sowohl auf Engine- als auch auf Pool-Ebene. Obwohl das Problem bei stark gleichzeitigen gevent-Fällen beobachtet wurde, könnte es theoretisch in jedem Szenario auftreten, in dem eine Trennung während des Verbindungsschließvorgangs auftritt.
Referenzen: #3043
sql¶
[sql] [feature] ¶
Das Protokoll für
Indexwurde etwas liberalisiert, da Sie einentext()-Ausdruck als Ziel angeben können; der Index muss keine tabellengebundene Spalte mehr enthalten, wenn der Index manuell zur Tabelle hinzugefügt werden soll, entweder über eine Inline-Deklaration oder überTable.append_constraint().Referenzen: #3028
[sql] [feature] ¶
Neues Flag
between.symmetrichinzugefügt, das bei True „BETWEEN SYMMETRIC“ rendert. Außerdem wurde ein neuer Negationsoperator „notbetween_op“ hinzugefügt, der nun einen Ausdruck wie~col.between(x, y)als „col NOT BETWEEN x AND y“ rendern lässt, anstatt als geklammerter NOT-String.Referenzen: #2990
[sql] [bug] ¶
Fehler in der INSERT..FROM SELECT-Konstruktion behoben, bei der die Auswahl aus einer UNION die UNION in eine anonyme (d. h. unbeschriftete) Unterabfrage einhüllte.
Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3044
[sql] [bug] ¶
Fehler behoben, bei dem
Table.update()undTable.delete()eine leere WHERE-Klausel erzeugten, wenn eine leereand_()oderor_()oder ein anderer leerer Ausdruck angewendet wurde. Dies ist nun konsistent mit dem vonselect().Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3045
[sql] [bug] ¶
Das Flag
Column.nullablewird implizit aufFalsegesetzt, wenn dieseColumnin einer explizitenPrimaryKeyConstraintfür diese Tabelle referenziert wird. Dieses Verhalten entspricht nun dem, wenn dieColumnselbst das FlagColumn.primary_keyaufTruegesetzt hat, was als exakt gleichwertiger Fall gedacht ist.Referenzen: #3023
[sql] [bug] ¶
Fehler behoben, bei dem die Operatorüberladungsmethoden
Operators.__and__(),Operators.__or__()undOperators.__invert__()innerhalb einer benutzerdefiniertenComparator-Implementierung nicht überschrieben werden konnten.Referenzen: #3012
[sql] [bug] ¶
Fehler in der neuen Methode
DialectKWArgs.argument_for()behoben, bei der das Hinzufügen eines Arguments für ein Konstrukt, das noch keine speziellen Argumente enthielt, fehlschlug.Referenzen: #3024
[sql] [bug] ¶
Regression, die in 0.9 eingeführt wurde, behoben, bei der die neue Funktion „ORDER BY <labelname>“ aus #1068 keine Quoting-Regeln auf den Labelnamen anwendete, wie er in der ORDER BY dargestellt wurde.
[sql] [bug] ¶
Der Import für
Functionin den Importnamespacesqlalchemy.sql.expressionwurde wiederhergestellt, der zu Beginn von 0.9 entfernt worden war.
postgresql¶
[postgresql] [feature] ¶
Unterstützung für das AUTOCOMMIT-Isolationslevel bei Verwendung des pg8000 DBAPI wurde hinzugefügt. Pull Request von Tony Locke.
[postgresql] [feature] ¶
Neues Flag
ARRAY.zero_indexeszum PostgreSQLARRAY-Typ hinzugefügt. Wenn aufTruegesetzt, wird dem Wert Eins zu allen Array-Indexwerten hinzugefügt, bevor sie an die Datenbank übergeben werden, was eine bessere Interoperabilität zwischen Python-basierten Nullindizes und PostgreSQL-basierten Einsindizes ermöglicht. Pull Request von Alexey Terentev.Referenzen: #2785
[postgresql] [bug] ¶
Das Flag
hashable=Falsewurde dem PGHSTORE-Typ hinzugefügt, was erforderlich ist, damit der ORM versucht, eine ORM-gemappte HSTORE-Spalte beim Anfordern in einer gemischten Spalten-/Entitätsliste nicht zu "hashen". Patch von Gunnlaugur Þór Briem.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3053
[postgresql] [bug] ¶
Eine neue "disconnect"-Nachricht "connection has been closed unexpectedly" wurde hinzugefügt. Dies scheint mit neueren SSL-Versionen zusammenzuhängen. Pull-Request von Antti Haapala.
Diese Änderung wird auch **zurückportiert** nach: 0.8.7
[postgresql] [bug] ¶
Der `.closed`-Accessor von psycopg2 wird nun konsultiert, um festzustellen, ob eine Ausnahme eine „Disconnect“-Fehlermeldung ist; idealerweise sollte dies die Notwendigkeit weiterer Überprüfungen der Ausnahmemeldung zur Erkennung von Trennungen beseitigen, jedoch werden die bestehenden Meldungen als Fallback beibehalten. Dies sollte neuere Fälle wie „SSL EOF“-Bedingungen behandeln können. Pull Request von Dirk Mueller.
Referenzen: #3021
[postgresql] [enhancement] ¶
Neuer Typ
OIDzum PostgreSQL-Dialekt hinzugefügt. Während „oid“ im Allgemeinen ein privater Typ innerhalb von PG ist, der in modernen Versionen nicht exponiert wird, gibt es einige PG-Anwendungsfälle wie die Unterstützung großer Objekte, bei denen diese Typen möglicherweise exponiert werden, sowie bei einigen vom Benutzer gemeldeten Schema-Reflexionsfällen.Referenzen: #3002
mysql¶
[mysql] [bug] ¶
Fehler behoben, bei dem Spaltennamen, die dem Parameter
mysql_lengthauf einem Index hinzugefügt wurden, die gleiche Anführungszeichen für Anführungszeichennamen benötigten, um erkannt zu werden. Die Korrektur macht die Anführungszeichen optional, bietet aber auch das alte Verhalten für Abwärtskompatibilität mit denen, die den Workaround verwenden.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3085
[mysql] [bug] ¶
Unterstützung für das Reflektieren von Tabellen hinzugefügt, bei denen ein Index KEY_BLOCK_SIZE mit einem Gleichheitszeichen enthält. Pull-Request von Sean McGivern.
Diese Änderung wird auch **zurückportiert** nach: 0.8.7
mssql¶
[mssql] [bug] ¶
Die Abfrage zur Ermittlung des aktuellen Standard-Schemanamens wurde überarbeitet, um die Funktion
database_principal_id()in Verbindung mit der Ansichtsys.database_principalszu verwenden, so dass das Standard-Schema unabhängig von der Art des aktuellen Logins (z. B. SQL Server, Windows usw.) ermittelt werden kann.Referenzen: #3025
tests¶
misc¶
[bug] [declarative] ¶
Das Wörterbuch
__mapper_args__wird von einer deklarativen Mixin- oder abstrakten Klasse kopiert, wenn darauf zugegriffen wird, sodass Modifikationen, die von der Deklaration selbst an diesem Wörterbuch vorgenommen werden, nicht mit denen anderer Mappings kollidieren. Das Wörterbuch wird in Bezug auf die Argumenteversion_id_colundpolymorphic_onmodifiziert und ersetzt die Spalte darin durch die, die offiziell der lokalen Klasse/Tabelle zugeordnet ist.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
Referenzen: #3062
[bug] [ext] ¶
Fehler in der Erweitungsfunktion für mutable Typen behoben, bei der
MutableDictkeine Änderungsereignisse für die Wörterbuchoperationsetdefault()meldete.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
[bug] [ext] ¶
Fehler behoben, bei dem
MutableDict.setdefault()nicht den vorhandenen oder neuen Wert zurückgab (dieser Fehler wurde in keiner 0.8-Version veröffentlicht). Pull-Request von Thomas Hervé.Diese Änderung wird auch **zurückportiert** nach: 0.8.7
[bug] [testsuite] ¶
In der öffentlichen Testsuite wurde
String(40)anstelle des weniger unterstütztenTextinStringTest.test_literal_backslashesverwendet. Pullreq von Jan.[bug] [firebird] ¶
Fehler behoben, bei dem die Kombination aus „limit“, das als „SELECT FIRST n ROWS“ mit einem gebundenen Parameter gerendert wird (nur Firebird hat beides), in Verbindung mit spaltenweisen Unterabfragen, die ebenfalls „limit“ und „positionelle“ gebundene Parameter (z. B. qmark-Stil) aufweisen, fälschlicherweise die Positionen der Unterabfrageebene vor denen der umschließenden SELECT zuordnete, wodurch Parameter außerhalb der Reihenfolge zurückgegeben wurden.
Referenzen: #3038
0.9.4¶
Veröffentlicht: 28. März 2014general¶
[general] [feature] ¶
Unterstützung für pytest zum Ausführen von Tests wurde hinzugefügt. Dieser Runner wird derzeit zusätzlich zu nose unterstützt und wird wahrscheinlich in Zukunft gegenüber nose bevorzugt. Das von SQLAlchemy verwendete Nose-Plugin-System wurde aufgeteilt, sodass es auch unter pytest funktioniert. Es gibt derzeit keine Pläne, die Unterstützung für nose einzustellen, und wir hoffen, dass die Testsuite selbst so unabhängig von der Testplattform wie möglich bleibt. Informationen zur Ausführung von Tests mit pytest finden Sie in der Datei README.unittests.rst.
Das Test-Plugin-System wurde ebenfalls erweitert, um Tests gegen mehrere Datenbank-URLs gleichzeitig ausführen zu können, indem die Flags
--dbund/oder--dburimehrmals angegeben werden. Dies führt nicht die gesamte Testsuite für jede Datenbank aus, sondern ermöglicht es Tests, die spezifisch für bestimmte Backends sind, dieses Backend während der Testausführung zu nutzen. Bei Verwendung von pytest als Test-Runner führt das System die spezifischen Test-Suiten auch mehrmals aus, einmal für jede Datenbank, insbesondere die Tests innerhalb der „Dialekt-Suite“. Geplant ist, dass das erweiterte System auch von Alembic verwendet wird und Alembic die Ausführung von Migration-Operations-Tests gegen mehrere Backends in einem Lauf ermöglicht, einschließlich Drittanbieter-Backends, die nicht in Alembic selbst enthalten sind. Drittanbieter-Dialekte und -Erweiterungen werden ebenfalls ermutigt, sich an der Testsuite von SQLAlchemy als Basis zu orientieren; siehe die Datei README.dialects.rst für Hintergrundinformationen zum Aufbau auf der Testplattform von SQLAlchemy.[general] [bug] ¶
Die Datei `setup.py` wurde angepasst, um die mögliche zukünftige Entfernung der `setuptools.Feature`-Erweiterung aus setuptools zu unterstützen. Wenn dieses Schlüsselwort nicht vorhanden ist, wird die Einrichtung mit setuptools weiterhin erfolgreich sein, anstatt auf distutils zurückzugreifen. C-Extension-Kompilierung kann nun auch durch Setzen der Umgebungsvariablen DISABLE_SQLALCHEMY_CEXT deaktiviert werden. Diese Variable funktioniert, unabhängig davon, ob setuptools überhaupt verfügbar ist.
Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #2986
[general] [bug] ¶
Einige Test-/Feature-Fehler, die in Python 3.4 auftraten, wurden behoben, insbesondere die Logik zum Umwickeln von „column default“-Aufrufbaren funktionierte für Python-Built-ins nicht richtig.
Referenzen: #2979
orm¶
[orm] [feature] ¶
Neuer Parameter
mapper.confirm_deleted_rowshinzugefügt. Standardmäßig True, zeigt an, dass eine Reihe von DELETE-Anweisungen bestätigen sollte, dass die Cursor-Zeilenanzahl mit der Anzahl der Primärschlüssel übereinstimmt, die hätte übereinstimmen sollen; dieses Verhalten wurde in den meisten Fällen (außer bei Verwendung von version_id) entfernt, um den ungewöhnlichen Sonderfall von selbst-referenziellen ON DELETE CASCADE zu unterstützen; um dies zu ermöglichen, ist die Meldung nun nur eine Warnung und keine Ausnahme, und das Flag kann verwendet werden, um eine Zuordnung anzuzeigen, die selbst-referenzielle kaskadierende Löschungen dieser Art erwartet. Siehe auch #2403 für Hintergrundinformationen zur ursprünglichen Änderung.Referenzen: #3007
[orm] [feature] ¶
Eine Warnung wird ausgegeben, wenn die Ereignisse
MapperEvents.before_configured()oderMapperEvents.after_configured()auf einen bestimmten Mapper oder eine zugeordnete Klasse angewendet werden, da die Ereignisse nur für dasMapper-Ziel auf allgemeiner Ebene aufgerufen werden.[orm] [feature] ¶
Neues Schlüsselwortargument
once=Truezulisten()undlistens_for()hinzugefügt. Dies ist ein Komfortmerkmal, das den gegebenen Listener so umwickelt, dass er nur einmal aufgerufen wird.[orm] [feature] ¶
Neue Option zu
relationship.innerjoinhinzugefügt, nämlich die Angabe des Strings"nested". Wenn auf"nested"gesetzt anstatt aufTrue, werden die „verketteten“ Joins den inneren Join auf der rechten Seite eines bestehenden äußeren Joins in Klammern setzen, anstatt als Zeichenkette von äußeren Joins zu verketten. Dies hätte möglicherweise das Standardverhalten sein sollen, als 0.9 veröffentlicht wurde, da wir das Merkmal von rechts verschachtelten Joins in der ORM eingeführt haben. Wir behalten es jedoch vorerst als nicht standardmäßig bei, um weitere Überraschungen zu vermeiden.Referenzen: #2976
[orm] [bug] ¶
ORM-Fehler behoben, bei dem das Ändern des Primärschlüssels eines Objekts und das anschließende Markieren zum LÖSCHEN dazu führte, dass die falsche Zeile zum LÖSCHEN anvisiert wurde.
Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #3006
[orm] [bug] ¶
Regression aus Version 0.8.3 als Ergebnis von #2818 behoben, bei der
Query.exists()bei einer Abfrage, die nur einenQuery.select_from()-Eintrag, aber keine anderen Entitäten enthielt, nicht funktionierte.Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #2995
[orm] [bug] ¶
Fehlermeldung verbessert, die auftrat, wenn eine Abfrage gegen ein nicht auswählbares Element, wie z. B. ein
literal_column(), ausgeführt wurde und dann versucht wurde,Query.join()zu verwenden, sodass die „linke“ Seite alsNonebestimmt wurde und dann fehlschlug. Diese Bedingung wird nun explizit erkannt.Diese Änderung wird auch auf **zurückportiert**: 0.8.6
[orm] [bug] ¶
Veraltete Namen aus
sqlalchemy.orm.interfaces.__all__entfernt und mit aktuellen Namen aktualisiert, sodass einimport *aus diesem Modul wieder funktioniert.Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #2975
[orm] [bug] ¶
Ein sehr altes Verhalten wurde behoben, bei dem das für eine One-to-Many-Beziehung ausgegebene Lazy-Load unangemessen die übergeordnete Tabelle einbeziehen und Ergebnisse zurückgeben konnte, die inkonsistent mit dem in der übergeordneten Tabelle sind, wenn die Primaryjoin eine Art Diskriminator gegen die übergeordnete Tabelle enthält, wie z. B.
and_(parent.id == child.parent_id, parent.deleted == False). Obwohl diese Primaryjoin für eine One-to-Many-Beziehung nicht viel Sinn ergibt, ist sie bei Anwendung auf die Many-to-One-Seite etwas üblicher, und die One-to-Many-Beziehung ergibt sich aus einer Backref. Das Laden von Zeilen auschildwürde in diesem Fallparent.deleted == Falsein der Abfrage beibehalten, wodurch es in die FROM-Klausel gezogen und ein kartesisches Produkt gebildet wird. Das neue Verhalten wird nun den Wert des lokalen „parent.deleted“ für diesen Parameter wie vorgesehen ersetzen. In einer realen Anwendung möchte man jedoch wahrscheinlich ohnehin eine andere Primaryjoin für die o2m-Seite verwenden.Referenzen: #2948
[orm] [bug] ¶
Die Prüfung für „wie von A nach B verbinden“ wurde verbessert, so dass, wenn eine Tabelle mehrere zusammengesetzte Fremdschlüssel hat, die auf eine übergeordnete Tabelle zeigen, das Argument
relationship.foreign_keysordnungsgemäß interpretiert wird, um die Mehrdeutigkeit aufzulösen; zuvor hätte diese Bedingung ausgelöst, dass mehrere FK-Pfade vorhanden sind, obwohl das foreign_keys-Argument festlegen sollte, welcher erwartet wird.Referenzen: #2965
[orm] [bug] ¶
Unterstützung für das noch nicht vollständig dokumentierte Flag
insert=Truefürlisten()wurde hinzugefügt, um mit Mapper- und Instanzereignissen zu arbeiten.[orm] [bug] [engine] ¶
Fehler behoben, bei dem Ereignisse, die auf Klassenebene (z. B. auf Mapper- oder ClassManager-Ebene, im Gegensatz zu einer einzelnen zugeordneten Klasse, und auch auf Connection-Ebene) abgehört wurden und interne Argumentkonvertierungen nutzten (was in diesen Kategorien die meisten sind), nicht entfernt werden konnten.
Referenzen: #2973
[orm] [bug] ¶
Regression aus 0.8 behoben, bei der die Verwendung einer Option wie
lazyload()mit dem „Wildcard“-Ausdruck, z. B."*", eine Assertionsfehler auslöste, wenn die Abfrage keine tatsächlichen Entitäten enthielt. Diese Assertion war für andere Fälle gedacht und hat diesen versehentlich abgefangen.[orm] [bug] [sqlite] ¶
Weitere Korrekturen an SQLite „join rewriting“; die Korrektur aus #2967, die kurz vor der Veröffentlichung von 0.9.3 implementiert wurde, betraf den Fall, dass eine UNION verschachtelte Joins enthielt. „Join rewriting“ ist eine Funktion mit einer breiten Palette von Möglichkeiten und die erste komplizierte „SQL rewriting“-Funktion, die wir seit Jahren eingeführt haben. Daher durchlaufen wir damit viele Iterationen (nicht unähnlich dem Eager Loading in der Serie 0.2/0.3, dem polymorphen Laden in 0.4/0.5). Wir sollten bald so weit sein, also vielen Dank für Ihre Geduld :).
Referenzen: #2969
Beispiele¶
[Beispiele] [Fehler] ¶
Fehler im Beispiel `versioned_history` behoben, bei dem INSERT-Standardwerte auf Spaltenebene das Schreiben von history-Werten von NULL verhindert hätten.
Engine¶
[Engine] [Funktion] ¶
Einige neue Ereignismechanismen für ereignisse auf Dialektebene hinzugefügt; die anfängliche Implementierung ermöglicht es einem Ereignisbehandler, die spezifischen Mechanismen neu zu definieren, mit denen ein beliebiger Dialekt `execute()` oder `executemany()` auf einem DBAPI-Cursor aufruft. Die neuen Ereignisse, zu diesem Zeitpunkt semi-öffentlich und experimentell, unterstützen einige bevorstehende transaktionsbezogene Erweiterungen.
[Engine] [Funktion] ¶
Ein Ereignis-Listener kann jetzt mit einer
Engineverknüpft werden, nachdem ein oder mehrereConnection-Objekte erstellt wurden (z. B. durch eine ORMSessionoder durch explizites `connect`), und der Listener wird Ereignisse von diesen Verbindungen empfangen. Zuvor schoben Leistungserwägungen die Ereignisübertragung vonEngineaufConnectionnur zur Initialisierungszeit, aber wir haben eine Reihe von bedingten Prüfungen inline integriert, um dies ohne zusätzliche Funktionsaufrufe zu ermöglichen.Referenzen: #2978
[Engine] [Fehler] ¶
Eine wesentliche Verbesserung der Mechanismen, mit denen die
Engineden Verbindungspool wiederverwendet, wenn eine „Disconnect“-Bedingung erkannt wird; anstatt den Pool zu verwerfen und Verbindungen explizit zu schließen, wird der Pool beibehalten und ein „generationsbezogener“ Zeitstempel aktualisiert, um die aktuelle Zeit widerzuspiegeln, wodurch alle vorhandenen Verbindungen beim nächsten Abruf wiederverwendet werden. Dies vereinfacht den Wiederverwendungsprozess erheblich, beseitigt die Notwendigkeit, Verbindungsversuche „aufzuwecken“, die auf den alten Pool warten, und eliminiert den Wettlaufzustand, dass während des Wiederverwendungsvorgangs viele sofort verwerfene „Pool“-Objekte erstellt werden könnten.Referenzen: #2985
[Engine] [Fehler] ¶
Das Ereignis
ConnectionEvents.after_cursor_execute()wird jetzt für die Methode „_cursor_execute()“ vonConnectionausgelöst; dies ist der „schnelle“ Ausführer, der für Dinge wie das Ausführen einer Sequenz vor einer INSERT-Anweisung verwendet wird, sowie für Dialektstartprüfungen wie Unicode-Rückgaben, Zeichensatz usw. Das EreignisConnectionEvents.before_cursor_execute()wurde hier bereits aufgerufen. Das Flag „executemany“ ist jetzt hier immer auf False gesetzt, da dieses Ereignis immer einer einzelnen Ausführung entspricht. Zuvor konnte das Flag True sein, wenn wir im Auftrag eines `executemany` INSERT-Statements handelten.
SQL¶
[SQL] [Funktion] ¶
Unterstützung für die Literal-Wiedergabe von booleschen Werten hinzugefügt, z. B. „true“ / „false“ oder „1“ / „0“.
[SQL] [Funktion] ¶
Eine neue Funktion
conv()hinzugefügt, deren Zweck es ist, einen Constraint-Namen als bereits einer Namenskonvention unterzogen zu markieren. Dieses Token wird von Alembic-Migrationen ab Alembic 0.6.4 verwendet, um Constraints in Migrationsskripten mit Namen zu rendern, die als bereits einer Namenskonvention unterworfen markiert sind.[SQL] [Funktion] ¶
Das neue Schlüsselwortargument-System auf Dialektebene für Schema-Konstrukte wurde verbessert, um bestehende Schemata zu unterstützen, die auf die Hinzufügung von Ad-hoc-Schlüsselwortargumenten zu Konstrukten angewiesen sind.
Z. B. akzeptiert ein Konstrukt wie
Indexnach der Erstellung wieder Ad-hoc-Schlüsselwortargumente innerhalb derIndex.kwargsSammlung.idx = Index("a", "b") idx.kwargs["mysql_someargument"] = True
Um den Anwendungsfall der Zulassung benutzerdefinierter Argumente zur Konstruktionszeit zu erfüllen, erlaubt die Methode
DialectKWArgs.argument_for()nun diese Registrierung.Index.argument_for("mysql", "someargument", False) idx = Index("a", "b", mysql_someargument=True)
Siehe auch
[SQL] [Fehler] ¶
Fehler im Konstrukt
tuple_()behoben, bei dem der „Typ“ des Wesentlichen ersten SQL-Ausdrucks als „Vergleichstyp“ für einen verglichenen Tupelwert angewendet wurde; dies hatte in einigen Fällen eine unangemessene „Typumwandlung“ zur Folge, wie z. B. wenn ein Tupel mit einer Mischung aus String- und Binärwerten Zielwerte falsch in Binärwerte umwandelte, obwohl dies nicht der Fall war.tuple_()erwartet jetzt heterogene Typen innerhalb seiner Werteliste.Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #2977
[SQL] [Fehler] ¶
Eine 0.9er Regression behoben, bei der eine
Table, die nicht korrekt reflektiert werden konnte, nicht aus der übergeordnetenMetaDataentfernt wurde, obwohl sie sich in einem ungültigen Zustand befand. Pullrequest von Roman Podoliaka.Referenzen: #2988
[SQL] [Fehler] ¶
Die Funktion
MetaData.naming_conventionwird jetzt auch aufCheckConstraint-Objekte angewendet, die direkt mit einerColumnverbunden sind, und nicht nur auf derTable.[SQL] [Fehler] ¶
Fehler in der neuen Funktion
MetaData.naming_conventionbehoben, bei der der Name eines Check-Constraints, der das Token `“%(constraint_name)s”` verwendete, für den von einem booleschen oder Enum-Typ generierten Constraint verdoppelt wurde, und insgesamt doppelte Ereignisse dazu führten, dass das Token `“%(constraint_name)s”` sich immer weiter anhäufte.Referenzen: #2991
[SQL] [Fehler] ¶
Die Logik, die Namen für die `.c`-Sammlung anwendet, wenn ein namenloser
BindParameterempfangen wird, z. B. überliteral()oder ähnlich, wurde angepasst; der „Schlüssel“ des Bind-Parameters wird als Schlüssel innerhalb von `.c` verwendet und nicht der gerenderte Name. Da diese Bindungen ohnehin „anonyme“ Namen haben, ermöglicht dies, dass einzelne gebundene Parameter ihren eigenen Namen innerhalb eines wählbaren Elements haben, wenn sie ansonsten unbeschriftet sind.Referenzen: #2974
[SQL] [Fehler] ¶
Einige Änderungen daran, wie die Sammlung
FromClause.cverhält, wenn sie doppelte Spalten erhält. Das Verhalten, eine Warnung auszugeben und die alte Spalte mit demselben Namen zu ersetzen, bleibt bis zu einem gewissen Grad bestehen; die Ersetzung dient insbesondere der Aufrechterhaltung der Abwärtskompatibilität. Die ersetzte Spalte bleibt jedoch weiterhin mit der `c`-Sammlung assoziiert, jetzt in einer Sammlung `._all_columns`, die von Konstrukten wie Aliases und Unions verwendet wird, um mit der Menge der Spalten in `c` mehr in Richtung dessen umzugehen, was tatsächlich in der Liste der Spalten steht, anstatt der eindeutigen Menge von Schlüsselnamen. Dies hilft in Situationen, in denen SELECT-Anweisungen mit gleichnamigen Spalten in Unions usw. verwendet werden, so dass die Union die Spalten positionell abgleichen kann und es auch eine gewisse Chance gibt, dass `FromClause.corresponding_column()` hier immer noch verwendet werden kann (sie kann jetzt eine Spalte zurückgeben, die nur in `selectable.c._all_columns` und ansonsten nicht benannt ist). Die neue Sammlung ist unterstrichen, da wir noch entscheiden müssen, wo diese Liste landen könnte. Theoretisch wäre sie das Ergebnis von `iter(selectable.c)`, dies würde jedoch bedeuten, dass die Länge der Iteration nicht mehr mit der Länge von `keys()` übereinstimmt, und dieses Verhalten muss überprüft werden.Referenzen: #2974
[SQL] [Fehler] ¶
Problem in der neuen Methode
TextClause.columns()behoben, bei der die Reihenfolge der Spalten, die positionell angegeben wurden, nicht beibehalten wurde. Dies könnte potenzielle Auswirkungen auf positionelle Situationen haben, wie z. B. die Anwendung des resultierendenTextAsFrom-Objekts auf eine Union.
PostgreSQL¶
[PostgreSQL] [Funktion] ¶
„Sane Multi-Row Count“-Überprüfung für das psycopg2 DBAPI aktiviert, da dies anscheinend ab psycopg2 2.0.9 unterstützt wird.
Diese Änderung wird auch auf **zurückportiert**: 0.8.6
[PostgreSQL] [Fehler] ¶
Eine Regression behoben, die durch die Kompatibilitätsverbesserungen von Release 0.8.5 / 0.9.3 verursacht wurde, bei der die Indexreflexion auf PostgreSQL-Versionen, die spezifisch für nur die 8.1, 8.2-Serie waren, erneut fehlschlug, um den immer problematischen `int2vector`-Typ herum. Während `int2vector` Array-Operationen ab 8.1 unterstützt, unterstützt es anscheinend nur CAST zu einem VARCHAR ab 8.3.
Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #3000
MySQL¶
[MySQL] [Fehler] ¶
Die Einstellungen für `mysql-connector-python` wurden angepasst; in Py2K ist das Flag „supports unicode statements“ jetzt False, damit SQLAlchemy den *SQL-String* (Hinweis: *nicht* die Parameter) vor dem Senden an die Datenbank in Bytes kodiert. Dies scheint alle Unicode-bezogenen Tests für `mysql-connector` zu bestehen, einschließlich derer, die Tabellen-/Spaltennamen ohne ASCII verwenden, sowie einige Tests für den TEXT-Typ mit Unicode unter `cursor.executemany()`.
Oracle¶
[Oracle] [Funktion] ¶
Eine neue Engine-Option
coerce_to_unicode=Truefür den `cx_Oracle`-Dialekt hinzugefügt, die den Ansatz des `cx_Oracle outputtypehandler` für die Python-Unicode-Konvertierung unter Python 2 wiederherstellt, der in 0.9.2 als Ergebnis von #2911 entfernt wurde. Einige Anwendungsfälle bevorzugen es, dass die Unicode-Konvertierung für alle String-Werte unbedingt erfolgt, trotz Leistungsbedenken. Pull Request von Christoph Zwerschke.Referenzen: #2911
[Oracle] [Fehler] ¶
Ein neuer Datentyp
DATEhinzugefügt, der eine Unterklasse vonDateTimeist. Da Oracle keinen „datetime“-Typ an sich hat, sondern nurDATE, ist es hier angebracht, dass derDATE-Typ, wie er im Oracle-Dialekt vorhanden ist, eine Instanz vonDateTimeist. Dieses Problem ändert nichts am Verhalten des Typs, da die Datenkonvertierung ohnehin vom DBAPI gehandhabt wird, jedoch wird das verbesserte Unterklassenlayout die Anwendungsfälle der Typinspektion für die übergreifende Datenbankkompatibilität unterstützen. Außerdem wurde das Großbuchstaben-DATETIMEaus dem Oracle-Dialekt entfernt, da dieser Typ in diesem Kontext nicht funktionsfähig ist.Referenzen: #2987
Tests¶
Sonstiges¶
[Fehler] [Erweiterung] ¶
Fehler in der `mutable`-Erweiterung sowie in
flag_modified()behoben, bei der das Änderungsereignis nicht weitergegeben wurde, wenn das Attribut auf sich selbst zurückgesetzt wurde.Diese Änderung wird auch auf **zurückportiert**: 0.8.6
Referenzen: #2997
[Fehler] [Automap] [Erweiterung] ¶
Unterstützung für Automap hinzugefügt für den Fall, dass keine Beziehung zwischen zwei Klassen erstellt werden sollte, die sich in einer Joined-Inheritance-Beziehung befinden, für jene Fremdschlüssel, die die Unterklasse zurück zur Oberklasse verknüpfen.
Referenzen: #3004
[Fehler] [Pool] ¶
Kleiner Fehler in
SingletonThreadPoolbehoben, bei dem die aktuell zurückzugebende Verbindung während des „Cleanup“-Prozesses versehentlich bereinigt werden konnte. Patch von jd23.[Fehler] [Erweiterung] [Py3k] ¶
Fehler in der assoziations-proxy behoben, bei dem die Zuweisung eines leeren Slices (z. B.
x[:] = [...]) unter Py3k fehlschlug.[Fehler] [Erweiterung] ¶
Eine Regression im assoziations-proxy behoben, die durch #2810 verursacht wurde und dazu führte, dass ein vom Benutzer bereitgestellter „Getter“ keine `None`-Werte mehr erhielt, wenn skalare Werte von einem nicht vorhandenen Ziel abgerufen wurden. Die durch diese Änderung eingeführte Prüfung auf None wird nun in den Standard-Getter verschoben, sodass ein vom Benutzer bereitgestellter Getter ebenfalls wieder None-Werte erhält.
Referenzen: #2810
0.9.3¶
Veröffentlicht: 19. Februar 2014ORM¶
[ORM] [Funktion] ¶
Ein neues Ereignis
MapperEvents.before_configured()hinzugefügt, das ein Ereignis am Anfang vonconfigure_mappers()ermöglicht, sowie einen `__declare_first__()`-Hook innerhalb von Declarative, um `__declare_last__()` zu ergänzen.[ORM] [Fehler] ¶
Fehler behoben, bei dem
Query.get()beim Aufruf einer Abfrage mit vorhandenen Kriterien dieInvalidRequestError, die ausgelöst wird, wenn die gegebene Identität bereits in der Identitätsmap vorhanden ist, nicht konsistent auslöste.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2951
[ORM] [Fehler] [SQLite] ¶
Fehler in der SQLite „join rewriting“-Funktion behoben, bei der die Verwendung eines `exists()`-Konstrukts nicht richtig umgeschrieben wurde, z. B. wenn `exists()` in einem komplexen verschachtelten Join-Szenario einer `column_property` zugeordnet wurde. Ein verwandtes Problem wurde ebenfalls behoben, bei dem das Join-Rewriting für die Spaltenklausel der SELECT-Anweisung fehlschlug, wenn die Ziele aliasierte Tabellen waren, im Gegensatz zu einzelnen aliasierten Spalten.
Referenzen: #2967
[ORM] [Fehler] ¶
Eine 0.9er Regression behoben, bei der ORM-Instanz- oder Mapper-Ereignisse, die auf eine Basisklasse wie eine deklarative Basis mit dem Flag `propagate=True` angewendet wurden, aufgrund einer Assertion nicht auf bereits zugeordnete Klassen, die ebenfalls Vererbung nutzten, angewendet wurden. Zusätzlich wurde ein Attributfehler behoben, der beim Entfernen eines solchen Ereignisses auftreten konnte, je nachdem, wie es zuerst zugewiesen wurde.
Referenzen: #2949
[ORM] [Fehler] ¶
Die Initialisierungslogik von zusammengesetzten Attributen wurde verbessert, sodass der Aufruf von
MyClass.attributenicht erfordert, dass der `configure mappers`-Schritt stattgefunden hat, d. h. er funktioniert einfach ohne Fehler.Referenzen: #2935
[ORM] [Fehler] ¶
Weitere Probleme mit [ticket:2932], die erstmals in 0.9.2 behoben wurden, bei denen die Verwendung eines Spaltenschlüssels der Form `
_ `, der mit einem aliasierten Spaltenschlüssel im Text übereinstimmte, auf ORM-Ebene immer noch nicht übereinstimmte, was letztendlich auf ein Kernproblem bei der Spaltenübereinstimmung zurückzuführen ist. Zusätzliche Regeln wurden hinzugefügt, damit der Spalten-`_label` bei der Arbeit mit einem TextAsFrom-Konstrukt oder mit Literalspalten berücksichtigt wird.Referenzen: #2932
ORM Deklarativ¶
[ORM] [Deklarativ] [Fehler] ¶
Fehler behoben, bei dem
AbstractConcreteBasenicht vollständig in der deklarativen Beziehungszuordnung verwendbar war, da sein String-Klassenname zum Zeitpunkt der Mapper-Konfiguration nicht im Verzeichnis der Klassennamen verfügbar war. Die Klasse fügt sich jetzt explizit dem Klassenverzeichnis hinzu, und zusätzlich richten sich sowohlAbstractConcreteBaseals auchConcreteBaseselbst ein, *bevor* Mapper im Rahmen desconfigure_mappers()-Setups konfiguriert werden, unter Verwendung des neuenMapperEvents.before_configured()-Ereignisses.Referenzen: #2950
Beispiele¶
[Beispiele] [Funktion] ¶
Optionale „changed“-Spalte zum Beispiel für versionierte Zeilen hinzugefügt, sowie Unterstützung für den Fall, dass die versionierte
Tableein explizitesTable.schema-Argument hat. Pullrequest von jplaverdure.
Engine¶
[Engine] [Fehler] [Pool] ¶
Eine kritische Regression behoben, die durch #2880 verursacht wurde, bei der die neu gleichzeitige Möglichkeit, Verbindungen aus dem Pool zurückzugeben, dazu führte, dass auch das „first_connect“-Ereignis nicht mehr synchronisiert war, was zu Dialektfehlkonfigurationen selbst unter geringer Gleichzeitigkeit führte.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
SQL¶
[SQL] [Fehler] ¶
Fehler behoben, bei dem der Aufruf von
Insert.values()mit einer leeren Liste oder einem leeren Tupel einen `IndexError` auslöste. Es erzeugt nun ein leeres Insert-Konstrukt, wie es bei einem leeren Dictionary der Fall wäre.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2944
[SQL] [Fehler] ¶
Fehler behoben, bei dem
ColumnOperators.in_()in eine Endlosschleife geriet, wenn ihm fälschlicherweise ein Spaltenausdruck übergeben wurde, dessen Comparator die Methode `__getitem__()` enthielt, wie z. B. eine Spalte, die denARRAY-Typ verwendet.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2957
[SQL] [Fehler] ¶
Regression in der neuen Funktion „Namenskonvention“ behoben, bei der Konventionen fehlschlugen, wenn die in einem Fremdschlüssel referenzierte Tabelle einen Schemanamen enthielt. Pullrequest von Thomas Farvour.
[SQL] [Fehler] ¶
Fehler behoben, bei dem die sogenannte „Literal-Render“-Funktion für
bindparam()-Konstrukte fehlschlug, wenn das Bind mit einem Callable statt einem direkten Wert konstruiert wurde. Dies verhinderte, dass ORM-Ausdrücke mit dem Compiler-Flag „literal_binds“ gerendert wurden.
PostgreSQL¶
[PostgreSQL] [Funktion] ¶
Zugriff `TypeEngine.python_type` als Komfortfunktion auf den Typ
ARRAYhinzugefügt. Pullrequest von Alexey Terentev.[PostgreSQL] [Fehler] ¶
Eine zusätzliche Meldung zur Erkennung von psycopg2-Discounts hinzugefügt: „could not send data to server“, die die bestehende Meldung „could not receive data from server“ ergänzt und von Benutzern beobachtet wurde.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2936
[PostgreSQL] [Fehler] ¶
Die Unterstützung für das PostgreSQL-Reflexionsverhalten auf sehr alten (vor 8.1) Versionen von PostgreSQL und möglicherweise anderen PG-Engines wie Redshift (vorausgesetzt, Redshift meldet die Version als < 8.1) wurde verbessert. Die Abfrage für „Indizes“ sowie „Primärschlüssel“ stützt sich auf die Inspektion eines sogenannten „int2vector“-Datentyps, der vor 8.1 die Umwandlung in ein Array verweigert, was zu Fehlern beim Operator „ANY()“ in der Abfrage führt. Ausgiebige Recherchen haben die sehr hacky, aber von PG-Kernentwicklern empfohlene Abfrage gefunden, die verwendet werden soll, wenn PG-Version < 8.1 verwendet wird. Daher funktionieren Index- und Primärschlüssel-Constraint-Reflexionen auf diesen Versionen jetzt.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[PostgreSQL] [Fehler] ¶
Diese sehr alte Ausgabe wurde überarbeitet, bei der die PostgreSQL-Abfrage zum Abrufen von Primärschlüsseln aktualisiert wurde, um Primärschlüssel-Constraints zu berücksichtigen, die umbenannt wurden; die neuere Abfrage schlägt bei sehr alten Versionen von PostgreSQL wie Version 7 fehl, sodass die alte Abfrage in diesen Fällen wiederhergestellt wird, wenn `server_version_info < (8, 0)` erkannt wird.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2291
[PostgreSQL] [Fehler] ¶
Serverversionserkennung zu der neu hinzugefügten Dialekt-Startabfrage für „show standard_conforming_strings“ hinzugefügt; da diese Variable ab PG 8.2 hinzugefügt wurde, wird die Abfrage für PG-Versionen übersprungen, die eine frühere Versionszeichenfolge melden.
Referenzen: #2946
MySQL¶
[MySQL] [Funktion] ¶
Neuer MySQL-spezifischer
DATETIMEmit Unterstützung für Bruchteile von Sekunden hinzugefügt; auch die Unterstützung für Bruchteile von Sekunden wurde zuTIMESTAMPhinzugefügt. DBAPI-Unterstützung ist begrenzt, obwohl bekannt ist, dass Bruchteile von Sekunden von MySQL Connector/Python unterstützt werden. Patch von Geert JM Vanderkelen.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2941
[mysql] [bug] ¶
Unterstützung für die MySQL-Tabellen-Schlüsselwörter
PARTITION BYundPARTITIONS, angegeben alsmysql_partition_by='value'undmysql_partitions='value', fürTablehinzugefügt. Pull Request von Marcus McCurdy.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2966
[mysql] [bug] ¶
Fehler behoben, der verhinderte, dass MySQLdb-basierte Dialekte (z. B. pymysql) unter Py3K funktionierten, wo eine Prüfung auf "connection charset" aufgrund der strengeren Wertvergleichsregeln von Py3K fehlschlug. Der betreffende Aufruf berücksichtigte ohnehin die Datenbankversion nicht, da die Serverversion zu diesem Zeitpunkt noch None war, daher wurde die Methode insgesamt vereinfacht, um auf connection.character_set_name() zu setzen.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2933
[mysql] [bug] [cymysql] ¶
Fehler im cymysql-Dialekt behoben, bei dem eine Versionszeichenkette wie
'33a-MariaDB'nicht richtig geparst werden konnte. Pull Request von Matt Schmidt.Referenzen: #2934
sqlite¶
[sqlite] [bug] ¶
Der SQLite-Dialekt überspringt nun nicht unterstützte Argumente bei der Reflexion von Typen; wenn er beispielsweise auf eine Zeichenkette wie
INTEGER(5)trifft, wird der TypINTEGERohne die "5" instanziiert, basierend auf der Erkennung einesTypeErrorbeim ersten Versuch.[sqlite] [bug] ¶
Die Unterstützung für die Typenreflexion von SQLite wurde hinzugefügt, um den unter https://www.sqlite.org/datatype3.html spezifizierten "type affinity"-Vertrag vollständig zu unterstützen. In diesem Schema assoziieren Schlüsselwörter wie
INT,CHAR,BLOBoderREALim Typnamen den Typ generisch mit einer von fünf Affinitäten. Pull Request von Erich Blume.Siehe auch
misc¶
[bug] [ext] ¶
Fehler behoben, bei dem die
AutomapBase-Klasse der neuen automap-Erweiterung fehlschlug, wenn Klassen in einzelner oder potenziell verknüpfter Vererbungsmuster vorab angeordnet waren. Das behobene Problem der verknüpften Vererbung könnte auch bei Verwendung vonDeferredReflectiongelten.
0.9.2¶
Veröffentlicht: 2. Februar 2014orm¶
[orm] [feature] ¶
Ein neuer Parameter
Operators.op.is_comparisonwurde hinzugefügt. Dieses Flag ermöglicht, dass ein benutzerdefinierter Operator vonOperators.op()als "Vergleichs"-Operator betrachtet wird, und somit für benutzerdefinierterelationship.primaryjoin-Bedingungen verwendet werden kann.[orm] [feature] ¶
Die Unterstützung für die Angabe einer
join()-Konstruktion als Ziel vonrelationship.secondaryzur Erstellung sehr komplexerrelationship()-Join-Bedingungen wurde verbessert. Die Änderung umfasst Anpassungen an die Query-Join-Logik, joined eager loading, um keine SELECT-Unterabfrage zu rendern, Änderungen an lazy loading, damit das "sekundäre" Ziel ordnungsgemäß in die SELECT-Anweisung aufgenommen wird, und Änderungen an declarative, um die Angabe eines join()-Objekts mit Klassen als Zielen besser zu unterstützen.Der neue Anwendungsfall ist etwas experimentell, aber ein neuer Dokumentationsabschnitt wurde hinzugefügt.
Siehe auch
[orm] [bug] ¶
Fehlermeldung behoben, wenn ein Iterator-Objekt an
class_mapper()oder ähnliche übergeben wurde, bei der die Fehlermeldung bei der Stringformatierung fehlschlug. Pullreq von Kyle Stark.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[orm] [bug] ¶
Fehler in der neuen
TextAsFrom-Konstruktion behoben, bei der spaltenorientierte Zeilenzugriffe nicht mit den Ad-hoc-ColumnClause-Objekten übereinstimmten, dieTextAsFromgeneriert, wodurch es nicht als Ziel inQuery.from_statement()verwendet werden konnte. Ebenfalls behoben wurden die Mechaniken vonQuery.from_statement(), um eineTextAsFromnicht mit einerSelect-Konstruktion zu verwechseln. Dieser Fehler ist auch eine Regression von 0.9, da die MethodeTextClause.columns()aufgerufen wird, um das Argumenttext.typemapzu berücksichtigen.Referenzen: #2932
[orm] [bug] ¶
Eine neue Direktive wurde hinzugefügt, die im Geltungsbereich einer Attribut-"set"-Operation verwendet wird, um Autoflush zu deaktivieren, falls das Attribut den "alten" Wert lazy laden muss, z. B. beim Ersetzen von One-to-One-Werten oder bestimmten Arten von Many-to-One. Ein Flush zu diesem Zeitpunkt tritt sonst zum Zeitpunkt auf, an dem das Attribut None ist, und kann zu NULL-Verletzungen führen.
Referenzen: #2921
[orm] [bug] ¶
Eine 0.9-Regression wurde behoben, bei der die automatische Aliasbildung durch
Queryund in anderen Situationen, in denen SELECTs oder Joins aliasiert wurden (wie z. B. joined table inheritance), fehlschlug, wenn eine benutzerdefinierteColumn-Unterklasse im Ausdruck verwendet wurde. In diesem Fall konnte die Unterklasse die ORM-spezifischen "Annotationen" nicht weitergeben, die für die Anpassung benötigt wurden. Das System für "Ausdrucksannotationen" wurde korrigiert, um diesen Fall zu berücksichtigen.Referenzen: #2918
[orm] [bug] ¶
Ein Fehler im Zusammenhang mit den neuen abgeflachten JOIN-Strukturen, die mit
joinedload()(und somit eine Regression im joined eager loading verursachten) sowie mitaliased()in Verbindung mit dem Flagflat=Trueund joined-table inheritance behoben; im Wesentlichen wurden mehrere Joins über eine "parent JOIN sub"-Entität, die verschiedene Pfade zu einer Zielklasse nutzten, nicht korrekt mit ON-Bedingungen verbunden. Eine Anpassung/Vereinfachung in der Mechanik zur Ermittlung der "linken Seite" des Joins im Falle einer aliased, joined-inh-Klasse behebt das Problem.Referenzen: #2908
examples¶
[examples] [bug] ¶
Ein kleiner Hinweis wurde zum "history_meta"-Beispiel hinzugefügt: Die Prüfung auf "history" bei einem beziehungsgebundenen Attribut sendet nun keine SQL-Abfragen mehr aus, wenn die Beziehung nicht geladen ist.
engine¶
[engine] [feature] [pool] ¶
Ein neues Pool-Ereignis
PoolEvents.invalidate()wurde hinzugefügt. Wird aufgerufen, wenn eine DBAPI-Verbindung als "invalidiert" markiert und aus dem Pool entfernt werden soll.
sql¶
[sql] [feature] ¶
Ein neuer Parameter
MetaData.reflect.dialect_kwargswurde hinzugefügt, um Dialekt-spezifische Reflexionsoptionen für alle reflektiertenTable-Objekte zu unterstützen.[sql] [feature] ¶
Ein neues Feature wurde hinzugefügt, das die Anwendung von automatisierten Namenskonventionen für
Constraint- undIndex-Objekte ermöglicht. Basierend auf einem Rezept im Wiki verwendet das neue Feature Schema-Ereignisse, um Namen einzurichten, wenn verschiedene Schema-Objekte miteinander verbunden werden. Die Ereignisse stellen dann ein Konfigurationssystem über ein neues ArgumentMetaData.naming_conventionbereit. Dieses System ermöglicht die Erstellung von einfachen und benutzerdefinierten Namensschemata für Constraints und Indizes proMetaData.Referenzen: #2923
[sql] [feature] ¶
Optionen können nun unabhängig von der Angabe von Spalten in der Tabelle mit dem Flag
primary_key=Trueauf einemPrimaryKeyConstraint-Objekt angegeben werden; verwenden Sie einPrimaryKeyConstraint-Objekt ohne Spalten, um dieses Ergebnis zu erzielen.Zuvor hatte eine explizite
PrimaryKeyConstraintzur Folge, dass diese Spalten alsprimary_key=Truemarkiert wurden, was ignoriert wurde. Da dies nicht mehr der Fall ist, stellt diePrimaryKeyConstraintnun sicher, dass entweder ein Stil oder der andere zur Angabe der Spalten verwendet wird, oder wenn beide vorhanden sind, dass die Spaltenlisten exakt übereinstimmen. Wenn eine inkonsistente Menge von Spalten in derPrimaryKeyConstraintund innerhalb derTablealsprimary_key=Truemarkiert sind, wird eine Warnung ausgegeben und die Liste der Spalten wird nur aus derPrimaryKeyConstraintallein übernommen, wie es in früheren Versionen der Fall war.Siehe auch
Referenzen: #2910
[sql] [feature] ¶
Das System, über das Schema-Konstrukte und bestimmte SQL-Konstrukte Dialekt-spezifische Schlüsselwortargumente akzeptieren, wurde verbessert. Dieses System umfasst typischerweise die Konstrukte
TableundIndex, die eine Vielzahl von Dialekt-spezifischen Argumenten wiemysql_engineundpostgresql_whereakzeptieren, sowie die KonstruktePrimaryKeyConstraint,UniqueConstraint,Update,InsertundDelete, und auch neu hinzugefügte Kwarg-Fähigkeit fürForeignKeyConstraintundForeignKey. Die Änderung besteht darin, dass teilnehmende Dialekte nun akzeptable Argumentlisten für diese Konstrukte angeben können, wodurch ein Argumentfehler ausgelöst wird, wenn ein ungültiges Schlüsselwort für einen bestimmten Dialekt angegeben wird. Wenn der Dialektteil des Schlüsselworts nicht erkannt wird, wird nur eine Warnung ausgegeben; während das System tatsächlich Setuptools Entrypoints nutzt, um nicht-lokale Dialekte zu finden, bleibt die Verwendung in Umgebungen, in denen dieser Dialekt nicht installiert ist, unterstützt. Dialekte müssen sich auch explizit für dieses System entscheiden, damit externe Dialekte, die dieses System nicht nutzen, unberührt bleiben.Referenzen: #2866
[sql] [bug] ¶
Das Verhalten von
Table.tometadata()wurde so angepasst, dass das Schema-Ziel einesForeignKeynicht geändert wird, es sei denn, dieses Schema entspricht dem der übergeordneten Tabelle. Das heißt, wenn eine Tabelle "schema_a.user" einen Fremdschlüssel zu "schema_b.order.id" hat, wird das Ziel "schema_b" beibehalten, unabhängig davon, ob das Argument "schema" anTable.tometadata()übergeben wird. Wenn eine Tabelle "schema_a.user" sich jedoch auf "schema_a.order.id" bezieht, wird die Anwesenheit von "schema_a" sowohl auf der übergeordneten als auch auf der referenzierten Tabelle aktualisiert. Dies ist eine Verhaltensänderung, die wahrscheinlich nicht auf 0.8 zurückportiert wird; es wird davon ausgegangen, dass das vorherige Verhalten ziemlich fehlerhaft war und dass es unwahrscheinlich ist, dass sich jemand darauf verlassen hat.Zusätzlich wurde ein neuer Parameter hinzugefügt
Table.tometadata.referred_schema_fn. Dieser bezieht sich auf eine aufrufbare Funktion, die verwendet wird, um das neue referenzierte Schema für jedeForeignKeyConstraintzu bestimmen, auf die bei der tometadata-Operation gestoßen wird. Dieser Aufrufbare kann verwendet werden, um zum vorherigen Verhalten zurückzukehren oder anzupassen, wie referenzierte Schemata pro Constraint behandelt werden.Referenzen: #2913
[sql] [bug] ¶
Fehler behoben, bei dem der Binärtyp in einigen Fällen fehlschlug, wenn er mit einem "Test"-Dialekt verwendet wurde, wie z. B. einem DefaultDialect oder einem anderen Dialekt ohne DBAPI.
[sql] [bug] [py3k] ¶
Fehler behoben, bei dem "literal binds" mit einem gebundenen Parameter, der ein Binärtyp ist, nicht funktionierten. Ein ähnliches, aber anderes Problem wurde in 0.8 behoben.
[sql] [bug] ¶
Regression behoben, bei der das vom ORM verwendete "Annotations"-System in die Namen überging, die von Standardfunktionen in
sqlalchemy.sql.functionsverwendet wurden, wie z. B.func.coalesce()undfunc.max(). Die Verwendung dieser Funktionen in ORM-Attributen und die Erzeugung annotierter Versionen davon konnte den tatsächlichen Funktionsnamen im SQL beschädigen.Referenzen: #2927
[sql] [bug] ¶
0.9-Regression behoben, bei der die neue sortierbare Unterstützung für
RowProxyzu einemTypeErrorführte, wenn sie mit Nicht-Tupel-Typen verglichen wurde, da versucht wurde, tuple() bedingungslos auf das "andere" Objekt anzuwenden. Der vollständige Bereich der Python-Vergleichsoperatoren wurde nun aufRowProxyimplementiert, mit einem Ansatz, der ein Vergleichssystem garantiert, das dem eines Tupels entspricht, und das "andere" Objekt wird nur dann koerziert, wenn es eine Instanz von RowProxy ist.[sql] [bug] ¶
Eine
UniqueConstraint, die inline mit einerTableerstellt wurde, die keine Spalten enthält, wird übersprungen. Pullreq von Derek Harland.[sql] [bug] [orm] ¶
Die Mehrfach-Tabellen "UPDATE..FROM"-Konstruktion, die nur für MySQL verwendbar ist, wurde korrigiert, um die SET-Klausel bei mehreren Spalten mit demselben Namen über Tabellen hinweg korrekt zu rendern. Dies ändert auch den Namen für den gebundenen Parameter in der SET-Klausel auf "
_ " nur für die nicht primäre Tabelle; da dieser Parameter typischerweise direkt mit dem Column-Objekt angegeben wird, sollte dies keine Auswirkungen auf Anwendungen haben. Die Korrektur wirkt sich sowohl aufTable.update()als auch aufQuery.update()im ORM aus.Referenzen: #2912
schema¶
[schema] [bug] ¶
Der
sqlalchemy.schema.SchemaVisitorwurde wieder in das Modul.schemaintegriert. Pullreq von Sean Dague.
postgresql¶
[postgresql] [feature] ¶
Ein neues Dialekt-Argument
postgresql_ignore_search_pathwurde hinzugefügt. Dieses Argument wird sowohl vom KonstruktorTableals auch von der MethodeMetaData.reflect()akzeptiert. Bei Verwendung mit PostgreSQL behält eine referenzierte Tabelle mit Fremdschlüssel, die einen entfernten Schemanamen angibt, diesen Schemanamen bei, auch wenn der Name imsearch_pathvorhanden ist; das Standardverhalten seit 0.7.3 war, dass imsearch_pathvorhandene Schemata nicht in reflektierteForeignKey-Objekte kopiert wurden. Die Dokumentation wurde aktualisiert, um das Verhalten der Funktionpg_get_constraintdef()und wie das Featurepostgresql_ignore_search_pathbestimmt, ob wir die von dieser Funktion gemeldete Schemaqualifizierung honorieren oder nicht, detailliert zu beschreiben.Referenzen: #2922
mysql¶
[mysql] [bug] ¶
Einige fehlende Methoden wurden zum cymysql-Dialekt hinzugefügt, darunter _get_server_version_info() und _detect_charset(). Pullreq von Hajime Nakagami.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[mysql] [bug] [sql] ¶
Neue Testabdeckung für sogenannte "Down-Adaptionen" von SQL-Typen wurde hinzugefügt, bei denen ein spezifischerer Typ an einen generischeren angepasst wird - dieser Anwendungsfall wird von einigen Drittanbieter-Tools wie
sqlacodegenbenötigt. Die spezifischen Fälle, die innerhalb dieser Testsuite repariert werden mussten, waren die vonENUM, die in einEnumheruntergestuft wurden, und die von SQLite-Datumstypen, die in generische Datumstypen umgewandelt wurden. Die Methodeadapt()musste hier spezifischer werden, um die Entfernung einer "Catch-all"-**kwargs-Sammlung aus der BasisklasseTypeEngine, die in 0.9 entfernt wurde, zu konterkarieren.Referenzen: #2917
[mysql] [bug] ¶
Die MySQL CAST-Kompilierung berücksichtigt nun Aspekte eines Stringtyps wie "charset" und "collation". Während MySQL möchte, dass alle zeichenbasierten CAST-Aufrufe den CHAR-Typ verwenden, erstellen wir nun ein echtes CHAR-Objekt zur CAST-Zeit und kopieren alle seine Parameter, sodass ein Ausdruck wie
cast(x, mysql.TEXT(charset='utf8'))CAST(t.col AS CHAR CHARACTER SET utf8)rendert.[mysql] [bug] ¶
Neue "unicode returns"-Erkennung wurde dem MySQL-Dialekt und dem gesamten Standard-Dialektsystem hinzugefügt, sodass jeder Dialekt zusätzliche "Tests" zur Erkennung von "gibt dieser DBAPI direkt Unicode zurück?" hinzufügen kann. In diesem Fall fügen wir eine spezifische Prüfung gegen die "utf8"-Kodierung mit einer expliziten "utf8_bin"-Kollationstyp (nachdem geprüft wurde, ob diese Kollation verfügbar ist) hinzu, um einige fehlerhafte Unicode-Verhalten zu testen, die bei MySQLdb Version 1.2.3 beobachtet wurden. Obwohl MySQLdb dieses Problem ab Version 1.2.4 behoben hat, sollte die hier durchgeführte Prüfung vor Regressionen schützen. Die Änderung ermöglicht auch, dass die "unicode"-Prüfungen in den Engine-Logs protokolliert werden, was zuvor nicht der Fall war.
Referenzen: #2906
[mysql] [bug] [engine] [pool] ¶
Connectionordnet jetzt einer neuenRootTransactionoderTwoPhaseTransactionein "Reset-Handler" für den Zeitraum dieser Transaktion zu seinem unmittelbaren_ConnectionFairyzu, das die Aufgabe übernimmt, commit() oder rollback() für das "Reset bei Rückgabe"-Verhalten vonPoolaufzurufen, falls die Transaktion nicht anderweitig abgeschlossen wurde. Dies löst das Problem, dass eine wählerische Transaktion wie die von MySQL Two-Phase ordnungsgemäß geschlossen wird, wenn die Verbindung ohne explizites Rollback oder Commit geschlossen wird (z. B. in diesem Fall keine "XAER_RMFAIL" mehr ausgelöst werden - beachten Sie, dass dies nur im Protokoll angezeigt wird, da die Ausnahme bei der Pool-Zurücksetzung nicht weitergegeben wird). Dieses Problem würde z. B. bei Verwendung einer ORMSessionmit gesetztemtwophaseauftreten, und dannSession.close()aufgerufen wird, ohne explizites Rollback oder Commit. Die Änderung hat auch zur Folge, dass Sie nun ein explizites "ROLLBACK" in den Protokollen sehen, wenn Sie einSession-Objekt im Nicht-Autocommit-Modus verwenden, unabhängig davon, wie diese Sitzung verworfen wurde. Dank Jeff Dairiki und Laurence Rowe, die das Problem hier isoliert haben.Referenzen: #2907
sqlite¶
[sqlite] [bug] ¶
Fehler behoben, bei dem der SQLite-Compiler Compiler-Argumente wie "literale Bindungen" nicht in einen CAST-Ausdruck weitergab.
mssql¶
[mssql] [feature] ¶
Eine Option
mssql_clusteredwurde den KonstruktenUniqueConstraintundPrimaryKeyConstrainthinzugefügt; unter SQL Server fügt dies das SchlüsselwortCLUSTEREDzum Constraint-Konstrukt innerhalb von DDL hinzu. Pull-Anfrage von Derek Harland.
oracle¶
[oracle] [bug] ¶
Es wurde festgestellt, dass die Verwendung eines cx_Oracle "outputtypehandler" in Python 2.xx zur Umwandlung von Zeichenkettenwerten in Unicode übermäßig teuer ist; obwohl cx_Oracle in C geschrieben ist, zählt die Bibliothek bei der Übergabe des Python
unicodePrimitivs an cursor.var() und der Zuordnung zu einem Ausgabever handler jeden Umwandlungsvorgang als Python-Funktionsaufruf mit dem gesamten erforderlichen Overhead; und das, *trotzdem* wenn in Python 3 ausgeführt, alle Zeichenketten ebenfalls bedingungslos in Unicode umgewandelt werden, dies aber *keinen* zusätzlichen Overhead verursacht, was bedeutet, dass cx_Oracle keine performanten Techniken in Py2K verwendet.Da SQLAlchemy diesen Stil von Typ-Handlern nicht einfach pro Spalte auswählen kann, wurde der Handler bedingungslos zusammengestellt, wodurch der Overhead für den gesamten Zeichenkettenzugriff hinzugefügt wurde.
Daher wurde diese Logik durch das eigene Unicode-Konvertierungssystem von SQLAlchemy ersetzt, das nun nur noch in Py2K für Spalten wirksam wird, die als Unicode angefordert werden. Wenn C-Erweiterungen verwendet werden, scheint das System von SQLAlchemy 2-3x schneller zu sein als das von cx_Oracle. Darüber hinaus wurde die Unicode-Konvertierung von SQLAlchemy verbessert, sodass bei Bedarf des "bedingten" Konverters (jetzt für das Oracle-Backend erforderlich) die Prüfung auf "bereits Unicode" nun in C erfolgt und keinen signifikanten Overhead mehr verursacht.
Referenzen: #2911
Diese Änderung hat zwei Auswirkungen auf das cx_Oracle-Backend. Erstens werden Zeichenkettenwerte in Py2K, die nicht explizit mit dem Unicode-Typ oder convert_unicode=True angefordert wurden, nun als str und nicht als unicode zurückgegeben - dieses Verhalten ähnelt dem eines Backends wie MySQL. Zweitens gibt es beim Abrufen von Unicode-Werten mit dem cx_Oracle-Backend, wenn die C-Erweiterungen *nicht* verwendet werden, nun einen zusätzlichen Overhead von einer isinstance()-Prüfung pro Spalte. Dieser Kompromiss wurde eingegangen, da er umgangen werden kann und die wahrscheinlich überwiegende Mehrheit der Oracle-Ergebnisspalten, die Nicht-Unicode-Zeichenketten sind, nicht mehr mit Leistungsproblemen belegt.
misc¶
[bug] [pool] ¶
Die Argumentnamen für das Ereignis
PoolEvents.reset()wurden indbapi_connectionundconnection_recordumbenannt, um die Konsistenz mit allen anderen Pool-Ereignissen zu wahren. Es wird davon ausgegangen, dass alle bestehenden Listener für dieses relativ neue und selten verwendete Ereignis ohnehin positionsabhängig Argumente empfangen.[bug] [cextensions] [py3k] ¶
Fehler behoben, bei dem die C-Erweiterungen in Py3K die falsche API zur Angabe der Top-Level-Modulfunktion verwendeten, was in Python 3.4b2 zu Problemen führte. Py3.4b2 ändert PyMODINIT_FUNC so, dass es "void" anstelle von PyObject * zurückgibt, daher stellen wir nun sicher, dass "PyMODINIT_FUNC" anstelle von PyObject * direkt verwendet wird. Pull-Anfrage von cgohlke.
0.9.1¶Veröffentlicht: 5. Januar 2014
orm¶
[orm] [bug] [events] ¶
Regression behoben, bei der die Verwendung von
functools.partial()mit dem Ereignissystem einen Rekursionsüberlauf verursachte, da inspect.getargspec() darauf angewendet wurde, um eine ältere Aufru सिग्nature für bestimmte Ereignisse zu erkennen, und es anscheinend keine Möglichkeit gab, dies mit einem partiellen Objekt zu tun. Stattdessen wird die ältere Prüfung übersprungen und vom modernen Stil ausgegangen; die Prüfung findet nun nur noch für die Ereignisse SessionEvents.after_bulk_update und SessionEvents.after_bulk_delete statt. Diese beiden Ereignisse erfordern den neuen Signaturstil, wenn sie einem "partiellen" Ereignis-Listener zugewiesen werden.Referenzen: #2905
[orm] [bug] ¶
Fehler behoben, bei dem die Verwendung des neuen
Session.info-Attributs fehlschlug, wenn das `.info`-Argument nur an densessionmaker-Erstellungsaufruf, aber nicht an das Objekt selbst übergeben wurde. Mit freundlicher Genehmigung von Robin Schoonover.[orm] [bug] ¶
Regression behoben, bei der der gegebene Name nicht mit der richtigen Zeichenkettenklasse abgeglichen wurde, wenn eine Backref basierend auf einem Namen eingerichtet wurde, was zu dem Fehler "zu viele Werte zum Entpacken" führte. Dies hing mit der Py3k-Konvertierung zusammen.
Referenzen: #2901
[orm] [bug] ¶
Regression behoben, bei der anscheinend immer noch ein impliziter Alias erstellt wurde, wenn query(B).join(B.cs) gesagt wurde, wobei "C" eine verknüpfte inh-Klasse ist; dieser implizite Alias wurde jedoch nur unter Berücksichtigung der unmittelbaren linken Seite erstellt und nicht einer längeren Kette von Joins entlang verschiedener verknüpfter inh-Unterklassen derselben Basis. Solange wir in diesem Fall weiterhin implizit aliasieren, wird das Verhalten etwas zurückgeschraubt, sodass die rechte Seite in einer größeren Vielfalt von Fällen aliasisiert wird.
Referenzen: #2903
orm declarative¶
[orm] [declarative] [bug] ¶
Ein extrem unwahrscheinliches Speicherproblem behoben, bei dem bei Verwendung von
DeferredReflectionzur Definition von für die Reflexion ausstehenden Klassen, falls einige dieser Klassen verworfen wurden, bevor die MethodeDeferredReflection.prepare()aufgerufen wurde, um die Klasse zu reflektieren und abzubilden, eine starke Referenz auf die Klasse innerhalb der deklarativen Interna gehalten wurde. Diese interne Sammlung von "abzubildenden Klassen" verwendet nun schwache Referenzen auf die Klassen selbst.[orm] [declarative] [bug] ¶
Eine Quasi-Regression, bei der anscheinend in 0.8 ein Klassenattribut auf deklarative Weise gesetzt werden konnte, um direkt auf ein
InstrumentedAttributeauf einer Oberklasse oder auf der Klasse selbst zu verweisen, und dies mehr oder weniger wie ein Synonym wirkte; in 0.9 scheitert dies daran, genügend Buchhaltung einzurichten, um mit der liberaleren Backref-Logik aus #2789 Schritt zu halten. Obwohl dieser Anwendungsfall nie direkt berücksichtigt wurde, wird er nun von der deklarativen Verarbeitung auf der "setattr()"-Ebene sowie bei der Einrichtung einer Unterklasse erkannt, und das gespiegelte/umbenannte Attribut wird nun stattdessen alssynonym()eingerichtet.
Referenzen: #2900
orm extensions¶
[orm] [extensions] [feature] ¶
Siehe auch
Eine neue, **experimentelle** Erweiterung
sqlalchemy.ext.automapwird hinzugefügt. Diese Erweiterung erweitert die Funktionalität von Declarative sowie die KlasseDeferredReflection, um eine Basisklasse zu erzeugen, die automatisch abgebildete Klassen *und Beziehungen* basierend auf Tabellenmetadaten generiert.
Automap-Erweiterung
Die Logik hier sucht nach einem einzelnen Argument *args, bei dem das erste Element eine Instanz von types.GeneratorType ist.
Die Parameter Table.extend_existing und Table.autoload_replace sind nun auf der Methode MetaData.reflect() verfügbar.
0.9.0¶Veröffentlicht: 30. Dezember 2013
orm¶
[orm] [feature] ¶
Die
StatementErroroder eine DBAPI-bezogene Unterklasse kann nun zusätzliche Informationen über den "Grund" der Ausnahme aufnehmen; dieSessionfügt nun einige Details hinzu, wenn die Ausnahme während eines Autoflush auftritt. Dieser Ansatz wird gewählt, anstattFlushErrormit einem Python 3-Stil "verkettete Ausnahme"-Ansatz zu kombinieren, um die Kompatibilität sowohl mit Py2K-Code als auch mit Code, der bereitsIntegrityErroroder ähnliches abfängt, aufrechtzuerhalten.[orm] [feature] [backrefs] ¶
Siehe auch
Neues Argument
include_backrefs=Truewurde zur Funktionvalidates()hinzugefügt; wenn es auf False gesetzt ist, wird kein Validierungsereignis ausgelöst, wenn das Ereignis als Backref für eine Attributoperation von der anderen Seite initiiert wurde.include_backrefs=False Option für @validates
Referenzen: #1535
[orm] [feature] ¶
Neue FOR UPDATE-Unterstützung für select(), Query()
[orm] [bug] ¶
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Eine Anpassung der
subqueryload()-Strategie, die sicherstellt, dass die Abfrage nach Beginn des Ladevorgangs ausgeführt wird; dies geschieht, damit die subqueryload Vorrang vor anderen Ladern hat, die denselben Attribut treffen könnten, aufgrund anderer Eager/Noload-Situationen zur falschen Zeit.Referenzen: #2887
[orm] [bug] ¶
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Fehler behoben, bei dem bei Verwendung von verknüpfter Tabellenvererbung von einer Tabelle zu einem SELECT/Alias auf der Basis, wenn die PK-Spalten nicht gleich benannt waren, das Persistenzsystem fehlschlug, Primärschlüsselwerte von der Basistabelle auf die vererbte Tabelle beim INSERT zu kopieren.
Referenzen: #2885
[orm] [bug] ¶
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
composite()löst eine informative Fehlermeldung aus, wenn die übergebenen Spalten-/Attributnamen nicht zu einer Spalte oder einem zugeordneten Attribut (wie einem fehlerhaften Tupel) aufgelöst werden; zuvor wurde ein ungebundene lokales ausgelöst.Referenzen: #2889
[orm] [bug] ¶
Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2818
[orm] [bug] [collections] [py3k] ¶
Unterstützung für die Python 3-Methode
list.clear()im ORM-Sammlungs-Instrumentierungssystem hinzugefügt; Pull-Anfrage von Eduardo Schettino.[orm] [bug] ¶
Einige Verfeinerungen des
AliasedClass-Konstrukts in Bezug auf Deskriptoren, wie Hybride, Synonyme, Composite, benutzerdefinierte Deskriptoren usw. Die stattfindende Attributanpassung wurde robuster gestaltet, sodass, wenn ein Deskriptor ein weiteres instrumentiertes Attribut zurückgibt, anstatt eines zusammengesetzten SQL-Ausdruckselements, die Operation trotzdem fortgesetzt wird. Darüber hinaus behält der "angepasste" Operator seine Klasse bei; zuvor führte eine Klassenänderung vonInstrumentedAttributezuQueryableAttribute(einer Oberklasse) zu einer Interaktion mit Pythons Operatorsystem, sodass ein Ausdruck wiealiased(MyClass.x) > MyClass.xumgekehrt wurde, ummyclass.x < myclass_1.xzu lesen. Das angepasste Attribut verweist auch auf die neueAliasedClassals seine Eltern, was zuvor nicht immer der Fall war.Referenzen: #2872
[orm] [bug] ¶
Das Flag
viewonlyinrelationship()verhindert nun, dass Attributverläufe im Namen des Zielattributs geschrieben werden. Dies hat zur Folge, dass das Objekt nicht in dieSession.dirty-Liste geschrieben wird, wenn es mutiert wird. Zuvor war das Objekt inSession.dirtyenthalten, aber während des Flushes fand keine Änderung im Namen des geänderten Attributs statt. Das Attribut löst immer noch Ereignisse aus, wie z. B. Backref-Ereignisse und benutzerdefinierte Ereignisse, und empfängt weiterhin Mutationen von Backrefs.Referenzen: #2833
[orm] [bug] ¶
Unterstützung für das neue
Session.info-Attribut fürscoped_sessionhinzugefügt.[orm] [bug] ¶
Fehler behoben, bei dem die Verwendung des neuen
Bundle-Objekts dazu führte, dass das AttributQuery.column_descriptionsfehlschlug.[orm] [bug] [sql] [sqlite] ¶
Regression behoben, die durch die Join-Rewriting-Funktion von #2369 und #2587 eingeführt wurde, bei der ein verschachtelter Join mit einer bereits aliasierten SELECT-Seite die ON-Klausel auf der Außenseite nicht korrekt übersetzen konnte; im ORM konnte dies bei Verwendung einer SELECT-Anweisung als "sekundäre" Tabelle auftreten.
Referenzen: #2858
orm declarative¶
[orm] [declarative] [bug] ¶
Declarative führt eine zusätzliche Prüfung durch, um zu erkennen, ob dieselbe
Columnunter verschiedenen Eigenschaften mehrmals abgebildet wird (was typischerweise einsynonym()sein sollte) oder ob zwei oder mehrColumn-Objekte denselben Namen erhalten, und gibt eine Warnung aus, wenn diese Bedingung erkannt wird.Referenzen: #2828
[orm] [declarative] [bug] ¶
Die Klasse
DeferredReflectionwurde verbessert, um automatische Reflexionsunterstützung für die "sekundäre" Tabelle bereitzustellen, auf die von einerrelationship()verwiesen wird. "Sekundär", wenn entweder als Zeichenketten-Tabellenname oder alsTable-Objekt mit nur einem Namen undMetaData-Objekt angegeben, wird ebenfalls in den Reflexionsprozess einbezogen, wennDeferredReflection.prepare()aufgerufen wird.Referenzen: #2865
[orm] [declarative] [bug] ¶
Fehler behoben, bei dem in Py2K ein Unicode-Literal nicht als Zeichenkettenname einer Klasse oder eines anderen Arguments innerhalb von Declarative bei Verwendung von
relationship()akzeptiert wurde.
examples¶
[examples] [bug] ¶
Fehler behoben, der verhinderte, dass das History-Meta-Rezept mit verknüpften Vererbungsschemata, die mehr als eine Ebene tief waren, funktionierte.
engine¶
[engine] [feature] ¶
Die Funktion
engine_from_config()wurde verbessert, sodass wir Dialekt-spezifische Argumente aus String-Konfigurationswörterbüchern parsen können. Dialektklassen können nun ihre eigenen Listen von Parametertypen und String-Konvertierungsroutinen bereitstellen. Die Funktion wird jedoch noch nicht von den integrierten Dialekten verwendet.Referenzen: #2875
[engine] [bug] ¶
Ein DBAPI, der bei
connect()einen Fehler auslöst, der keine Unterklasse von dbapi.Error ist (wie z. B.TypeError,NotImplementedErrorusw.), gibt die Ausnahme unverändert weiter. Zuvor lief die spezifische Fehlerbehandlung für dieconnect()-Routine sowohl unangemessen durch dieDialect.is_disconnect()-Routine des Dialekts als auch wurde sie in einesqlalchemy.exc.DBAPIErroreingehüllt. Sie wird nun unverändert weitergegeben, ähnlich wie beim Ausführungsprozess.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2881
[engine] [bug] [pool] ¶
Die
QueuePoolwurde verbessert, um neue Verbindungsversuche nicht zu blockieren, wenn ein bestehender Verbindungsversuch blockiert. Zuvor wurde die Erzeugung neuer Verbindungen innerhalb des Blocks serialisiert, der den Überlauf überwachte; der Überlaufzähler wird nun innerhalb seines eigenen kritischen Abschnitts außerhalb des Verbindungsprozesses selbst geändert.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2880
[engine] [bug] [pool] ¶
Eine kleine Anpassung der Logik wurde vorgenommen, die auf eine verfügbare gepoolte Verbindung wartet, sodass bei einem Pool ohne Zeitlimit alle halbe Sekunde aus der Wartehaltung ausgebrochen wird, um nach dem sogenannten "Abort"-Flag zu suchen, das es dem Wartenden erlaubt, auszubrechen, falls der gesamte Verbindungspool geleert wurde. Normalerweise sollte der Wartende aufgrund eines notify_all() ausbrechen, aber es ist möglich, dass dieses notify_all() in sehr knappen Fällen verpasst wird. Dies ist eine Erweiterung der Logik, die erstmals in 0.8.0 eingeführt wurde, und das Problem wurde nur gelegentlich in Stresstests beobachtet.
Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2522
[engine] [bug] ¶
Fehler behoben, bei dem eine SQL-Anweisung falsch ASCII-kodiert wurde, wenn eine prä-DBAPI
StatementErrorinnerhalb vonConnection.execute()ausgelöst wurde, was zu Kodierungsfehlern für Nicht-ASCII-Anweisungen führte. Die Stringifizierung bleibt nun innerhalb von Python Unicode und vermeidet so Kodierungsfehler.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2871
[engine] [bug] ¶
Die Routine
create_engine()und die zugehörige Funktionmake_url()betrachten das Pluszeichen (+) nicht mehr als Leerzeichen im Passwortfeld. Die Analyse in diesem Bereich wurde angepasst, um genauer zu dem Verhalten zu passen, wie RFC 1738 diese Token behandelt, d. h. sowohlusernameals auchpassworderwarten nur:,@und/, die kodiert werden müssen.Referenzen: #2873
[engine] [bug] ¶
Das Objekt
RowProxyist nun in Python sortierbar, wie ein reguläres Tupel; dies wird erreicht, indem sichergestellt wird, dass die Tupelkonvertierung auf beiden Seiten innerhalb der__eq__()-Methode sowie durch Hinzufügen einer__lt__()-Methode erfolgt.Siehe auch
Referenzen: #2848
sql¶
[sql] [feature] ¶
Neue Verbesserungen an der
text()-Konstruktion, einschließlich flexiblerer Möglichkeiten zur Einrichtung von gebundenen Parametern und Rückgabetypen; insbesondere kann einetext()-Konstruktion nun in ein vollständiges FROM-Objekt umgewandelt werden, das als Alias oder CTE in andere Anweisungen eingebettet werden kann, mit der neuen MethodeTextClause.columns(). Dietext()-Konstruktion kann auch "inline" gebundene Parameter rendern, wenn die Konstruktion in einem "literal bound" Kontext kompiliert wird.Siehe auch
[sql] [feature] ¶
Eine neue API zur Spezifikation der
FOR UPDATE-Klausel einerSELECT-Anweisung wird mit der neuen MethodeGenerativeSelect.with_for_update()hinzugefügt. Diese Methode unterstützt ein einfacheres System zum Setzen von dialektspezifischen Optionen im Vergleich zumfor_update-Schlüsselwortargument vonselect()und unterstützt auch die SQL-StandardklauselFOR UPDATE OF. Das ORM enthält ebenfalls eine neue entsprechende MethodeQuery.with_for_update(). Pull-Request von Mario Lassnig.[sql] [feature] ¶
Die Genauigkeit, die beim Umwandeln eines zurückgegebenen Fließkommawerts in ein Python
Decimalüber eine Zeichenkette verwendet wird, ist nun konfigurierbar. Das Flagdecimal_return_scalewird nun von allenNumeric- undFloat-Typen unterstützt, was sicherstellt, dass so viele Ziffern wie angegeben aus dem nativen Fließkommawert übernommen werden, wenn dieser in eine Zeichenkette umgewandelt wird. Wenn nicht vorhanden, verwendet der Typ den Wert von.scale, falls der Typ diese Einstellung unterstützt und sie nicht None ist. Andernfalls wird die ursprüngliche Standardlänge von 10 verwendet.Siehe auch
Genauigkeit der Fließkomma-String-Konvertierung für native Fließkommatypen konfigurierbar
Referenzen: #2867
[sql] [bug] ¶
Behobenes Problem, bei dem eine Primärschlüsselspalte mit einer Sequenz, aber die Spalte nicht die Spalte "auto increment" war (entweder wegen einer Fremdschlüsselbeschränkung oder weil
autoincrement=Falsegesetzt war), versuchte, die Sequenz beim INSERT auf Backends auszulösen, die keine Sequenzen unterstützen, wenn ein INSERT ohne Primärschlüsselwert vorgelegt wurde. Dies trat auf Backends ohne Sequenzen wie SQLite und MySQL auf.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2896
[sql] [bug] ¶
Behobener Fehler bei der Methode
Insert.from_select(), bei der die Reihenfolge der gegebenen Namen bei der Generierung der INSERT-Anweisung nicht berücksichtigt wurde, was zu einer Nichtübereinstimmung mit den Spaltennamen in der gegebenen SELECT-Anweisung führte. Es wurde auch angemerkt, dassInsert.from_select()impliziert, dass auf Python-Seite keine INSERT-Standardwerte verwendet werden können, da die Anweisung keine VALUES-Klausel hat.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2895
[sql] [bug] ¶
Die Funktion
cast()wendet nun bei Übergabe eines einfachen literalen Werts den gegebenen Typ auf den gegebenen literalen Wert auf der Seite des Bindeparameters an, entsprechend dem Typ, der an cast übergeben wurde, auf die gleiche Weise wie die Funktiontype_coerce(). Im Gegensatz zutype_coerce()tritt dies jedoch nur in Kraft, wenn ein Wert, der kein Klauselobjekt ist, ancast()übergeben wird; ein bereits typisiertes Konstrukt behält seinen Typ.[sql] [bug] ¶
Die Klasse
ForeignKeyprüft das gegebene Spaltenargument aggressiver. Wenn es sich nicht um eine Zeichenkette handelt, wird geprüft, ob das Objekt zumindest eineColumnClauseist oder ein Objekt, das sich zu einer solchen auflöst, und ob das Attribut.table, falls vorhanden, auf eineTableClauseoder eine Unterklasse verweist und nicht auf etwas wie einAlias. Andernfalls wird einArgumentErrorausgelöst.Referenzen: #2883
[sql] [bug] ¶
Die Präzedenzregeln für den Operator
ColumnOperators.collate()wurden geändert, sodass der COLLATE-Operator nun eine geringere Präzedenz als die Vergleichsoperatoren hat. Dies hat zur Folge, dass ein COLLATE, das auf einen Vergleich angewendet wird, keine Klammern um den Vergleich setzt, was von Backends wie MSSQL nicht geparst wird. Die Änderung ist rückwärts inkompatibel für Setups, die das Problem umgingen, indem sieOperators.collate()auf ein einzelnes Element des Vergleichsausdrucks anwendeten, anstatt auf den gesamten Vergleichsausdruck.Referenzen: #2879
[sql] [enhancement] ¶
Die Ausnahme, die ausgelöst wird, wenn ein
BindParameterin einer kompilierten Anweisung ohne Wert vorhanden ist, enthält nun den Schlüsselnamen des gebundenen Parameters in der Fehlermeldung.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
schema¶
postgresql¶
[postgresql] [feature] ¶
Unterstützung für PostgreSQL JSON wurde hinzugefügt, unter Verwendung des neuen
JSON-Typs. Vielen Dank an Nathan Rice für die Implementierung und das Testen.Referenzen: #2581
[postgresql] [feature] ¶
Unterstützung für PostgreSQL TSVECTOR über den
TSVECTOR-Typ hinzugefügt. Pull-Request von Noufal Ibrahim.[postgresql] [bug] ¶
Behobener Fehler, bei dem die Indexreflexion Indexpfeilerwerte bei Verwendung des pypostgresql-Adapters falsch interpretierte, da diese Werte als Listen zurückgegeben wurden, im Gegensatz zum Rückgabetyp einer Zeichenkette von psycopg2.
Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2855
[postgresql] [bug] ¶
Verwendet nun die psycopg2 UNICODEARRAY-Erweiterung zur Handhabung von Unicode-Arrays mit psycopg2 + normalem "native unicode"-Modus, auf die gleiche Weise wie die UNICODE-Erweiterung verwendet wird.
[postgresql] [bug] ¶
Behobener Fehler, bei dem Werte innerhalb eines ENUM nicht für einfache Anführungszeichen escaped wurden. Beachten Sie, dass dies für bestehende Workarounds, die einfache Anführungszeichen manuell escapen, rückwärts inkompatibel ist.
Referenzen: #2878
mysql¶
[mysql] [bug] ¶
Verbesserungen am System, nach dem SQL-Typen innerhalb von
__repr__()generiert werden, insbesondere in Bezug auf die MySQL-Integer-/Numerik-/Zeichen-Typen, die eine große Vielfalt an Schlüsselwortargumenten aufweisen. Die__repr__()ist wichtig für die Verwendung mit Alembic autogenerate, wenn Python-Code in einem Migrationsskript gerendert wird.Referenzen: #2893
mssql¶
[mssql] [bug] [firebird] ¶
Das Flag "asdecimal", das mit dem
Float-Typ verwendet wird, funktioniert nun auch mit Firebird sowie mit den mssql+pyodbc-Dialekten; zuvor erfolgte keine Dezimalkonvertierung.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[mssql] [bug] [pymssql] ¶
Die Meldung "Net-Lib error during Connection reset by peer" wurde der Liste der Meldungen hinzugefügt, die im pymssql-Dialekt auf "disconnect" geprüft werden. Mit freundlicher Genehmigung von John Anderson.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[mssql] [bug] ¶
Behobener Fehler, der in 0.8.0 eingeführt wurde, bei dem die
DROP INDEX-Anweisung für einen Index in MSSQL falsch gerendert wurde, wenn der Index in einem alternativen Schema lag; der schemaname/tabellenname wurde vertauscht. Das Format wurde auch überarbeitet, um mit der aktuellen MSSQL-Dokumentation übereinzustimmen. Mit freundlicher Genehmigung von Derek Harland.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
oracle¶
[oracle] [bug] ¶
Der Fehlercode ORA-02396 "maximum idle time" wurde der Liste der "is disconnect"-Codes bei cx_oracle hinzugefügt.
Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2864
[oracle] [bug] ¶
Behobener Fehler, bei dem Oracle
VARCHAR-Typen ohne Länge (z. B. für eineCASToder ähnlich) fälschlicherweiseNone CHARoder ähnlich renderten.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2870
misc¶
[bug] [firebird] ¶
Der Firebird-Dialekt wird Bezeichner quotieren, die mit einem Unterstrich beginnen. Mit freundlicher Genehmigung von Treeve Jelbert.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2897
[bug] [firebird] ¶
Behobener Fehler bei der Firebird-Indexreflexion, bei dem die Spalten innerhalb des Index nicht korrekt sortiert waren; sie werden nun nach RDB$FIELD_POSITION sortiert.
Diese Änderung wird auch **zurückportiert** auf: 0.8.5
[bug] [declarative] ¶
Die Fehlermeldung, wenn ein Zeichenkettenargument, das an
relationship()übergeben und nicht in eine Klasse oder ein Mapper aufgelöst werden kann, wurde korrigiert, um wie bei einem Nicht-Zeichenkettenargument zu funktionieren, das den Namen der Beziehung mit dem Konfigurationsfehler angibt.Diese Änderung wird auch **zurückportiert** auf: 0.8.5
Referenzen: #2888
[bug] [ext] ¶
Behobener Fehler, der die
serializer-Erweiterung daran hinderte, korrekt mit Tabellen- oder Spaltennamen zu arbeiten, die Nicht-ASCII-Zeichen enthalten.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #2869
[bug] [firebird] ¶
Die Abfragen, die von Firebird verwendet wurden, um Tabellen- und View-Namen aufzulisten, wurden geändert, um von der
rdb$relations-Ansicht anstelle derrdb$relation_fieldsundrdb$view_relations-Ansichten abzufragen. Varianten sowohl der alten als auch der neuen Abfragen werden in vielen FAQs und Blogs erwähnt, jedoch stammen die neuen Abfragen direkt aus dem "Firebird FAQ", das als die maßgeblichste Informationsquelle zu gelten scheint.Referenzen: #2898
[removed] ¶
Die Dialekte "informix" und "informixdb" wurden entfernt; der Code ist nun als separates Repository auf Bitbucket verfügbar. Das IBM-DB-Projekt bietet seit der ersten Hinzufügung des informixdb-Dialekts produktionsreife Informix-Unterstützung.
0.9.0b1¶
Veröffentlicht: 26. Oktober 2013general¶
[general] [feature] [py3k] ¶
Die C-Erweiterungen wurden nach Python 3 portiert und können in jeder unterstützten CPython 2- oder 3-Umgebung kompiliert werden.
Referenzen: #2161
[general] [feature] [py3k] ¶
Der Code ist nun "in-place" für Python 2 und 3, die Notwendigkeit, 2to3 auszuführen, wurde entfernt. Die Kompatibilität ist nun ab Python 2.6 aufwärts gegeben.
Referenzen: #2671
[general] ¶
Eine große Refaktorisierung von Paketen hat die Importstruktur vieler Core-Module sowie einiger Aspekte der ORM-Module reorganisiert. Insbesondere wurde
sqlalchemy.sqlin mehrere Module aufgeteilt, als zuvor, sodass die sehr große Größe vonsqlalchemy.sql.expressionnun reduziert ist. Die Bemühungen konzentrierten sich auf eine erhebliche Reduzierung von Importzyklen. Darüber hinaus wurde das System der API-Funktionen insqlalchemy.sql.expressionundsqlalchemy.ormneu organisiert, um Redundanzen in der Dokumentation zwischen den Funktionen und den von ihnen erzeugten Objekten zu vermeiden.
orm¶
[orm] [feature] ¶
Neue Option zu
relationship()distinct_target_keyhinzugefügt. Dies ermöglicht der Subquery-Eager-Loader-Strategie, ein DISTINCT auf die innerste SELECT-Subquery anzuwenden, um Fälle zu unterstützen, in denen doppelte Zeilen von der innersten Abfrage generiert werden, die dieser Beziehung entspricht (es gibt noch keine allgemeine Lösung für das Problem von doppelten Zeilen in Subquery-Eager-Loading, jedoch, wenn Joins außerhalb der innersten Subquery Duplikate erzeugen). Wenn das Flag aufTruegesetzt ist, wird DISTINCT bedingungslos gerendert, und wenn es aufNonegesetzt ist, wird DISTINCT gerendert, wenn die innerste Beziehung auf Spalten zielt, die keine vollständigen Primärschlüssel bilden. Die Option ist standardmäßig False in 0.8 (d. h. standardmäßig deaktiviert), None in 0.9 (d. h. standardmäßig automatisch). Dank Alexander Koval für seine Hilfe.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2836
[orm] [feature] ¶
Der Assoziations-Proxy gibt nun
Nonezurück, wenn ein Skalarattribut von einer Skalarbeziehung abgefragt wird, wo die Skalarbeziehung selbst aufNoneverweist, anstatt eineAttributeErrorauszulösen.Referenzen: #2810
[orm] [feature] ¶
Neue Methode
AttributeState.load_history()hinzugefügt, die wieAttributeState.historyfunktioniert, aber auch Loader-Aufrufe auslöst.Siehe auch
attributes.get_history() fragt standardmäßig die DB ab, wenn der Wert nicht vorhanden ist
Referenzen: #2787
[orm] [feature] ¶
Neue Ladeoption
load_only()hinzugefügt. Dies ermöglicht die Angabe einer Reihe von Spaltennamen, die "nur" diese Attribute laden, und verzögert den Rest.Referenzen: #1418
[orm] [feature] ¶
Das System der Ladeoptionen wurde vollständig neu strukturiert, um auf einer viel umfassenderen Basis aufzubauen, dem
Load-Objekt. Diese Basis ermöglicht es jeder gängigen Ladeoption wiejoinedload(),defer()usw. in einem "verketteten" Stil für die Angabe von Optionen entlang eines Pfades zu verwenden, wie z. B.joinedload("foo").subqueryload("bar"). Das neue System ersetzt die Verwendung von punktgetrennten Pfadnamen, mehreren Attributen innerhalb von Optionen und der Verwendung von_all()-Optionen.Referenzen: #1418
[orm] [feature] ¶
Die
composite()-Konstruktion behält nun das Rückgabeobjekt bei, wenn sie in einer spaltenorientiertenQueryverwendet wird, anstatt sich in einzelne Spalten aufzulösen. Dies nutzt intern die neueBundle-Funktion. Dieses Verhalten ist rückwärts inkompatibel; um aus einer Verbundspalte auszuwählen, die sich auflöst, verwenden SieMyClass.some_composite.clauses.Referenzen: #2824
[orm] [feature] ¶
Eine neue Konstruktion
Bundlewird hinzugefügt, die die Angabe von Gruppen von Spaltenausdrücken für eineQuery-Konstruktion ermöglicht. Die Gruppe von Spalten wird standardmäßig als einzelnes Tupel zurückgegeben. Das Verhalten vonBundlekann jedoch überschrieben werden, um jede Art von Ergebnisverarbeitung für die zurückgegebene Zeile bereitzustellen. Das Verhalten vonBundleist nun auch in zusammengesetzten Attributen eingebettet, wenn diese in einer spaltenorientiertenQueryverwendet werden.Siehe auch
Referenzen: #2824
[orm] [feature] ¶
Der Parameter
version_id_generatorvonMapperkann nun so angegeben werden, dass er auf serverseitig generierte Versionskennungen angewiesen ist, mittels Triggern oder anderen datenbankseitigen Versionierungsfunktionen, oder über einen optionalen programmatischen Wert, indemversion_id_generator=Falsegesetzt wird. Bei Verwendung einer serverseitig generierten Versionskennung verwendet das ORM RETURNING, falls verfügbar, um den neuen Versionswert sofort zu laden, andernfalls gibt es ein zweites SELECT aus.Referenzen: #2793
[orm] [feature] ¶
Das Flag
eager_defaultsvonMappererlaubt nun, dass die neu generierten Standardwerte über eine Inline-RETURNING-Klausel abgerufen werden, anstatt über eine zweite SELECT-Anweisung, für Backends, die RETURNING unterstützen.Referenzen: #2793
[orm] [feature] ¶
Neues Attribut
Session.infozuSessionhinzugefügt; dies ist ein Wörterbuch, in dem Anwendungen beliebige Daten lokal zu einerSessionspeichern können. Der Inhalt vonSession.infokann auch über das ArgumentinfovonSessionodersessionmakerinitialisiert werden.[orm] [feature] ¶
Die Entfernung von Event-Listenern ist nun implementiert. Die Funktion wird über die Funktion
remove()bereitgestellt.Siehe auch
Referenzen: #2268
[orm] [feature] ¶
Der Mechanismus, über den Attribut-Events eine
AttributeImplals "initiator"-Token weitergeben, wurde geändert; das Objekt ist nun ein ereignisspezifisches Objekt namensEvent. Darüber hinaus stoppt das Attributsystem keine Events mehr basierend auf einem übereinstimmenden "initiator"-Token; diese Logik wurde in ereignisspezifische ORM-Backref-Handler verschoben, die die typische Quelle für die Wiederpropagation eines Attribut-Events auf nachfolgende Append/Set/Remove-Operationen sind. Endbenutzercode, der das Verhalten von Backrefs emuliert, muss nun sicherstellen, dass rekursive Event-Propagationsschemata gestoppt werden, falls das Schema keine Backref-Handler verwendet. Mit diesem neuen System können Backref-Handler nun eine "Zwei-Hop"-Operation durchführen, wenn ein Objekt einer Sammlung hinzugefügt wird, mit einem neuen Many-to-One-Objekt verknüpft wird, vom vorherigen Many-to-One-Objekt getrennt wird und dann aus einer vorherigen Sammlung entfernt wird. Vor dieser Änderung würde der letzte Schritt der Entfernung aus der vorherigen Sammlung nicht erfolgen.Referenzen: #2789
[orm] [feature] ¶
Eine wesentliche Änderung daran, wie das ORM Joins konstruiert, bei denen die rechte Seite selbst ein Join oder ein Left Outer Join ist. Das ORM ist nun so konfiguriert, dass es einfache Verschachtelungen von Joins der Form
a JOIN (b JOIN c ON b.id=c.id) ON a.id=b.iderlaubt, anstatt die rechte Seite in eineSELECT-Subquery zu zwingen. Dies sollte zu erheblichen Leistungsverbesserungen auf den meisten Backends führen, insbesondere auf MySQL. Das eine Datenbankbackend, das diese Änderung seit vielen Jahren zurückhält, SQLite, wird nun adressiert, indem die Erstellung derSELECT-Subquery vom ORM zum SQL-Compiler verlagert wird; so dass ein rechts verschachtelter Join auf SQLite immer noch mit einerSELECTgerendert wird, während alle anderen Backends von diesem Workaround nicht mehr betroffen sind.Als Teil dieser Änderung wurde ein neues Argument
flat=Truezu den Funktionenaliased(),Join.alias()undwith_polymorphic()hinzugefügt, welche es ermöglicht, einen "Alias" eines JOINs zu erzeugen, der jedem Tabellenbestandteil innerhalb des Joins einen anonymen Alias zuweist, anstatt eine Unterabfrage zu erzeugen.Referenzen: #2587
[orm] [bug] ¶
Behob einen Fehler, bei dem die Listensinstrumentierung einen Slices von
[0:0]nicht korrekt darstellen konnte, was insbesondere bei der Verwendung voninsert(0, item)mit dem Association Proxy auftreten konnte. Aufgrund einer Eigenart in Python-Collections war das Problem bei Python 3 viel wahrscheinlicher als bei Python 2.Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2807
[orm] [bug] ¶
Behobener Fehler, bei dem die Verwendung einer Annotation wie
remote()oderforeign()auf einerColumnvor der Verknüpfung mit einer übergeordnetenTablezu Problemen im Zusammenhang mit der Nicht-Darstellung der übergeordneten Tabelle in Joins führen konnte, aufgrund der inhärenten Kopieroperation, die von einer Annotation durchgeführt wird.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2813
[orm] [bug] ¶
Behobener Fehler, bei dem
Query.exists()ohne WHERE-Kriterium nicht korrekt funktionierte. Mit freundlicher Genehmigung von Vladimir Magamedov.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2818
[orm] [bug] ¶
Ein potenzielles Problem in einer von der ORM verwendeten geordneten Sequenzimplementierung zur Iteration von Mapper-Hierarchien wurde behoben; unter dem Jython-Interpreter war diese Implementierung nicht geordnet, obwohl cPython und PyPy die Ordnung beibehielten.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2794
[orm] [bug] ¶
Behobener Fehler bei der ORM-seitigen Ereignisregistrierung, bei dem die Flags "raw" oder "propagate" in einigen "unmapped base class"-Konfigurationen möglicherweise falsch konfiguriert waren.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2786
[orm] [bug] ¶
Eine Leistungsverbesserung im Zusammenhang mit der Verwendung der Option
defer()beim Laden gemappter Entitäten. Der Funktionsaufwand für die Anwendung eines pro-Objekt-verzögerten Callbacks auf eine Instanz beim Laden war erheblich höher als der reine Daten-Laden aus der Zeile (beachten Sie, dassdefer()dazu gedacht ist, DB/Netzwerk-Overhead zu reduzieren, nicht unbedingt die Anzahl der Funktionsaufrufe); der Funktionsaufruf-Overhead ist nun in allen Fällen geringer als der Daten-Laden aus der Spalte. Es gibt auch eine Reduzierung der Anzahl der "lazy callable"-Objekte, die pro Ladung erstellt werden, von N (Gesamtzahl der verzögerten Werte im Ergebnis) auf 1 (Gesamtzahl der verzögerten Spalten).Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2778
[orm] [bug] ¶
Behobener Fehler, bei dem Attribut-Historienfunktionen fehlschlugen, wenn ein Objekt mithilfe der Funktion
make_transient()von "persistent" nach "pending" verschoben wurde, für Operationen, die sammlungsbasierte Backrefs beinhalteten.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2773
[orm] [bug] ¶
Eine Warnung wird ausgegeben, wenn versucht wird, ein Objekt einer geerbten Klasse zu flushen, bei dem der polymorphe Diskriminator auf einen für die Klasse ungültigen Wert gesetzt wurde.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2750
[orm] [bug] ¶
Behobener Fehler bei der polymorphen SQL-Generierung, wo mehrere verknüpfte Vererbungseinheiten, die ebenfalls mit derselben Basisklasse verknüpft waren, nicht unabhängig voneinander Spalten auf der Basistabelle verfolgten, wenn die Join-Kette länger als zwei Entitäten war.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2759
[orm] [bug] ¶
Behobener Fehler, bei dem das Übergeben eines zusammengesetzten Attributs an
Query.order_by()einen geklammerten Ausdruck erzeugte, der von einigen Datenbanken nicht akzeptiert wurde.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2754
[orm] [bug] ¶
Die Interaktion zwischen zusammengesetzten Attributen und der Funktion
aliased()wurde behoben. Zuvor funktionierten zusammengesetzte Attribute bei Vergleichsoperationen nicht korrekt, wenn ein Alias angewendet wurde.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2755
[orm] [bug] [ext] ¶
Behobener Fehler, bei dem
MutableDictkeine Änderungsbenachrichtigung meldete, wennclear()aufgerufen wurde.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2730
[orm] [bug] ¶
get_history()wird nun, wenn es mit einem skalarwert-column-gemappten Attribut verwendet wird, die ihm übergebene "passive"-Flagge respektieren; da diese standardmäßig aufPASSIVE_OFFgesetzt ist, fragt die Funktion standardmäßig die Datenbank ab, wenn der Wert nicht vorhanden ist. Dies ist eine Verhaltensänderung im Vergleich zu 0.8.Siehe auch
attributes.get_history() fragt standardmäßig die DB ab, wenn der Wert nicht vorhanden ist
Referenzen: #2787
[orm] [bug] [associationproxy] ¶
Zusätzliche Kriterien wurden zu den ==, != Comparatoren hinzugefügt, die mit Skalarwerten verwendet werden, um Vergleiche mit None auch dann zu berücksichtigen, wenn der Assoziationsdatensatz selbst nicht vorhanden ist, zusätzlich zur bestehenden Prüfung auf den Skalar-Endpunkt im Assoziationsdatensatz, der NULL ist. Zuvor würde der Vergleich von
Cls.scalar == NoneDatensätze zurückgeben, bei denenCls.associatedvorhanden undCls.associated.scalarNone ist, aber keine Zeilen, bei denenCls.associatednicht vorhanden ist. Bedeutender ist, dass die umgekehrte OperationCls.scalar != None*würde*ClsZeilen zurückgeben, bei denenCls.associatednicht vorhanden war.Der Fall für
Cls.scalar != 'somevalue'wird ebenfalls geändert, um mehr wie ein direkter SQL-Vergleich zu agieren; es werden nur Zeilen zurückgegeben, bei denenCls.associatedvorhanden ist undAssociated.scalarnicht NULL und nicht gleich'somevalue'ist. Zuvor war dies ein einfachesNOT EXISTS.Es wurde auch ein spezieller Anwendungsfall hinzugefügt, bei dem
Cls.scalar.has()ohne Argumente aufgerufen werden kann, wennCls.scalarein spaltenbasierter Wert ist – dies gibt zurück, obCls.associatedZeilen vorhanden hat, unabhängig davon, obCls.associated.scalarNULL ist oder nicht.Referenzen: #2751
[orm] [bug] ¶
Ein obskurer Fehler wurde behoben, bei dem falsche Ergebnisse abgerufen wurden, wenn über eine Many-to-Many-Beziehung zu einer Single-Table-Inheritance-Unterklasse mit einem spezifischen Diskriminatorwert verknüpft/geladen wurde, aufgrund von "sekundären" Zeilen, die zurückkamen. Die "sekundären" und rechten Tabellen werden nun für alle ORM-Joins von Many-to-Many-Beziehungen in Klammern zusammengeführt, sodass der Link von links nach rechts korrekt gefiltert werden kann. Diese Änderung wurde durch die endgültige Behebung des Problems mit rechts verschachtelten Joins, das in #2587 beschrieben ist, ermöglicht.
Referenzen: #2369
[orm] [bug] ¶
Das "Auto-Aliasing"-Verhalten der Methode
Query.select_from()wurde abgeschaltet. Das spezifische Verhalten ist nun über eine neue MethodeQuery.select_entity_from()verfügbar. Das Auto-Aliasing-Verhalten war nie gut dokumentiert und ist im Allgemeinen nicht erwünscht, daQuery.select_from()stärker auf die Steuerung der JOIN-Darstellung ausgerichtet ist.Query.select_entity_from()wird auch in 0.8 verfügbar sein, damit Anwendungen, die auf das Auto-Aliasing angewiesen sind, ihre Anwendungen darauf umstellen können.Referenzen: #2736
orm deklarativ¶
[orm] [declarative] [feature] ¶
Ein praktischer Klassen-Decorator
as_declarative()wurde hinzugefügt, der ein Wrapper fürdeclarative_base()ist und es ermöglicht, eine vorhandene Basisklasse mithilfe eines schicken Klassen-Decorated-Ansatzes anzuwenden.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[orm] [declarative] [feature] ¶
ORM-Deskriptoren wie Hybrid-Properties können nun nach Namen in einem Zeichenkettenargument, das mit
order_by,primaryjoinoder ähnlichem inrelationship()verwendet wird, referenziert werden, zusätzlich zu spaltengebundenen Attributen.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2761
examples¶
[examples] [feature] ¶
Die Beispiele in
examples/generic_associationswurden verbessert, einschließlich der Tatsache, dassdiscriminator_on_association.pySingle-Table-Inheritance verwendet, um die Arbeit mit dem "Diskriminator" zu erledigen. Ein echtes "Generic Foreign Key"-Beispiel wurde ebenfalls hinzugefügt, das ähnlich wie bei anderen beliebten Frameworks funktioniert, indem es eine offenendige Ganzzahl verwendet, um auf eine beliebige andere Tabelle zu verweisen, und die traditionelle referentielle Integrität aufgibt. Obwohl wir dieses Muster nicht empfehlen, wollen Informationen frei sein.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[examples] [bug] ¶
„autoincrement=False“ zur History-Tabelle im Versionierungsbeispiel hinzugefügt, da diese Tabelle sowieso kein Autoincrement haben sollte. Mit freundlicher Genehmigung von Patrick Schmid.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[examples] [bug] ¶
Ein Problem mit dem "Versioning"-Rezept wurde behoben, bei dem eine Many-to-One-Referenz eine bedeutungslose Version für das Ziel erzeugen konnte, obwohl sie nicht geändert wurde, wenn Backrefs vorhanden waren. Patch mit freundlicher Genehmigung von Matt Chisholm.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
engine¶
[engine] [feature] ¶
Das
repr()für dieURLeinerEnginewird nun das Passwort mit Sternchen verbergen. Mit freundlicher Genehmigung von Gunnlaugur Þór Briem.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2821
[engine] [feature] ¶
Neue Ereignisse wurden zu
ConnectionEventshinzugefügtReferenzen: #2770
[engine] [bug] ¶
Der von der Funktion
make_url()verwendete reguläre Ausdruck analysiert nun IPv6-Adressen, z. B. in Klammern eingeschlossene.Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2851
[engine] [bug] [oracle] ¶
Dialect.initialize() wird nicht ein zweites Mal aufgerufen, wenn eine
Engineaufgrund eines Disconnect-Fehlers neu erstellt wird. Dies behebt ein spezifisches Problem im Oracle 8-Dialekt, aber im Allgemeinen sollte die Phase dialect.initialize() nur einmal pro Dialekt erfolgen.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2776
[engine] [bug] [pool] ¶
Behobener Fehler, bei dem
QueuePooldie korrekte Anzahl der ausgecheckten Verbindungen verlor, wenn eine vorhandene gepoolte Verbindung nach einem Invalidierungs- oder Recycling-Ereignis nicht wieder verbunden werden konnte.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2772
[engine] [bug] ¶
Behobener Fehler, bei dem das Argument
reset_on_returnfür verschiedenePool-Implementierungen nicht propagiert wurde, wenn der Pool neu generiert wurde. Mit freundlicher Genehmigung von Eevee.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
[engine] [bug] ¶
Die Methodensignatur von
Dialect.reflecttable(), die in allen bekannten Fällen vonDefaultDialectbereitgestellt wird, wurde gestrafft, uminclude_columnsundexclude_columnsArgumente ohne kw-Option zu erwarten, was die Mehrdeutigkeit reduziert – zuvor fehlteexclude_columns.Referenzen: #2748
sql¶
[sql] [feature] ¶
Unterstützung für die Reflexion von "Unique Constraints" wurde hinzugefügt, über die Methode
Inspector.get_unique_constraints(). Vielen Dank an Roman Podolyaka für den Patch.Eine Regression behoben, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "Spalten werden ersetzt" für eine Anweisung mit zwei gleichnamigen Spalten erzeugte, da die interne SELECT-Anweisung use_labels nicht gesetzt hätte. Dieses Update wird auch auf **zurückportiert** nach: 0.8.4
Referenzen: #1443
[sql] [feature] ¶
Die Konstrukte
update(),insert()unddelete()interpretieren nun ORM-Entitäten als Zieltabellen, auf denen operiert werden soll, z.B.from sqlalchemy import insert, update, delete ins = insert(SomeMappedClass).values(x=5) del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5) upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[sql] [feature] [mysql] [postgresql] ¶
Die PostgreSQL- und MySQL-Dialekte unterstützen nun die Reflexion/Inspektion von Fremdschlüsseloptionen, einschließlich ON UPDATE, ON DELETE. PostgreSQL reflektiert auch MATCH, DEFERRABLE und INITIALLY. Mit freundlicher Genehmigung von ijl.
Referenzen: #2183
[sql] [feature] ¶
Ein
bindparam()-Konstrukt mit einem "null"-Typ (d.h. kein Typ angegeben) wird nun kopiert, wenn es in einem typisierten Ausdruck verwendet wird, und die neue Kopie erhält den tatsächlichen Typ der verglichenen Spalte. Zuvor wurde diese Logik am gegebenenbindparam()an Ort und Stelle durchgeführt. Zusätzlich tritt ein ähnlicher Prozess nun fürbindparam()-Konstrukte auf, die anValuesBase.values()für einInsert- oderUpdate-Konstrukt übergeben werden, innerhalb der Kompilierungsphase des Konstrukts.Dies sind beides subtile Verhaltensänderungen, die sich auf einige Verwendungen auswirken können.
Siehe auch
Ein bindparam()-Konstrukt ohne Typ wird durch Kopie hochgestuft, wenn ein Typ verfügbar ist
Referenzen: #2850
[sql] [feature] ¶
Eine Überarbeitung der Ausdrucksbehandlung für spezielle Symbole, insbesondere bei Konjunktionen, z. B.
Nonenull()true()false(), einschließlich Konsistenz bei der Darstellung von NULL in Konjunktionen, "Short-Circuiting" vonand_()undor_()-Ausdrücken, die boolesche Konstanten enthalten, sowie die Darstellung von booleschen Konstanten und Ausdrücken im Vergleich zu "1" oder "0" für Backends, die keinetrue/falseKonstanten besitzen.[sql] [feature] ¶
Das Typsystem übernimmt nun die Aufgabe der Darstellung von "Literal Bind"-Werten, d. h. Werten, die normalerweise gebundene Parameter sind, aber aufgrund des Kontexts als Zeichenketten gerendert werden müssen, typischerweise innerhalb von DDL-Konstrukten wie CHECK-Constraints und Indizes (beachten Sie, dass "Literal Bind"-Werte ab #2742 von DDL verwendet werden). Eine neue Methode
TypeEngine.literal_processor()dient als Basis, undTypeDecorator.process_literal_param()wird hinzugefügt, um das Umwickeln einer nativen Literal-Rendering-Methode zu ermöglichen.Referenzen: #2838
[sql] [feature] ¶
Die Methode
Table.tometadata()erzeugt nun Kopien allerSchemaItem.info-Dictionaries von allenSchemaItem-Objekten innerhalb der Struktur, einschließlich Spalten, Constraints, Fremdschlüsseln usw. Da diese Dictionaries Kopien sind, sind sie unabhängig vom ursprünglichen Dictionary. Zuvor wurde nur das `.info`-Dictionary vonColumnbei dieser Operation übertragen, und es wurde nur an Ort und Stelle verlinkt, nicht kopiert.Referenzen: #2716
[sql] [feature] ¶
Das Argument
defaultvonColumnakzeptiert nun eine Klassen- oder Objektmethode als Argument, zusätzlich zu einer eigenständigen Funktion; es wird ordnungsgemäß erkannt, ob das "context"-Argument akzeptiert wird oder nicht.[sql] [feature] ¶
Die neue Methode
Insert.from_select()wurde dem Konstruktinsert()hinzugefügt. Gegeben eine Liste von Spalten und ein wählbares Element, wirdINSERT INTO (table) (columns) SELECT ..gerendert. Obwohl diese Funktion als Teil von 0.9 hervorgehoben wird, wurde sie auch nach 0.8.3 zurückportiert.Siehe auch
Referenzen: #722
[sql] [feature] ¶
Ein neues Attribut für
TypeDecoratornamensTypeDecorator.coerce_to_is_typeswurde bereitgestellt, um die Steuerung zu vereinfachen, wie Vergleiche mit==oder!=zuNoneund booleschen Typen einIS-Ausdruck oder ein einfacher Gleichheitsausdruck mit einem gebundenen Parameter erzeugt.[sql] [feature] ¶
Ein
label()Konstrukt wird nun als sein Name allein in einerORDER BYKlausel gerendert, wenn dieses Label auch in der Spaltenklausel des SELECTs referenziert wird, anstatt den vollständigen Ausdruck neu zu schreiben. Dies gibt der Datenbank eine bessere Chance, die Auswertung desselben Ausdrucks in zwei verschiedenen Kontexten zu optimieren.Referenzen: #1068
[sql] [bug] ¶
Behob eine Regression, die seit 0.7.9 bestand, bei der der Name einer CTE möglicherweise nicht korrekt gequotet wurde, wenn sie in mehreren FROM-Klauseln referenziert wurde.
Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2801
[sql] [bug] [cte] ¶
Behob einen Fehler im Common Table Expression (CTE)-System, bei dem, wenn die CTE nur als
alias()-Konstrukt verwendet wurde, diese nicht mit dem Schlüsselwort WITH gerendert wurde.Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2783
[sql] [bug] ¶
Behob einen Fehler in der DDL von
CheckConstraint, bei dem das "Quote"-Flag von einemColumn-Objekt nicht weitergegeben wurde.Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2784
[sql] [bug] ¶
Fehler behoben, bei dem
type_coerce()ORM-Elemente mit einer__clause_element__()Methode nicht richtig interpretieren konnte.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2849
[sql] [bug] ¶
Die Typen
EnumundBooleanumgehen nun jeden benutzerdefinierten (z.B. TypeDecorator) Typ, der verwendet wird, wenn die CHECK-Beschränkung für den „nicht nativen“ Typ erzeugt wird. Dies geschieht, damit der benutzerdefinierte Typ nicht am Ausdruck innerhalb der CHECK beteiligt ist, da dieser Ausdruck sich gegen den „impl“-Wert und nicht gegen den „dekorierten“ Wert richtet.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2842
[sql] [bug] ¶
Das Flag `.unique` bei
Indexkonnte alsNoneausgegeben werden, wenn es von einerColumngeneriert wurde, die kein `unique` spezifiziert hatte (wo es standardmäßig `None` ist). Das Flag wird nun immer `True` oder `False` sein.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2825
[sql] [bug] ¶
Fehler im Standardcompiler sowie in denen von PostgreSQL, MySQL und MSSQL behoben, um sicherzustellen, dass alle literalen SQL-Ausdruckswerte direkt als Literale und nicht als gebundene Parameter in einer CREATE INDEX-Anweisung gerendert werden. Dies ändert auch das Rendering-Schema für andere DDLs wie Constraints.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2742
[sql] [bug] ¶
Ein
select(), das in seiner FROM-Klausel auf sich selbst verweist, typischerweise durch In-Place-Mutation, löst nun eine informative Fehlermeldung aus, anstatt einen Rekursionsüberlauf zu verursachen.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2815
[sql] [bug] ¶
Fehler behoben, bei dem die Verwendung des `column_reflect`-Events zum Ändern des `.key` der eingehenden
Columndazu führte, dass Primärschlüssel-Constraints, Indizes und Fremdschlüssel-Constraints nicht korrekt reflektiert wurden.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2811
[sql] [bug] ¶
Der Operator
ColumnOperators.notin_(), der in 0.8 hinzugefügt wurde, erzeugt nun ordnungsgemäß die Negation des Ausdrucks, den „IN“ zurückgibt, wenn er auf eine leere Sammlung angewendet wird.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[sql] [bug] [postgresql] ¶
Fehler behoben, bei dem das Ausdruckssystem auf der `str()`-Form einiger Ausdrücke beruhte, wenn es sich auf die `.c`-Sammlung eines `select()`-Konstrukts bezog, aber die `str()`-Form nicht verfügbar war, da das Element auf dialektspezifische Kompilierungskonstrukte angewiesen war, insbesondere den `__getitem__()`-Operator, wie er mit einem PostgreSQL `ARRAY`-Element verwendet wird. Die Korrektur fügt auch eine neue Ausnahmeklasse
UnsupportedCompilationErrorhinzu, die in Fällen ausgelöst wird, in denen ein Compiler aufgefordert wird, etwas zu kompilieren, das er nicht kennt.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2780
[sql] [bug] ¶
Mehrere Korrekturen am Korrelationsverhalten von
Select-Konstrukten, die erstmals in 0.8.0 eingeführt wurden.Um den Anwendungsfall zu erfüllen, bei dem FROM-Einträge nach außen zu einem SELECT korreliert werden sollen, das ein anderes umschließt, das wiederum dieses umschließt, funktioniert die Korrelation nun über mehrere Ebenen, wenn eine explizite Korrelation über
Select.correlate()hergestellt wird, vorausgesetzt, der Ziel-SELECT befindet sich irgendwo entlang der Kette, die von einer WHERE/ORDER BY/columns-Klausel umschlossen ist, nicht nur verschachtelte FROM-Klauseln. Dies lässtSelect.correlate()wieder kompatibler mit 0.7 agieren, während die neue „smarte“ Korrelation beibehalten wird.Wenn keine explizite Korrelation verwendet wird, beschränkt die übliche „implizite“ Korrelation ihr Verhalten auf den unmittelbar umschließenden SELECT, um die Kompatibilität mit 0.7-Anwendungen zu maximieren, und verhindert in diesem Fall auch die Korrelation über verschachtelte FROMs, wodurch die Kompatibilität mit 0.8.0/0.8.1 erhalten bleibt.
Die Methode
Select.correlate_except()verhinderte nicht in allen Fällen die Korrelation der angegebenen FROM-Klauseln und führte auch dazu, dass FROM-Klauseln fälschlicherweise ganz weggelassen wurden (ähnlich dem Verhalten von 0.7). Dies wurde behoben.Das Aufrufen von `select.correlate_except(None)` führt zur Korrelation aller FROM-Klauseln, wie erwartet.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
[sql] [bug] ¶
Fehler behoben, bei dem das Verknüpfen eines SELECT einer Tabelle „A“ mit mehreren Fremdschlüsselpfaden zu einer Tabelle „B“ mit dieser Tabelle „B“ fehlschlug, den Fehler „mehrdeutige Join-Bedingung“ zu erzeugen, der gemeldet worden wäre, wenn man Tabelle „A“ direkt mit „B“ verknüpft hätte; stattdessen wurde eine Join-Bedingung mit mehreren Kriterien erzeugt.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2738
[sql] [bug] [reflection] ¶
Fehler behoben, bei dem die Verwendung von
MetaData.reflect()über ein Remote-Schema sowie ein lokales Schema hinweg falsche Ergebnisse liefern konnte, wenn beide Schemata eine Tabelle mit demselben Namen hatten.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2728
[sql] [bug] ¶
Der „nicht implementierte“ `__iter__()`-Aufruf aus der Basisklasse
ColumnOperatorswurde entfernt. Obwohl dieser in 0.8.0 eingeführt wurde, um eine endlose, speicherfressende Schleife zu verhindern, wenn man auch eine `__getitem__()`-Methode auf einem benutzerdefinierten Operator implementiert und dann fehlerhaft `list()` auf diesem Objekt aufruft, hatte er zur Folge, dass Spaltenelemente berichteten, sie seien tatsächlich iterierbare Typen, was dann einen Fehler beim Iterieren auslöste. Es gibt keinen wirklichen Weg, beide Seiten hier zu haben, daher halten wir uns an die Python-Best Practices. Seien Sie vorsichtig bei der Implementierung von `__getitem__()` auf Ihren benutzerdefinierten Operatoren!Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2726
[sql] [bug] ¶
Das Attribut „name“ wird auf
Indexgesetzt, bevor die „attach“-Events aufgerufen werden, sodass Anhangs-Events verwendet werden können, um dynamisch einen Namen für den Index basierend auf der übergeordneten Tabelle und/oder den Spalten zu generieren.Referenzen: #2835
[sql] [bug] ¶
Das fehlerhafte Keyword-Argument „schema“ wurde aus dem
ForeignKey-Objekt entfernt. Dies war ein versehentlicher Commit, der nichts bewirkte; in 0.8.3 wird eine Warnung ausgegeben, wenn dieses Keyword-Argument verwendet wird.Referenzen: #2831
[sql] [bug] ¶
Eine Überarbeitung der Handhabung von „quoted“ Bezeichnern, bei der anstatt auf verschiedene `quote=True`-Flags, die herumgereicht werden, diese Flags in reichhaltige String-Objekte mit Quoting-Informationen umgewandelt werden, sobald sie an gängige Schema-Konstrukte wie
Table,Columnusw. übergeben werden. Dies löst das Problem, dass verschiedene Methoden das „quote“-Flag nicht korrekt honorieren, wie z.B.Engine.has_table()und verwandte Methoden. Dasquoted_name-Objekt ist eine String-Unterklasse, die auch explizit verwendet werden kann, wenn nötig; das Objekt speichert die übergebenen Quoting-Präferenzen und umgeht auch die „Namensnormalisierung“, die von Dialekten wie Oracle, Firebird und DB2, die auf Großbuchstaben-Symbole standardisieren, durchgeführt wird. Das Ergebnis ist, dass die „Großbuchstaben“-Backends nun mit erzwungenen Anführungszeichen, wie Kleinbuchstaben-Anführungszeichen und neuen reservierten Wörtern, arbeiten können.Referenzen: #2812
[sql] [bug] ¶
Die Auflösung von
ForeignKey-Objekten zu ihrer Ziel-Columnwurde überarbeitet, um so unmittelbar wie möglich zu sein, basierend auf dem Zeitpunkt, an dem die Ziel-Columnmit derselbenMetaDatawie dieserForeignKeyverbunden wird, anstatt zu warten, bis ein Join konstruiert wird, oder ähnliches. Dies, zusammen mit anderen Verbesserungen, ermöglicht eine frühere Erkennung einiger Fehler bei der Fremdschlüsselkonfiguration. Ebenfalls enthalten ist eine Überarbeitung des Typpropagationssystems, so dass es nun zuverlässig ist, den Typ auf `None` bei jederColumnzu setzen, die überForeignKeyauf eine andere verweist - der Typ wird von der Zielspalte kopiert, sobald diese andere Spalte zugeordnet ist, und funktioniert nun auch für zusammengesetzte Fremdschlüssel.Referenzen: #1765
postgresql¶
[postgresql] [feature] ¶
Die Unterstützung für PostgreSQL 9.2 Range-Typen wurde hinzugefügt. Derzeit wird keine Typübersetzung bereitgestellt, sodass sie im Moment direkt mit Strings oder psycopg2 2.5 Range-Erweiterungstypen arbeiten. Patch von Chris Withers.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
[postgresql] [feature] ¶
Unterstützung für „AUTOCOMMIT“-Isolation bei Verwendung des psycopg2 DBAPI wurde hinzugefügt. Das Schlüsselwort ist über die `isolation_level`-Ausführungsoption verfügbar. Patch von Roman Podolyaka.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2072
[postgresql] [feature] ¶
Unterstützung für das Rendern von `SMALLSERIAL` wurde hinzugefügt, wenn ein `SmallInteger`-Typ auf einer Primärschlüssel-Autoincrement-Spalte verwendet wird, basierend auf der Serverversionserkennung von PostgreSQL Version 9.2 oder höher.
Referenzen: #2840
[postgresql] [bug] ¶
Eine 128-Zeichen-Abschneidung bei der Reflexion des Server-Standardwerts einer Spalte wurde entfernt; dieser Code stammte ursprünglich aus PG-Systemansichten, die den String zur Lesbarkeit abgeschnitten haben.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2844
[postgresql] [bug] ¶
Klammern werden um einen zusammengesetzten SQL-Ausdruck gelegt, wie er in der Spaltenliste einer CREATE INDEX-Anweisung gerendert wird.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2742
[postgresql] [bug] ¶
Fehler behoben, bei dem PostgreSQL-Versionsstrings mit einem Präfix vor den Wörtern „PostgreSQL“ oder „EnterpriseDB“ nicht geparst wurden. Mit freundlicher Genehmigung von Scott Schaefer.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2819
[postgresql] [bug] ¶
Das Verhalten von `extract()` wurde im PostgreSQL-Dialekt vereinfacht, um keinen hartcodierten `::timestamp` oder ähnlichen Cast in den gegebenen Ausdruck einzufügen, da dies mit Typen wie zeitzonenbewussten Datetimes interferierte, aber auch mit modernen Versionen von psycopg2 nicht notwendig erscheint.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2740
[postgresql] [bug] ¶
Fehler im HSTORE-Typ behoben, bei dem Schlüssel/Werte mit Backslash-Anführungszeichen bei Verwendung der „nicht nativen“ (d.h. non-psycopg2) Mittel zur Übersetzung von HSTORE-Daten nicht korrekt escaped wurden. Patch von Ryan Kelly.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2766
[postgresql] [bug] ¶
Fehler behoben, bei dem die Reihenfolge der Spalten in einem mehrspaltigen PostgreSQL-Index in der falschen Reihenfolge reflektiert wurde. Mit freundlicher Genehmigung von Roman Podolyaka.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2767
mysql¶
[mysql] [feature] ¶
Der Parameter `mysql_length` für
Indexkann nun als Dictionary von Spaltennamen/Längen übergeben werden, für zusammengesetzte Indizes. Großer Dank an Roman Podolyaka für den Patch.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2704
[mysql] [feature] ¶
Der MySQL
SETTyp verfügt nun über das gleiche Auto-Quoting-Verhalten wieENUM. Anführungszeichen sind bei der Einrichtung des Werts nicht erforderlich, aber vorhandene Anführungszeichen werden zusammen mit einer Warnung automatisch erkannt. Dies hilft auch bei Alembic, wo der SET-Typ nicht mit Anführungszeichen gerendert wird.Referenzen: #2817
[mysql] [bug] ¶
Aktualisierungen der reservierten Wörter von MySQL für die Versionen 5.5 und 5.6, mit freundlicher Genehmigung von Hanno Schlichting.
Diese Änderung wurde auch auf: 0.8.3, 0.7.11 zurückportiert
Referenzen: #2791
[mysql] [bug] ¶
Die Änderung in #2721, dass das `deferrable`-Schlüsselwort von
ForeignKeyConstraintim MySQL-Backend stillschweigend ignoriert wird, wird ab 0.9 rückgängig gemacht; dieses Schlüsselwort wird nun wieder gerendert und löst unter MySQL Fehler aus, da es nicht verstanden wird - dasselbe Verhalten gilt auch für das `initially`-Schlüsselwort. In 0.8 bleiben die Schlüsselwörter ignoriert, aber es wird eine Warnung ausgegeben. Zusätzlich löst das `match`-Schlüsselwort unter 0.9 eineCompileErroraus und gibt unter 0.8 eine Warnung aus; dieses Schlüsselwort wird von MySQL nicht nur stillschweigend ignoriert, sondern bricht auch die ON UPDATE/ON DELETE Optionen.Um eine
ForeignKeyConstraintzu verwenden, die unter MySQL nicht gerendert wird oder anders gerendert wird, verwenden Sie eine benutzerdefinierte Kompilierungsoption. Ein Beispiel für diese Verwendung wurde der Dokumentation hinzugefügt, siehe MySQL / MariaDB Foreign Keys.Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[mysql] [bug] ¶
Der MySQL-Connector-Dialekt erlaubt nun Optionen in der `create_engine`-Query-String, um die Standardeinstellungen im Connect zu überschreiben, einschließlich „buffered“ und „raise_on_warnings“.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2515
[mysql] [bug] ¶
Fehler behoben bei der Verwendung von Multi-Table-UPDATE, bei dem eine zusätzliche Tabelle ein SELECT mit eigenen gebundenen Parametern war, wobei die Positionierung der gebundenen Parameter umgekehrt zu der Anweisung selbst war, wenn die spezielle Syntax von MySQL verwendet wurde.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2768
[mysql] [bug] ¶
Eine weitere Bedingung wurde zum `mysql+gaerdbms`-Dialekt hinzugefügt, um den sogenannten „development“-Modus zu erkennen, bei dem die `rdbms_mysqldb`-DBAPI verwendet werden sollte. Patch von Brett Slatkin.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2715
[mysql] [bug] ¶
Das `deferrable`-Keyword-Argument bei
ForeignKeyundForeignKeyConstraintrendert das `DEFERRABLE`-Schlüsselwort nicht für den MySQL-Dialekt. Lange Zeit ließen wir dies bestehen, da ein nicht-deferrbarer Fremdschlüssel sich sehr von einem deferrbaren unterscheiden würde, aber einige Umgebungen deaktivieren FKs unter MySQL, daher werden wir hier weniger meinungsstark sein.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2721
[mysql] [bug] ¶
Parsing von MySQL-Fremdschlüsseloptionen während der Reflexion wurde korrigiert und getestet; dies ergänzt die Arbeit in #2183, wo wir beginnen, die Reflexion von Fremdschlüsseloptionen wie ON UPDATE/ON DELETE Cascade zu unterstützen.
Referenzen: #2839
[mysql] [bug] ¶
Die Unterstützung für den cymysql-Treiber wurde verbessert und Version 0.6.5 wird nun unterstützt. Mit freundlicher Genehmigung von Hajime Nakagami.
sqlite¶
[sqlite] [bug] ¶
Die neu hinzugefügten SQLite DATETIME-Argumente `storage_format` und `regexp` waren offenbar nicht vollständig korrekt implementiert; obwohl die Argumente akzeptiert wurden, hatten sie in der Praxis keine Auswirkung; dies wurde behoben.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2781
[sqlite] [bug] ¶
`sqlalchemy.types.BIGINT` wurde der Liste der Typnamen hinzugefügt, die vom SQLite-Dialekt reflektiert werden können; mit freundlicher Genehmigung von Russell Stuart.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2764
mssql¶
[mssql] [bug] ¶
Bei der Abfrage des Information Schemas unter SQL Server 2000 wurde ein CAST-Aufruf entfernt, der in 0.8.1 hinzugefügt wurde, um bei Treiberproblemen zu helfen, der anscheinend auf 2000 nicht kompatibel ist. Der CAST bleibt für SQL Server 2005 und höher bestehen.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2747
[mssql] [bug] [pyodbc] ¶
Korrekturen für MSSQL mit Python 3 + pyodbc, einschließlich der korrekten Übergabe von Anweisungen.
Referenzen: #2355
oracle¶
[oracle] [feature] [py3k] ¶
Die Oracle-Unit-Tests mit cx_oracle laufen nun vollständig unter Python 3.
[oracle] [bug] ¶
Fehler behoben, bei dem die Oracle-Tabellenreflexion mit Synonymen fehlschlug, wenn das Synonym und die Tabelle sich in verschiedenen Remote-Schemas befanden. Patch zur Behebung freundlicherweise von Kyle Derr.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
Referenzen: #2853
misc¶
[feature] ¶
Ein neues Flag `system=True` wurde zu `Column` hinzugefügt, das die Spalte als „Systemspalte“ markiert, die automatisch von der Datenbank bereitgestellt wird (wie PostgreSQL `oid` oder `xmin`). Die Spalte wird in der `CREATE TABLE`-Anweisung weggelassen, ist aber ansonsten zum Abfragen verfügbar. Darüber hinaus kann das `CreateColumn`-Konstrukt auf eine benutzerdefinierte Kompilierungsregel angewendet werden, die das Überspringen von Spalten ermöglicht, indem eine Regel erzeugt wird, die `None` zurückgibt.
Diese Änderung wurde auch auf **zurückportiert**: 0.8.3
[feature] [firebird] ¶
Das Flag `retaining=True` wurde zu den Dialekten kinterbasdb und fdb hinzugefügt. Dies steuert den Wert des Flags `retaining`, das an die Methoden `commit()` und `rollback()` der DBAPI-Verbindung übergeben wird. Aufgrund historischer Bedenken ist dieses Flag in 0.8.2 standardmäßig auf `True` gesetzt, jedoch in 0.9.0b1 auf `False`.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2763
[feature] [core] ¶
Eine neue Variante zu `UpdateBase.returning()` namens `ValuesBase.return_defaults()` wurde hinzugefügt; dies ermöglicht es, beliebige Spalten zur RETURNING-Klausel der Anweisung hinzuzufügen, ohne die übliche „implizite Rückgabe“ des Compilers zu beeinträchtigen, die verwendet wird, um neu generierte Primärschlüsselwerte effizient abzurufen. Für unterstützte Backends ist ein Dictionary aller abgerufenen Werte unter `ResultProxy.returned_defaults` verfügbar.
Referenzen: #2793
[feature] [pool] ¶
Pool-Logging für „rollback-on-return“ und das weniger gebräuchliche „commit-on-return“ wurde hinzugefügt. Dies wird zusammen mit dem restlichen Pool-„debug“-Logging aktiviert.
Referenzen: #2752
[feature] [firebird] ¶
Der `fdb`-Dialekt ist nun der Standarddialekt, wenn er ohne Dialektqualifizierer angegeben wird, d.h. `firebird://`, da das Firebird-Projekt `fdb` als offiziellen Python-Treiber veröffentlicht hat.
Referenzen: #2504
[bug] [firebird] ¶
Die Typenermittlung bei der Reflexion der Firebird-Typen LONG und INT64 wurde korrigiert, so dass LONG als INTEGER und INT64 als BIGINT behandelt wird, es sei denn, der Typ hat eine „Präzision“, in diesem Fall wird er als NUMERIC behandelt. Patch von Russell Stuart.
Diese Änderung wurde auch auf: 0.8.2 zurückportiert
Referenzen: #2757
[bug] [ext] ¶
Behebt einen Fehler, bei dem die mutable Erweiterung fehlschlug, wenn ein zusammengesetzter Typ mit einer Funktion anstelle einer Klasse eingerichtet wurde, da sie versuchte zu prüfen, ob diese Spalte ein
MutableCompositeist (was sie nicht ist). Mit freundlicher Genehmigung von asldevi.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
[requirements] ¶
Die Python mock Bibliothek wird nun benötigt, um die Unit-Test-Suite auszuführen. Obwohl sie ab Python 3.3 Teil der Standardbibliothek ist, müssen frühere Python-Installationen diese installieren, um Unit-Tests auszuführen oder das Paket
sqlalchemy.testingfür externe Dialekte zu verwenden.Diese Änderung wurde auch auf: 0.8.2 zurückportiert
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