0.9 Changelog

0.9.10

Veröffentlicht: 22. Juli 2015

orm

  • [orm] [feature]

    Ein neuer Eintrag "entity" wurde zu den von Query.column_descriptions zurü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]

    Query unterstützt keine Joins, Subselects oder spezielle FROM-Klauseln bei Verwendung der Methoden Query.update() oder Query.delete(); anstatt diese Felder stillschweigend zu ignorieren, wenn Methoden wie Query.join() oder Query.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 Parameter Pool.reset_on_return akzeptierten Werten hinzugefügt, als Synonym für None, damit Zeichenkettenwerte für alle Einstellungen verwendet werden können, was Hilfsprogrammen wie engine_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 entpickelte MetaData-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 und native_enum=False verwendet wurde, die Rückergebnisse nicht korrekt dekodieren konnte. Dies rührte daher, dass der PG ENUM-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 BIT unter Py3K die Funktion ord() nicht korrekt verwendete. Pull-Request von David Marin.

    Referenzen: #3333

sqlite

  • [sqlite] [bug]

    behoben, dass die Reflexion von UNIQUE-Constraints im SQLite-Dialekt, die Nicht-Alphabetische Zeichen in den Namen enthielten, wie Punkte oder Leerzeichen, nicht mit ihrem Namen reflektiert wurde.

    Referenzen: #3495

tests

  • [tests] [bug] [pypy]

    behoben, dass ein Import „pypy setup.py test“ korrekt funktionsfähig machte.

    Referenzen: #3406

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 Namespace sqlalchemy.ext.declarative entfernt wurde.

    Referenzen: #3324

0.9.9

Veröffentlicht: 10. März 2015

orm

  • [orm] [feature]

    Neuer Parameter Session.connection.execution_options wurde hinzugefügt, der verwendet werden kann, um Ausführungsoptionen für eine Connection einzurichten, 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 wie Session.close(), ruft jedoch auch Connection.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 != None fehlschlug, 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 eine Session fälschlicherweise Zustände zu dieser Session innerhalb 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 Query auftrat, 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 Query zum 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() und Query.outerjoin() zu einer Single-Inheritance-Unterklasse mit of_type() die „Single-Table-Kriterien“ in der ON-Klausel nicht rendert, wenn das Flag from_joinpoint=True gesetzt 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() in Connection und Pool oder eine Invalidation aufgrund eines Datenbanktrenners fehlschlug, wenn der Parameter isolation_level mit Connection.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_level mit Connection.execution_options() verwendet wird, wenn eine Transaction im 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_enum wurde zur Ausgabe von __repr__() von Enum hinzugefü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 ein TypeDecorator war, 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 ForeignKey mit seinem Elternteil fehlschlug, wenn der Fremdschlüssel „link_to_name=True“ in Verbindung mit einem Ziel-Table verwendete, 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 reflektierten Column-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.

    Referenzen: #1765, #3298

postgresql

  • [postgresql] [feature]

    Unterstützung für das Schlüsselwort CONCURRENTLY für PostgreSQL-Indizes wurde hinzugefügt, eingerichtet mit postgresql_concurrently. Pull-Request von Iuri de Silvio.

  • [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_uuid wird 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.JSONB bei 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-Erweiterung extras.register_default_jsonb verwendet, um einen JSON-Deserializer einzurichten, der über das Argument json_deserializer an 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_deserializer auf psycopg2-Versionen vor 2.5, die kein natives JSON enthalten, repariert wurde.

  • [postgresql] [bug]

    behoben, dass der PostgreSQL-Dialekt einen Ausdruck in einem Index nicht rendern konnte, der nicht direkt einer tabellengebundenen Spalte entsprach; typischerweise wenn ein text()-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

    Partielle Indizes

  • [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

    pysqlcipher

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 2014

orm

  • [orm] [bug] [engine]

    behoben, dass ein Fehler auftrat, der generell dieselben Klassen von Ereignissen wie in #3199 betraf, wenn der Parameter named=True verwendet 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 AbstractConcreteBase in Verbindung mit einer Unterklasse verwendet wird, die __abstract__ deklariert.

    Referenzen: #3185

engine

  • [engine] [bug]

    Die an eine Engine übergebenen Ausführungsoptionen, entweder über create_engine.execution_options oder Engine.update_execution_options(), werden nicht an die spezielle Connection ü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 der Connection fehlschlug.

    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 fehlenden description-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_binds nicht 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 Boolean und Enum nicht mehr gepickelt werden konnten.

    Referenzen: #3067, #3144

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 .closed von 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 auf connection.closed von 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_null wurde hinzugefügt, der bei True angibt, dass der Python-Wert None als 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.exc ausgelöst, im Fall von TransactionRollbackError sqlalchemy.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. das func-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

  • [mssql] [bug]

    Die Erkennung der Versionszeichenkette im pymssql-Dialekt wurde korrigiert, um mit Microsoft SQL Azure zu funktionieren, das das Wort „SQL Server“ in „SQL Azure“ ändert.

    Referenzen: #3151

oracle

  • [oracle] [bug]

    Behobener langjähriger Fehler im Oracle-Dialekt, bei dem gebundene Parameternamen, die mit Zahlen begannen, nicht in Anführungszeichen gesetzt wurden, da Oracle keine Zahlen in gebundenen Parameternamen mag.

    Referenzen: #2138

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 MutableDict die Dictionary-Methode update() nicht implementierte und somit keine Änderungen erfasste. Pull Request von Matt Chisholm.

  • [bug] [ext]

    Behobener Fehler, bei dem eine benutzerdefinierte Unterklasse von MutableDict bei einer „coerce“-Operation nicht angezeigt wurde und stattdessen ein einfaches MutableDict zurü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 der echo_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 2014

orm

  • [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“ des Query-Objekts nicht mehr korrekt einrichtete, sodass nachfolgende Aufrufe von Query.filter_by() oder Query.join() beim Suchen nach Attributen anhand von Zeichenkettennamen die entsprechende „from“-Entität nicht überprüften.

    Referenzen: #2736, #3083

  • [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

  • [engine] [feature]

    Neues Ereignis ConnectionEvents.handle_error() hinzugefügt, ein umfassenderer und funktionsreicherer Ersatz für ConnectionEvents.dbapi_error().

    Referenzen: #3076

sql

  • [sql] [bug]

    Behobener Fehler bei Enum und anderen Unterklassen von SchemaType, bei denen die direkte Zuordnung des Typs zu einem MetaData zu einem Hängenbleiben führte, wenn Ereignisse (wie Erstellungsereignisse) auf dem MetaData ausgelö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 eines TypeDecorator in 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_name enthielt, alle Boolean und Enum Typen 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 wie Column verwendet wird.

    Referenzen: #3122

postgresql

  • [postgresql] [feature]

    Das Schlüsselwortargument postgresql_regconfig wurde dem Operator ColumnOperators.match() hinzugefügt. Es ermöglicht die Angabe des Arguments „reg config“ für die Funktion to_tsquery(). Pull Request von Jonathan Vanasco.

    Referenzen: #3078

  • [postgresql] [feature]

    Unterstützung für PostgreSQL JSONB über JSONB hinzugefü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_encoding repariert, 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

  • [oracle] [bug] [tests]

    Behobener Fehler in der Oracle-Dialekt-Testsuite, bei dem in einem Test angenommen wurde, dass ‚username‘ in der Datenbank-URL vorhanden ist, obwohl dies möglicherweise nicht der Fall war.

    Referenzen: #3128

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

  • [bug] [declarative]

    Behobener Fehler, bei dem das deklarative Flag __abstract__ nicht unterschieden wurde, wenn es tatsächlich der Wert False war. Das Flag __abstract__ muss auf der getesteten Ebene tatsächlich einen True-Wert ergeben.

    Referenzen: #3097

0.9.6

Veröffentlicht: 23. Juni 2014

orm

  • [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 2014

orm

  • [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 AliasedClass fehlschlug.

    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, den Query verwendet, 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 Index wurde etwas liberalisiert, da Sie einen text()-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 über Table.append_constraint().

    Referenzen: #3028

  • [sql] [feature]

    Neues Flag between.symmetric hinzugefü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() und Table.delete() eine leere WHERE-Klausel erzeugten, wenn eine leere and_() oder or_() oder ein anderer leerer Ausdruck angewendet wurde. Dies ist nun konsistent mit dem von select().

    Diese Änderung wird auch **zurückportiert** nach: 0.8.7

    Referenzen: #3045

  • [sql] [bug]

    Das Flag Column.nullable wird implizit auf False gesetzt, wenn diese Column in einer expliziten PrimaryKeyConstraint für diese Tabelle referenziert wird. Dieses Verhalten entspricht nun dem, wenn die Column selbst das Flag Column.primary_key auf True gesetzt hat, was als exakt gleichwertiger Fall gedacht ist.

    Referenzen: #3023

  • [sql] [bug]

    Fehler behoben, bei dem die Operatorüberladungsmethoden Operators.__and__(), Operators.__or__() und Operators.__invert__() innerhalb einer benutzerdefinierten Comparator-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.

    Referenzen: #1068, #3020

  • [sql] [bug]

    Der Import für Function in den Importnamespace sqlalchemy.sql.expression wurde 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_indexes zum PostgreSQL ARRAY-Typ hinzugefügt. Wenn auf True gesetzt, 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=False wurde dem PG HSTORE-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 OID zum 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_length auf 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 Ansicht sys.database_principals zu 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

  • [tests] [bug] [py3k]

    Korrektur einiger Deprecation-Warnungen im Zusammenhang mit dem Modul imp und Python 3.3 oder neuer, bei der Ausführung von Tests. Pull Request von Matt Chisholm.

    Referenzen: #2830

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 Argumente version_id_col und polymorphic_on modifiziert 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 MutableDict keine Änderungsereignisse für die Wörterbuchoperation setdefault() meldete.

    Diese Änderung wird auch **zurückportiert** nach: 0.8.7

    Referenzen: #3051, #3093

  • [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

    Referenzen: #3051, #3093

  • [bug] [testsuite]

    In der öffentlichen Testsuite wurde String(40) anstelle des weniger unterstützten Text in StringTest.test_literal_backslashes verwendet. 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 2014

general

  • [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 --db und/oder --dburi mehrmals 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_rows hinzugefü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() oder MapperEvents.after_configured() auf einen bestimmten Mapper oder eine zugeordnete Klasse angewendet werden, da die Ereignisse nur für das Mapper-Ziel auf allgemeiner Ebene aufgerufen werden.

  • [orm] [feature]

    Neues Schlüsselwortargument once=True zu listen() und listens_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.innerjoin hinzugefügt, nämlich die Angabe des Strings "nested". Wenn auf "nested" gesetzt anstatt auf True, 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 einen Query.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 als None bestimmt 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 ein import * 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 aus child würde in diesem Fall parent.deleted == False in 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_keys ordnungsgemäß 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=True für listen() 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 Engine verknüpft werden, nachdem ein oder mehrere Connection-Objekte erstellt wurden (z. B. durch eine ORM Session oder durch explizites `connect`), und der Listener wird Ereignisse von diesen Verbindungen empfangen. Zuvor schoben Leistungserwägungen die Ereignisübertragung von Engine auf Connection nur 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 Engine den 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()“ von Connection ausgelö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 Ereignis ConnectionEvents.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 Index nach der Erstellung wieder Ad-hoc-Schlüsselwortargumente innerhalb der Index.kwargs Sammlung.

    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)

    Referenzen: #2866, #2962

  • [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 übergeordneten MetaData entfernt wurde, obwohl sie sich in einem ungültigen Zustand befand. Pullrequest von Roman Podoliaka.

    Referenzen: #2988

  • [SQL] [Fehler]

    Die Funktion MetaData.naming_convention wird jetzt auch auf CheckConstraint-Objekte angewendet, die direkt mit einer Column verbunden sind, und nicht nur auf der Table.

  • [SQL] [Fehler]

    Fehler in der neuen Funktion MetaData.naming_convention behoben, 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 BindParameter empfangen wird, z. B. über literal() 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.c verhä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 resultierenden TextAsFrom-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=True fü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 DATE hinzugefügt, der eine Unterklasse von DateTime ist. Da Oracle keinen „datetime“-Typ an sich hat, sondern nur DATE, ist es hier angebracht, dass der DATE-Typ, wie er im Oracle-Dialekt vorhanden ist, eine Instanz von DateTime ist. 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-DATETIME aus dem Oracle-Dialekt entfernt, da dieser Typ in diesem Kontext nicht funktionsfähig ist.

    Referenzen: #2987

Tests

  • [Tests] [Fehler]

    Einige fehlerhafte `u''`-Strings behoben, die Tests in Py3.2 verhindert hätten. Patch von Arfrever Frehtes Taifersar Arahesis.

    Referenzen: #2980

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 SingletonThreadPool behoben, 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 2014

ORM

  • [ORM] [Funktion]

    Ein neues Ereignis MapperEvents.before_configured() hinzugefügt, das ein Ereignis am Anfang von configure_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 die InvalidRequestError, 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.attribute nicht 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 AbstractConcreteBase nicht 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 sowohl AbstractConcreteBase als auch ConcreteBase selbst ein, *bevor* Mapper im Rahmen des configure_mappers()-Setups konfiguriert werden, unter Verwendung des neuen MapperEvents.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 Table ein explizites Table.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

    Referenzen: #2880, #2964

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 den ARRAY-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 ARRAY hinzugefü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 DATETIME mit Unterstützung für Bruchteile von Sekunden hinzugefügt; auch die Unterstützung für Bruchteile von Sekunden wurde zu TIMESTAMP hinzugefü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 BY und PARTITIONS, angegeben als mysql_partition_by='value' und mysql_partitions='value', für Table hinzugefü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 Typ INTEGER ohne die "5" instanziiert, basierend auf der Erkennung eines TypeError beim 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, BLOB oder REAL im Typnamen den Typ generisch mit einer von fünf Affinitäten. Pull Request von Erich Blume.

    Siehe auch

    Type Reflection

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 von DeferredReflection gelten.

0.9.2

Veröffentlicht: 2. Februar 2014

orm

  • [orm] [feature]

    Ein neuer Parameter Operators.op.is_comparison wurde hinzugefügt. Dieses Flag ermöglicht, dass ein benutzerdefinierter Operator von Operators.op() als "Vergleichs"-Operator betrachtet wird, und somit für benutzerdefinierte relationship.primaryjoin-Bedingungen verwendet werden kann.

  • [orm] [feature]

    Die Unterstützung für die Angabe einer join()-Konstruktion als Ziel von relationship.secondary zur Erstellung sehr komplexer relationship()-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.

  • [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, die TextAsFrom generiert, wodurch es nicht als Ziel in Query.from_statement() verwendet werden konnte. Ebenfalls behoben wurden die Mechaniken von Query.from_statement(), um eine TextAsFrom nicht mit einer Select-Konstruktion zu verwechseln. Dieser Fehler ist auch eine Regression von 0.9, da die Methode TextClause.columns() aufgerufen wird, um das Argument text.typemap zu 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 Query und in anderen Situationen, in denen SELECTs oder Joins aliasiert wurden (wie z. B. joined table inheritance), fehlschlug, wenn eine benutzerdefinierte Column-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 mit aliased() in Verbindung mit dem Flag flat=True und 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_kwargs wurde hinzugefügt, um Dialekt-spezifische Reflexionsoptionen für alle reflektierten Table-Objekte zu unterstützen.

  • [sql] [feature]

    Ein neues Feature wurde hinzugefügt, das die Anwendung von automatisierten Namenskonventionen für Constraint- und Index-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 Argument MetaData.naming_convention bereit. Dieses System ermöglicht die Erstellung von einfachen und benutzerdefinierten Namensschemata für Constraints und Indizes pro MetaData.

    Referenzen: #2923

  • [sql] [feature]

    Optionen können nun unabhängig von der Angabe von Spalten in der Tabelle mit dem Flag primary_key=True auf einem PrimaryKeyConstraint-Objekt angegeben werden; verwenden Sie ein PrimaryKeyConstraint-Objekt ohne Spalten, um dieses Ergebnis zu erzielen.

    Zuvor hatte eine explizite PrimaryKeyConstraint zur Folge, dass diese Spalten als primary_key=True markiert wurden, was ignoriert wurde. Da dies nicht mehr der Fall ist, stellt die PrimaryKeyConstraint nun 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 der PrimaryKeyConstraint und innerhalb der Table als primary_key=True markiert sind, wird eine Warnung ausgegeben und die Liste der Spalten wird nur aus der PrimaryKeyConstraint allein übernommen, wie es in früheren Versionen der Fall war.

    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 Table und Index, die eine Vielzahl von Dialekt-spezifischen Argumenten wie mysql_engine und postgresql_where akzeptieren, sowie die Konstrukte PrimaryKeyConstraint, UniqueConstraint, Update, Insert und Delete, und auch neu hinzugefügte Kwarg-Fähigkeit für ForeignKeyConstraint und ForeignKey. 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 eines ForeignKey nicht 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" an Table.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 jede ForeignKeyConstraint zu 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.functions verwendet wurden, wie z. B. func.coalesce() und func.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 RowProxy zu einem TypeError fü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 auf RowProxy implementiert, 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.

    Referenzen: #2848, #2924

  • [sql] [bug]

    Eine UniqueConstraint, die inline mit einer Table erstellt 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 auf Table.update() als auch auf Query.update() im ORM aus.

    Referenzen: #2912

schema

  • [schema] [bug]

    Der sqlalchemy.schema.SchemaVisitor wurde wieder in das Modul .schema integriert. Pullreq von Sean Dague.

postgresql

  • [postgresql] [feature]

    Ein neues Dialekt-Argument postgresql_ignore_search_path wurde hinzugefügt. Dieses Argument wird sowohl vom Konstruktor Table als auch von der Methode MetaData.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 im search_path vorhanden ist; das Standardverhalten seit 0.7.3 war, dass im search_path vorhandene Schemata nicht in reflektierte ForeignKey-Objekte kopiert wurden. Die Dokumentation wurde aktualisiert, um das Verhalten der Funktion pg_get_constraintdef() und wie das Feature postgresql_ignore_search_path bestimmt, 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 sqlacodegen benötigt. Die spezifischen Fälle, die innerhalb dieser Testsuite repariert werden mussten, waren die von ENUM, die in ein Enum heruntergestuft wurden, und die von SQLite-Datumstypen, die in generische Datumstypen umgewandelt wurden. Die Methode adapt() musste hier spezifischer werden, um die Entfernung einer "Catch-all"-**kwargs-Sammlung aus der Basisklasse TypeEngine, 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]

    Connection ordnet jetzt einer neuen RootTransaction oder TwoPhaseTransaction ein "Reset-Handler" für den Zeitraum dieser Transaktion zu seinem unmittelbaren _ConnectionFairy zu, das die Aufgabe übernimmt, commit() oder rollback() für das "Reset bei Rückgabe"-Verhalten von Pool aufzurufen, 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 ORM Session mit gesetztem twophase auftreten, und dann Session.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 ein Session-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_clustered wurde den Konstrukten UniqueConstraint und PrimaryKeyConstraint hinzugefügt; unter SQL Server fügt dies das Schlüsselwort CLUSTERED zum 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 unicode Primitivs 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 in dbapi_connection und connection_record umbenannt, 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 den sessionmaker-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 DeferredReflection zur Definition von für die Reflexion ausstehenden Klassen, falls einige dieser Klassen verworfen wurden, bevor die Methode DeferredReflection.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 InstrumentedAttribute auf 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 als synonym() eingerichtet.

Referenzen: #2900

Automap-Erweiterung

  • sql

    [sql] [feature]

    and_(x == y for x, y in tuples)

    Konjunktionen wie and_() und or_() können nun Python-Generatoren als einzelnes Argument akzeptieren, z. B.:

Die Logik hier sucht nach einem einzelnen Argument *args, bei dem das erste Element eine Instanz von types.GeneratorType ist.

  • schema

    [schema] [feature]

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 StatementError oder eine DBAPI-bezogene Unterklasse kann nun zusätzliche Informationen über den "Grund" der Ausnahme aufnehmen; die Session fügt nun einige Details hinzu, wenn die Ausnahme während eines Autoflush auftritt. Dieser Ansatz wird gewählt, anstatt FlushError mit einem Python 3-Stil "verkettete Ausnahme"-Ansatz zu kombinieren, um die Kompatibilität sowohl mit Py2K-Code als auch mit Code, der bereits IntegrityError oder ähnliches abfängt, aufrechtzuerhalten.

    [orm] [feature] [backrefs]

    Siehe auch

    Neues Argument include_backrefs=True wurde zur Funktion validates() 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 von InstrumentedAttribute zu QueryableAttribute (einer Oberklasse) zu einer Interaktion mit Pythons Operatorsystem, sodass ein Ausdruck wie aliased(MyClass.x) > MyClass.x umgekehrt wurde, um myclass.x < myclass_1.x zu lesen. Das angepasste Attribut verweist auch auf die neue AliasedClass als seine Eltern, was zuvor nicht immer der Fall war.

    Referenzen: #2872

  • [orm] [bug]

    Das Flag viewonly in relationship() verhindert nun, dass Attributverläufe im Namen des Zielattributs geschrieben werden. Dies hat zur Folge, dass das Objekt nicht in die Session.dirty-Liste geschrieben wird, wenn es mutiert wird. Zuvor war das Objekt in Session.dirty enthalten, 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ür scoped_session hinzugefügt.

  • [orm] [bug]

    Fehler behoben, bei dem die Verwendung des neuen Bundle-Objekts dazu führte, dass das Attribut Query.column_descriptions fehlschlug.

  • [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 Column unter verschiedenen Eigenschaften mehrmals abgebildet wird (was typischerweise ein synonym() sein sollte) oder ob zwei oder mehr Column-Objekte denselben Namen erhalten, und gibt eine Warnung aus, wenn diese Bedingung erkannt wird.

    Referenzen: #2828

  • [orm] [declarative] [bug]

    Die Klasse DeferredReflection wurde verbessert, um automatische Reflexionsunterstützung für die "sekundäre" Tabelle bereitzustellen, auf die von einer relationship() verwiesen wird. "Sekundär", wenn entweder als Zeichenketten-Tabellenname oder als Table-Objekt mit nur einem Namen und MetaData-Objekt angegeben, wird ebenfalls in den Reflexionsprozess einbezogen, wenn DeferredReflection.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, NotImplementedError usw.), gibt die Ausnahme unverändert weiter. Zuvor lief die spezifische Fehlerbehandlung für die connect()-Routine sowohl unangemessen durch die Dialect.is_disconnect()-Routine des Dialekts als auch wurde sie in eine sqlalchemy.exc.DBAPIError eingehü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 QueuePool wurde 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 StatementError innerhalb von Connection.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 Funktion make_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. sowohl username als auch password erwarten nur :, @ und /, die kodiert werden müssen.

    Referenzen: #2873

  • [engine] [bug]

    Das Objekt RowProxy ist 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.

    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 eine text()-Konstruktion nun in ein vollständiges FROM-Objekt umgewandelt werden, das als Alias oder CTE in andere Anweisungen eingebettet werden kann, mit der neuen Methode TextClause.columns(). Die text()-Konstruktion kann auch "inline" gebundene Parameter rendern, wenn die Konstruktion in einem "literal bound" Kontext kompiliert wird.

    Referenzen: #2877, #2882

  • [sql] [feature]

    Eine neue API zur Spezifikation der FOR UPDATE-Klausel einer SELECT-Anweisung wird mit der neuen Methode GenerativeSelect.with_for_update() hinzugefügt. Diese Methode unterstützt ein einfacheres System zum Setzen von dialektspezifischen Optionen im Vergleich zum for_update-Schlüsselwortargument von select() und unterstützt auch die SQL-Standardklausel FOR UPDATE OF. Das ORM enthält ebenfalls eine neue entsprechende Methode Query.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 Flag decimal_return_scale wird nun von allen Numeric- und Float-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.

    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=False gesetzt 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, dass Insert.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 Funktion type_coerce(). Im Gegensatz zu type_coerce() tritt dies jedoch nur in Kraft, wenn ein Wert, der kein Klauselobjekt ist, an cast() übergeben wird; ein bereits typisiertes Konstrukt behält seinen Typ.

  • [sql] [bug]

    Die Klasse ForeignKey prüft das gegebene Spaltenargument aggressiver. Wenn es sich nicht um eine Zeichenkette handelt, wird geprüft, ob das Objekt zumindest eine ColumnClause ist oder ein Objekt, das sich zu einer solchen auflöst, und ob das Attribut .table, falls vorhanden, auf eine TableClause oder eine Unterklasse verweist und nicht auf etwas wie ein Alias. Andernfalls wird ein ArgumentError ausgelö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 sie Operators.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 BindParameter in 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

  • [schema] [bug]

    Behobene Regression, verursacht durch #2812, bei der repr() für Tabellen- und Spaltennamen fehlschlug, wenn der Name Nicht-ASCII-Zeichen enthielt.

    Referenzen: #2868

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 eine CAST oder ähnlich) fälschlicherweise None CHAR oder ä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 der rdb$relation_fields und rdb$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 2013

general

  • [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.sql in mehrere Module aufgeteilt, als zuvor, sodass die sehr große Größe von sqlalchemy.sql.expression nun reduziert ist. Die Bemühungen konzentrierten sich auf eine erhebliche Reduzierung von Importzyklen. Darüber hinaus wurde das System der API-Funktionen in sqlalchemy.sql.expression und sqlalchemy.orm neu 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_key hinzugefü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 auf True gesetzt ist, wird DISTINCT bedingungslos gerendert, und wenn es auf None gesetzt 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 None zurück, wenn ein Skalarattribut von einer Skalarbeziehung abgefragt wird, wo die Skalarbeziehung selbst auf None verweist, anstatt eine AttributeError auszulösen.

    Referenzen: #2810

  • [orm] [feature]

    Neue Methode AttributeState.load_history() hinzugefügt, die wie AttributeState.history funktioniert, aber auch Loader-Aufrufe auslöst.

    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 wie joinedload(), 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 spaltenorientierten Query verwendet wird, anstatt sich in einzelne Spalten aufzulösen. Dies nutzt intern die neue Bundle-Funktion. Dieses Verhalten ist rückwärts inkompatibel; um aus einer Verbundspalte auszuwählen, die sich auflöst, verwenden Sie MyClass.some_composite.clauses.

    Referenzen: #2824

  • [orm] [feature]

    Eine neue Konstruktion Bundle wird hinzugefügt, die die Angabe von Gruppen von Spaltenausdrücken für eine Query-Konstruktion ermöglicht. Die Gruppe von Spalten wird standardmäßig als einzelnes Tupel zurückgegeben. Das Verhalten von Bundle kann jedoch überschrieben werden, um jede Art von Ergebnisverarbeitung für die zurückgegebene Zeile bereitzustellen. Das Verhalten von Bundle ist nun auch in zusammengesetzten Attributen eingebettet, wenn diese in einer spaltenorientierten Query verwendet werden.

    Referenzen: #2824

  • [orm] [feature]

    Der Parameter version_id_generator von Mapper kann nun so angegeben werden, dass er auf serverseitig generierte Versionskennungen angewiesen ist, mittels Triggern oder anderen datenbankseitigen Versionierungsfunktionen, oder über einen optionalen programmatischen Wert, indem version_id_generator=False gesetzt 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_defaults von Mapper erlaubt 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.info zu Session hinzugefügt; dies ist ein Wörterbuch, in dem Anwendungen beliebige Daten lokal zu einer Session speichern können. Der Inhalt von Session.info kann auch über das Argument info von Session oder sessionmaker initialisiert werden.

  • [orm] [feature]

    Die Entfernung von Event-Listenern ist nun implementiert. Die Funktion wird über die Funktion remove() bereitgestellt.

    Referenzen: #2268

  • [orm] [feature]

    Der Mechanismus, über den Attribut-Events eine AttributeImpl als "initiator"-Token weitergeben, wurde geändert; das Objekt ist nun ein ereignisspezifisches Objekt namens Event. 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.id erlaubt, anstatt die rechte Seite in eine SELECT-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 der SELECT-Subquery vom ORM zum SQL-Compiler verlagert wird; so dass ein rechts verschachtelter Join auf SQLite immer noch mit einer SELECT gerendert wird, während alle anderen Backends von diesem Workaround nicht mehr betroffen sind.

    Als Teil dieser Änderung wurde ein neues Argument flat=True zu den Funktionen aliased(), Join.alias() und with_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 von insert(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() oder foreign() auf einer Column vor der Verknüpfung mit einer übergeordneten Table zu 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, dass defer() 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 MutableDict keine Änderungsbenachrichtigung meldete, wenn clear() 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 auf PASSIVE_OFF gesetzt 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.

    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 == None Datensätze zurückgeben, bei denen Cls.associated vorhanden und Cls.associated.scalar None ist, aber keine Zeilen, bei denen Cls.associated nicht vorhanden ist. Bedeutender ist, dass die umgekehrte Operation Cls.scalar != None *würde* Cls Zeilen zurückgeben, bei denen Cls.associated nicht 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 denen Cls.associated vorhanden ist und Associated.scalar nicht NULL und nicht gleich 'somevalue' ist. Zuvor war dies ein einfaches NOT EXISTS.

    Es wurde auch ein spezieller Anwendungsfall hinzugefügt, bei dem Cls.scalar.has() ohne Argumente aufgerufen werden kann, wenn Cls.scalar ein spaltenbasierter Wert ist – dies gibt zurück, ob Cls.associated Zeilen vorhanden hat, unabhängig davon, ob Cls.associated.scalar NULL 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 Methode Query.select_entity_from() verfügbar. Das Auto-Aliasing-Verhalten war nie gut dokumentiert und ist im Allgemeinen nicht erwünscht, da Query.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ür declarative_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, primaryjoin oder ähnlichem in relationship() 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_associations wurden verbessert, einschließlich der Tatsache, dass discriminator_on_association.py Single-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 die URL einer Engine wird 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 ConnectionEvents hinzugefügt

    Referenzen: #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 Engine aufgrund 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 QueuePool die 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_return für verschiedene Pool-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 von DefaultDialect bereitgestellt wird, wurde gestrafft, um include_columns und exclude_columns Argumente ohne kw-Option zu erwarten, was die Mehrdeutigkeit reduziert – zuvor fehlte exclude_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() und delete() 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 gegebenen bindparam() an Ort und Stelle durchgeführt. Zusätzlich tritt ein ähnlicher Prozess nun für bindparam()-Konstrukte auf, die an ValuesBase.values() für ein Insert- oder Update-Konstrukt übergeben werden, innerhalb der Kompilierungsphase des Konstrukts.

    Dies sind beides subtile Verhaltensänderungen, die sich auf einige Verwendungen auswirken können.

    Referenzen: #2850

  • [sql] [feature]

    Eine Überarbeitung der Ausdrucksbehandlung für spezielle Symbole, insbesondere bei Konjunktionen, z. B. None null() true() false(), einschließlich Konsistenz bei der Darstellung von NULL in Konjunktionen, "Short-Circuiting" von and_() und or_()-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 keine true/false Konstanten besitzen.

    Referenzen: #2734, #2804, #2823

  • [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, und TypeDecorator.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 aller SchemaItem.info-Dictionaries von allen SchemaItem-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 von Column bei dieser Operation übertragen, und es wurde nur an Ort und Stelle verlinkt, nicht kopiert.

    Referenzen: #2716

  • [sql] [feature]

    Das Argument default von Column akzeptiert 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 Konstrukt insert() hinzugefügt. Gegeben eine Liste von Spalten und ein wählbares Element, wird INSERT 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

    INSERT aus SELECT

    Referenzen: #722

  • [sql] [feature]

    Ein neues Attribut für TypeDecorator namens TypeDecorator.coerce_to_is_types wurde bereitgestellt, um die Steuerung zu vereinfachen, wie Vergleiche mit == oder != zu None und booleschen Typen ein IS-Ausdruck oder ein einfacher Gleichheitsausdruck mit einem gebundenen Parameter erzeugt.

    Referenzen: #2734, #2744

  • [sql] [feature]

    Ein label() Konstrukt wird nun als sein Name allein in einer ORDER BY Klausel 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 einem Column-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 Enum und Boolean umgehen 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 Index konnte als None ausgegeben werden, wenn es von einer Column generiert 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 Column dazu 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 UnsupportedCompilationError hinzu, 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ässt Select.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

    Referenzen: #2668, #2746

  • [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 ColumnOperators wurde 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 Index gesetzt, 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, Column usw. ü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. Das quoted_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-Column wurde überarbeitet, um so unmittelbar wie möglich zu sein, basierend auf dem Zeitpunkt, an dem die Ziel-Column mit derselben MetaData wie dieser ForeignKey verbunden 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 jeder Column zu setzen, die über ForeignKey auf 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 Index kann 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 SET Typ verfügt nun über das gleiche Auto-Quoting-Verhalten wie ENUM. 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 ForeignKeyConstraint im 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 eine CompileError aus 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 ForeignKeyConstraint zu 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

    Referenzen: #2721, #2839

  • [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 ForeignKey und ForeignKeyConstraint rendert 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 MutableComposite ist (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.testing für externe Dialekte zu verwenden.

    Diese Änderung wurde auch auf: 0.8.2 zurückportiert