0.8 Changelog

0.8.7

Veröffentlicht: 22. Juli 2014

orm

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

    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.

    Referenzen: #3047

sql

  • [sql] [bug]

    Fehler in Enum und anderen SchemaType-Unterklassen behoben, 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.

    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.

    Referenzen: #3102

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

    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().

    Referenzen: #3045

postgresql

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

    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.

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.

    Referenzen: #3101

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

    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.

mssql

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

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

    Referenzen: #3091

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.

    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.

    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é.

    Referenzen: #3051, #3093

0.8.6

Veröffentlicht: 28. März 2014

general

  • [general] [bug]

    Die Datei setup.py wurde angepasst, um die mögliche zukünftige Entfernung der Erweiterung setuptools.Feature aus setuptools zu unterstützen. Wenn dieses Schlüsselwort nicht vorhanden ist, wird die Einrichtung weiterhin mit setuptools erfolgreich sein, anstatt auf distutils zurückzufallen. Die Erstellung von C-Erweiterungen kann nun auch durch Setzen der Umgebungsvariable DISABLE_SQLALCHEMY_CEXT deaktiviert werden. Diese Variable funktioniert, unabhängig davon, ob setuptools überhaupt verfügbar ist.

    Referenzen: #2986

orm

  • [orm] [bug]

    ORM-Fehler behoben, bei dem das Ändern des Primärschlüssels eines Objekts, das dann zum LÖSCHEN markiert wurde, fehlschlug, die richtige Zeile zum LÖSCHEN anzuvisieren.

    Referenzen: #3006

  • [orm] [bug]

    Regression von 0.8.3 als Ergebnis von #2818 behoben, bei der Query.exists() nicht auf einer Abfrage funktionierte, die nur einen Query.select_from()-Eintrag, aber keine anderen Entitäten enthielt.

    Referenzen: #2995

  • [orm] [bug]

    Verbesserte Fehlermeldung, die auftreten würde, wenn eine query() gegen eine nicht-selektierbare Entität, wie z. B. eine literal_column(), ausgeführt und dann versucht wurde, Query.join() zu verwenden, sodass die "linke" Seite als None bestimmt und dann fehlschlägt. Dieser Zustand wird nun explizit erkannt.

  • [orm] [bug]

    Veraltete Namen aus sqlalchemy.orm.interfaces.__all__ entfernt und durch aktuelle Namen aktualisiert, sodass ein import * aus diesem Modul wieder funktioniert.

    Referenzen: #2975

sql

  • [sql] [bug]

    Fehler in der tuple_()-Konstruktion behoben, bei der der "Typ" des 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 fälschlicherweise in Binärwerte umwandelte, obwohl dies nicht auf der linken Seite der Fall war. tuple_() erwartet nun heterogene Typen innerhalb seiner Werteliste.

    Referenzen: #2977

postgresql

  • [postgresql] [feature]

    Die "sane multi-row count"-Prüfung wurde für den psycopg2 DBAPI aktiviert, da dies ab psycopg2 2.0.9 unterstützt zu werden scheint.

  • [postgresql] [bug]

    Regression behoben, die durch die Veröffentlichung 0.8.5 / 0.9.3's Kompatibilitätsverbesserungen verursacht wurde, bei der die Index-Reflexion auf PostgreSQL-Versionen, die spezifisch für die Serien 8.1 und 8.2 sind, erneut fehlschlug, insbesondere bei dem immer problematischen int2vector-Typ. Obwohl int2vector seit 8.1 Array-Operationen unterstützt, unterstützt es scheinbar erst ab 8.3 eine Konvertierung zu varchar. Obwohl int2vector Array-Operationen ab 8.1 unterstützt, unterstützt es scheinbar nur eine Konvertierung zu varchar ab 8.3.

    Referenzen: #3000

misc

  • [bug] [ext]

    Fehler in der Erweitungsfunktion für mutable Typen sowie in flag_modified() behoben, bei der das Änderungsereignis nicht weitergegeben wurde, wenn das Attribut sich selbst neu zugewiesen hatte.

    Referenzen: #2997

0.8.5

Veröffentlicht: 19. Februar 2014

orm

  • [orm] [bug]

    Fehler behoben, bei dem Query.get() die InvalidRequestError, die bei Aufruf einer Abfrage mit vorhandenen Kriterien ausgelöst wird, nicht konsistent auslöste, wenn die angegebene Identität bereits im Identitätsabbild vorhanden ist.

    Referenzen: #2951

  • [orm] [bug]

    Fehlermeldung korrigiert, wenn ein Iteratorobjekt an class_mapper() oder ähnliches übergeben wird, bei der der Fehler bei der String-Formatierung nicht gerendert wurde. Pullreq von Kyle Stark.

  • [orm] [bug]

    Anpassung der subqueryload()-Strategie, die sicherstellt, dass die Abfrage nach Beginn des Ladevorgangs ausgeführt wird; dies dient dazu, dass subqueryload Vorrang vor anderen Ladern hat, die aufgrund anderer Eager/Noload-Situationen zur falschen Zeit auf dasselbe Attribut zugreifen.

    Referenzen: #2887

  • [orm] [bug]

    Fehler behoben bei der Verwendung von Joined-Table-Inheritance von einer Tabelle zu einem SELECT/Alias in der Basisklasse, wenn die PK-Spalten nicht gleichnamig waren; das Persistenzsystem konnte die Primärschlüsselwerte bei INSERT nicht von der Basistabelle auf die geerbte Tabelle kopieren.

    Referenzen: #2885

  • [orm] [bug]

    composite() löst eine informative Fehlermeldung aus, wenn die übergebenen Spalten-/Attributnamen (Namen) sich nicht zu einer Spalte oder einer zugeordneten Attribut (wie einem fehlerhaften Tupel) auflösen; zuvor wurde ein ungebundener lokaler Fehler ausgelöst.

    Referenzen: #2889

engine

  • [engine] [bug] [pool]

    Kritische Regression behoben, die durch #2880 verursacht wurde, bei der die neu gleichzeitige Möglichkeit, Verbindungen aus dem Pool zurückzugeben, bedeutet, dass das "first_connect"-Ereignis nun ebenfalls nicht mehr synchronisiert wird, was zu Dialektfehlkonfigurationen selbst unter minimalen Gleichzeitigkeitsbedingungen führt.

    Referenzen: #2880, #2964

sql

  • [sql] [bug]

    Fehler behoben, bei dem der Aufruf von Insert.values() mit einer leeren Liste oder einem leeren Tupel einen IndexError auslöste. Es erzeugt nun eine leere Insert-Konstruktion, wie es bei einem leeren Wörterbuch der Fall wäre.

    Referenzen: #2944

  • [sql] [bug]

    Fehler behoben, bei dem ColumnOperators.in_() in eine Endlosschleife geriet, wenn ihm fälschlicherweise eine Spaltenexpression übergeben wurde, deren Comparator die Methode __getitem__() enthielt, wie z. B. eine Spalte, die den ARRAY-Typ verwendet.

    Referenzen: #2957

  • [sql] [bug]

    Problem behoben, bei dem eine Primärschlüsselspalte mit einer Sequenz darauf, die Spalte aber nicht die "automatisch inkrementierende" Spalte war, entweder weil sie eine Fremdschlüsselbeschränkung hatte oder autoincrement=False gesetzt war, versuchte, die Sequenz bei INSERT für Backends auszulösen, die keine Sequenzen unterstützen, wenn ein INSERT ohne Primärschlüsselwert präsentiert wurde. Dies geschah auf Nicht-Sequenz-Backends wie SQLite und MySQL.

    Referenzen: #2896

  • [sql] [bug]

    Fehler mit der Methode Insert.from_select() behoben, bei der die Reihenfolge der angegebenen Namen bei der Generierung der INSERT-Anweisung nicht berücksichtigt wurde, was zu einer Diskrepanz mit den Spaltennamen in der angegebenen SELECT-Anweisung führte. Es wurde auch darauf hingewiesen, dass Insert.from_select() impliziert, dass serverseitige Standardwerte für INSERT nicht verwendet werden können, da die Anweisung keine VALUES-Klausel hat.

    Referenzen: #2895

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

postgresql

  • [postgresql] [bug]

    Eine zusätzliche Nachricht zur Erkennung von Verbindungsunterbrechungen bei psycopg2 wurde hinzugefügt: "could not send data to server", die die bestehende Nachricht "could not receive data from server" ergänzt und von Benutzern beobachtet wurde.

    Referenzen: #2936

  • [postgresql] [bug]

    Die Unterstützung für das Verhalten der PostgreSQL-Reflexion auf sehr alten (vor 8.1) PostgreSQL-Versionen und potenziell anderen PG-Engines wie Redshift (vorausgesetzt, Redshift meldet die Version als < 8.1) wurde verbessert. Die Abfrage für "Indizes" und "Primärschlüssel" basiert auf der Inspektion eines sogenannten "int2vector"-Datentyps, der sich vor 8.1 nicht in ein Array konvertieren lässt, was zu Fehlern bezüglich des "ANY()"-Operators in der Abfrage führt. Umfangreiche Recherchen haben die sehr hackelige, aber von PG-Core-Entwicklern empfohlene Abfrage für PG-Versionen < 8.1 gefunden, sodass Index- und Primärschlüsselbeschränkungsreflexionen auf diesen Versionen nun funktionieren.

  • [postgresql] [bug]

    Diese sehr alte Problem wurde überarbeitet, bei der die PostgreSQL-Abfrage zur Ermittlung von Primärschlüsseln aktualisiert wurde, um Primärschlüsselbeschränkungen zu berücksichtigen, die umbenannt wurden; die neuere Abfrage schlägt auf sehr alten PostgreSQL-Versionen wie Version 7 fehl, daher wird die alte Abfrage in diesen Fällen wiederhergestellt, wenn server_version_info < (8, 0) erkannt wird.

    Referenzen: #2291

mysql

  • [mysql] [feature]

    Neuer MySQL-spezifischer DATETIME mit Unterstützung für Bruchteile von Sekunden hinzugefügt; Bruchteile von Sekunden wurden auch zu TIMESTAMP hinzugefügt. Die DBAPI-Unterstützung ist begrenzt, obwohl Bruchteile von Sekunden bekanntermaßen von MySQL Connector/Python unterstützt werden. Patch von Geert JM Vanderkelen.

    Referenzen: #2941

  • [mysql] [bug]

    Unterstützung für die MySQL-Tabellen-Schlüsselwörter PARTITION BY und PARTITIONS hinzugefügt, die als mysql_partition_by='value' und mysql_partitions='value' an Table übergeben werden. Pull-Request von Marcus McCurdy.

    Referenzen: #2966

  • [mysql] [bug]

    Fehler behoben, der verhinderte, dass MySQLdb-basierte Dialekte (z. B. pymysql) unter Py3K funktionierten, bei denen eine Prüfung auf "connection charset" aufgrund der strengeren Wertvergleichsregeln von Py3K fehlschlug. Der fragliche Aufruf berücksichtigte ohnehin nicht die Datenbankversion, da die Serverversion zu diesem Zeitpunkt noch None war, sodass die Methode insgesamt vereinfacht wurde, um sich auf connection.character_set_name() zu verlassen.

    Referenzen: #2933

  • [mysql] [bug]

    Einige fehlende Methoden wurden zum cymysql-Dialekt hinzugefügt, darunter _get_server_version_info() und _detect_charset(). Pullreq von Hajime Nakagami.

sqlite

  • [sqlite] [bug]

    Eine Änderung wiederhergestellt, die beim Zurückportieren der Unique-Constraint-Reflexion auf 0.8 übersehen wurde, bei der UniqueConstraint mit SQLite fehlschlug, wenn reservierte Schlüsselwörter in den Spaltennamen enthalten waren. Pull-Request von Roman Podolyaka.

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 fand die Dezimalumwandlung nicht statt.

  • [mssql] [bug] [pymssql]

    Die Meldung "Net-Lib error during Connection reset by peer" wurde zur Liste der Meldungen hinzugefügt, die im pymssql-Dialekt auf "disconnect" geprüft werden. Mit freundlicher Genehmigung von John Anderson.

misc

  • [bug] [py3k]

    Py3K-Fehler behoben, bei dem ein fehlender Import dazu führte, dass der Modus "literal binary" beim Rendern eines gebundenen Parameters "util.binary_type" nicht importieren konnte. 0.9 handhabt dies anders. Pull-Request von Andreas Zeidler.

  • [bug] [firebird]

    Der Firebird-Dialekt wird Identifikatoren quotieren, die mit einem Unterstrich beginnen. Mit freundlicher Genehmigung von Treeve Jelbert.

    Referenzen: #2897

  • [bug] [firebird]

    Behob einen Fehler bei der Firebird-Index-Reflexion, bei dem die Spalten innerhalb des Index nicht korrekt sortiert wurden; sie werden nun nach der Reihenfolge von RDB$FIELD_POSITION sortiert.

  • [bug] [declarative]

    Die Fehlermeldung, wenn ein String-Argument an relationship() gesendet wird, das sich nicht zu einer Klasse oder einem Mapper auflöst, wurde korrigiert, um auf die gleiche Weise zu funktionieren wie bei einem nicht-String-Argument, welches den Namen der Beziehung angibt, bei der der Konfigurationsfehler aufgetreten ist.

    Referenzen: #2888

0.8.4

Veröffentlicht: 8. Dezember 2013

orm

  • [orm] [bug]

    Behob eine Regression, die durch #2818 eingeführt wurde, bei der die generierte EXISTS-Abfrage eine Warnung "columns being replaced" für eine Anweisung mit zwei Spalten gleichen Namens erzeugte, da das interne SELECT use_labels nicht gesetzt hätte.

    Referenzen: #2818

engine

  • [engine] [bug]

    Ein DBAPI, der bei connect() einen Fehler auslöst, der keine Unterklasse von dbapi.Error ist (wie z. B. TypeError, NotImplementedError etc.), wird die Ausnahme unverändert weitergeben. Zuvor würde die spezifische Fehlerbehandlung für die Routine connect() die Ausnahme sowohl unangemessen durch die Routine Dialect.is_disconnect() des Dialekts laufen lassen als auch sie in einen sqlalchemy.exc.DBAPIError einhüllen. Sie wird nun unverändert weitergegeben, wie es auch im Ausführungsprozess geschieht.

    Referenzen: #2881

  • [engine] [bug] [pool]

    Der QueuePool wurde erweitert, um neue Verbindungsversuche nicht zu blockieren, wenn ein bestehender Verbindungsversuch blockiert. Zuvor wurde die Erzeugung neuer Verbindungen innerhalb des Blocks, der den Überlauf überwachte, serialisiert; der Überlaufzähler wird nun innerhalb seines eigenen kritischen Abschnitts außerhalb des Verbindungsprozesses selbst geändert.

    Referenzen: #2880

  • [engine] [bug] [pool]

    Es wurde eine leichte Anpassung an der Logik vorgenommen, die auf eine verfügbare gepoolte Verbindung wartet, so dass bei einem Verbindungspool ohne Zeitüberschreitung alle halbe Sekunde aus der Wartepause ausgebrochen wird, um das sogenannte "Abort"-Flag zu überprüfen. Dies ermöglicht es dem Wartenden, 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 seltenen 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.

    Referenzen: #2522

  • [engine] [bug]

    Behob einen Fehler, bei dem eine SQL-Anweisung falsch ASCII-kodiert wurde, wenn ein vor-DBAPI StatementError innerhalb von Connection.execute() ausgelöst wurde, was zu Kodierungsfehlern für Nicht-ASCII-Anweisungen führte. Die Stringifizierung verbleibt nun innerhalb von Python Unicode und vermeidet so Kodierungsfehler.

    Referenzen: #2871

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.

    Referenzen: #1443

postgresql

  • [postgresql] [bug]

    Behob einen Fehler, bei dem die Indexreflexion indkey-Werte bei Verwendung des pypostgresql-Adapters falsch interpretierte, der diese Werte als Listen zurückgibt, im Gegensatz zum Rückgabetyp von psycopg2, der ein String ist.

    Referenzen: #2855

mssql

  • [mssql] [bug]

    Behob einen 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; schemaname/tabellenname wurden vertauscht. Das Format wurde auch überarbeitet, um der aktuellen MSSQL-Dokumentation zu entsprechen. Mit freundlicher Genehmigung von Derek Harland.

oracle

  • [oracle] [bug]

    Der Fehlercode ORA-02396 "maximum idle time" wurde der Liste der "is disconnect"-Codes bei cx_oracle hinzugefügt.

    Referenzen: #2864

  • [oracle] [bug]

    Behob einen Fehler, bei dem Oracle VARCHAR-Typen ohne Länge (z. B. für eine CAST oder ähnliches) falsch None CHAR oder ähnliches renderten.

    Referenzen: #2870

misc

  • [bug] [ext]

    Behob einen Fehler, der die korrekte Funktion der serializer-Erweiterung mit Tabellen- oder Spaltennamen, die Nicht-ASCII-Zeichen enthalten, verhinderte.

    Referenzen: #2869

0.8.3

Veröffentlicht: 26. Oktober 2013

orm

  • [orm] [feature]

    Neue Option distinct_target_key zur Beziehung relationship() hinzugefügt. Diese ermöglicht es der Subquery-Eager-Loading-Strategie, ein DISTINCT auf die innerste SELECT-Subquery anzuwenden, um Fälle zu unterstützen, in denen Duplikate von der innersten Abfrage, die dieser Beziehung entspricht, generiert werden (es gibt noch keine allgemeine Lösung für das Problem von Duplikaten innerhalb des Subquery-Eager-Loadings, 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 Spalten ansteuert, die kein vollständiger Primärschlüssel sind. Die Option ist in 0.8 standardmäßig False (d. h. standardmäßig aus), in 0.9 None (d. h. standardmäßig automatisch). Dank an Alexander Koval für die Hilfe dabei.

    Referenzen: #2836

  • [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 wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2807

  • [orm] [bug]

    Behob einen Fehler, bei dem die Verwendung einer Annotation wie remote() oder foreign() für eine Column, bevor sie mit einer übergeordneten Table verbunden wurde, Probleme im Zusammenhang damit verursachen konnte, dass die übergeordnete Tabelle nicht in Joins gerendert wurde, aufgrund der inhärenten Kopieroperation, die von einer Annotation durchgeführt wird.

    Referenzen: #2813

  • [orm] [bug]

    Behob einen Fehler, bei dem Query.exists() ohne WHERE-Kriterium nicht korrekt funktionierte. Mit freundlicher Genehmigung von Vladimir Magamedov.

    Referenzen: #2818

  • [orm] [bug]

    Eine Änderung von 0.9 wurde zurückportiert, bei der die Iteration einer Hierarchie von Mappern, die bei polymorpher Vererbung geladen werden, sortiert wird. Dies ermöglicht, dass die für polymorphe Abfragen generierten SELECT-Anweisungen deterministisch gerendert werden, was wiederum Caching-Schemata unterstützt, die auf der SQL-Zeichenfolge selbst basieren.

    Referenzen: #2779

  • [orm] [bug]

    Behob ein potenzielles Problem bei einer Implementierung von geordneten Sequenzen, die vom ORM zur Iteration von Mapper-Hierarchien verwendet wurde; unter dem Jython-Interpreter war diese Implementierung nicht geordnet, obwohl cPython und PyPy die Ordnung beibehielten.

    Referenzen: #2794

  • [orm] [bug]

    Behob einen Fehler bei der ORM-Level-Ereignisregistrierung, bei dem die Flags "raw" oder "propagate" bei einigen "unmapped base class"-Konfigurationen falsch konfiguriert sein konnten.

    Referenzen: #2786

  • [orm] [bug]

    Eine Performance-Verbesserung im Zusammenhang mit der Verwendung der defer()-Option beim Laden von zugeordneten Entitäten. Der Overhead der Funktion zur Anwendung eines pro-Objekt verzögerten Aufrufs auf eine Instanz beim Laden war deutlich höher als das reine Laden der Daten aus der Zeile (beachten Sie, dass defer() dazu gedacht ist, den DB/Netzwerk-Overhead zu reduzieren, nicht unbedingt die Anzahl der Funktionsaufrufe); der Overhead der Funktionsaufrufe ist nun in allen Fällen geringer als der des Ladens von Daten aus der Spalte. Es gibt auch eine Reduzierung der Anzahl von "lazy callable"-Objekten, die pro Ladevorgang erstellt werden, von N (Gesamtzahl der verzögerten Werte im Ergebnis) auf 1 (Gesamtzahl der verzögerten Spalten).

    Referenzen: #2778

  • [orm] [bug]

    Behob einen Fehler, bei dem Attributverlaufsfunktionen fehlschlugen, wenn ein Objekt mit der Funktion make_transient() von "persistent" zu "pending" verschoben wurde, für Operationen, die Sammlung-basierte Backrefs involvierten.

    Referenzen: #2773

orm declarative

  • [orm] [declarative] [feature]

    Ein praktischer Klassen-Decorator as_declarative() wurde hinzugefügt. Dies ist ein Wrapper für declarative_base(), der es ermöglicht, eine bestehende Basisklasse mit einem ausgefallenen Klassen-Decorator-Ansatz anzuwenden.

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 "Discriminator" zu erledigen. Es wurde auch ein echtes "Generic Foreign Key"-Beispiel hinzugefügt, das ähnlich wie bei anderen beliebten Frameworks funktioniert, indem es einen offen endenden Integer verwendet, um auf jede andere Tabelle zu verweisen, und die traditionelle referenzielle Integrität aufgibt. Obwohl wir dieses Muster nicht empfehlen, will Information frei sein.

  • [examples] [bug]

    Zu der im Versionierungsbeispiel erstellten Verlaufstabelle wurde "autoincrement=False" hinzugefügt, da diese Tabelle ohnehin keine Autoinkrementierung haben sollte. Mit freundlicher Genehmigung von Patrick Schmid.

engine

  • [engine] [feature]

    Die repr() für die URL einer Engine wird nun das Passwort mit Sternchen verbergen. Mit freundlicher Genehmigung von Gunnlaugur Þór Briem.

    Referenzen: #2821

  • [engine] [bug]

    Der von der Funktion make_url() verwendete reguläre Ausdruck analysiert nun IPv6-Adressen, z. B. in Klammern eingeschlossene.

    Diese Änderung wird auch **zurückportiert** zu: 0.7.11

    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 bestimmtes Problem im Oracle 8-Dialekt, aber im Allgemeinen sollte die Dialect.initialize()-Phase nur einmal pro Dialekt stattfinden.

    Referenzen: #2776

  • [engine] [bug] [pool]

    Behob einen Fehler, bei dem QueuePool die korrekte Anzahl der ausgecheckten Verbindungen verlor, wenn eine bestehende gepoolte Verbindung nach einem Invalidierungs- oder Recycling-Ereignis nicht wiederhergestellt werden konnte.

    Referenzen: #2772

sql

  • [sql] [feature]

    Eine neue Methode wurde dem insert()-Konstrukt Insert.from_select() hinzugefügt. Gegeben eine Liste von Spalten und ein auswählbares Objekt, rendert dies INSERT INTO (tabelle) (spalten) SELECT ...

    Referenzen: #722

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

  • [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 wird auch **zurückportiert** zu: 0.7.11

    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 wird auch **zurückportiert** zu: 0.7.11

    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 wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2784

  • [sql] [bug]

    Behob einen Fehler, bei dem type_coerce() ORM-Elemente mit einer __clause_element__()-Methode nicht richtig interpretierte.

    Referenzen: #2849

  • [sql] [bug]

    Die Typen Enum und Boolean umgehen nun benutzerdefinierte (z. B. TypeDecorator) Typen, die bei der Erzeugung der CHECK-Beschränkung für den "nicht nativen" Typ verwendet werden. Dies geschieht, damit der benutzerdefinierte Typ nicht an dem Ausdruck innerhalb der CHECK beteiligt ist, da dieser Ausdruck auf dem "impl"-Wert und nicht auf dem "dekorierten" Wert beruht.

    Referenzen: #2842

  • [sql] [bug]

    Das `.unique`-Flag von Index konnte als None generiert werden, wenn es von einer Column stammte, die `unique` nicht spezifiziert hatte (wo es standardmäßig None ist). Das Flag wird nun immer True oder False sein.

    Referenzen: #2825

  • [sql] [bug]

    Der Standardcompiler sowie die Compiler von PostgreSQL, MySQL und MSSQL wurden korrigiert, um sicherzustellen, dass literale 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.

    Referenzen: #2742

  • [sql] [bug]

    Eine select(), die in ihrer FROM-Klausel auf sich selbst verweist, typischerweise durch In-Place-Mutation, löst nun eine informative Fehlermeldung aus, anstatt eine Rekursionsüberlastung zu verursachen.

    Referenzen: #2815

  • [sql] [bug]

    Das nicht funktionierende Argument "schema" in ForeignKey ist veraltet; es löst eine Warnung aus. Entfernt in 0.9.

    Referenzen: #2831

  • [sql] [bug]

    Behob einen Fehler, bei dem die Verwendung des `column_reflect`-Ereignisses zur Änderung des `.key` der eingehenden Column verhinderte, dass Primärschlüsselbeschränkungen, Indizes und Fremdschlüsselbeschränkungen korrekt reflektiert wurden.

    Referenzen: #2811

  • [sql] [bug]

    Der Operator ColumnOperators.notin_(), der in 0.8 hinzugefügt wurde, erzeugt nun korrekt die Negation des Ausdrucks, den "IN" zurückgibt, wenn er gegen eine leere Sammlung verwendet wird.

  • [sql] [bug] [postgresql]

    Behob einen Fehler, bei dem das Ausdruckssystem auf die `str()`-Form einiger Ausdrücke bei der Referenzierung der `.c`-Sammlung eines `select()`-Konstrukts angewiesen war, aber die `str()`-Form nicht verfügbar war, da das Element dialektspezifische Kompilierungskonstrukte benötigte, 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.

    Referenzen: #2780

postgresql

  • [postgresql] [bug]

    Eine 128-Zeichen-Beschneidung bei der Reflexion des Server-Defaults für eine Spalte wurde entfernt; dieser Code stammte ursprünglich aus PG-Systemansichten, die den String zur besseren Lesbarkeit beschnitten.

    Referenzen: #2844

  • [postgresql] [bug]

    Klammern werden auf einen zusammengesetzten SQL-Ausdruck angewendet, wie er in der Spaltenliste einer CREATE INDEX-Anweisung gerendert wird.

    Referenzen: #2742

  • [postgresql] [bug]

    Behob einen Fehler, bei dem PostgreSQL-Versionszeichenfolgen, die ein Präfix vor den Wörtern "PostgreSQL" oder "EnterpriseDB" hatten, nicht geparst wurden. Mit freundlicher Genehmigung von Scott Schaefer.

    Referenzen: #2819

mysql

  • [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 wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2791

  • [mysql] [bug]

    Die Änderung in #2721, nämlich dass das Schlüsselwort deferrable von ForeignKeyConstraint im MySQL-Backend stillschweigend ignoriert wurde, wird ab 0.9 rückgängig gemacht; dieses Schlüsselwort wird wieder gerendert und löst Fehler unter MySQL aus, da es nicht verstanden wird - das gleiche Verhalten gilt auch für das Schlüsselwort initially. In 0.8 bleiben die Schlüsselwörter ignoriert, aber eine Warnung wird ausgegeben. Zusätzlich löst das Schlüsselwort match unter 0.9 einen 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 zur Dokumentation hinzugefügt, siehe MySQL / MariaDB Foreign Keys.

    Referenzen: #2721, #2839

  • [mysql] [bug]

    Der MySQL-Connector-Dialekt erlaubt nun Optionen in der create_engine-Abfragezeichenfolge, um die im Connect gesetzten Standardwerte zu überschreiben, einschließlich "buffered" und "raise_on_warnings".

    Referenzen: #2515

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.

    Referenzen: #2781

oracle

  • [oracle] [bug]

    Behob einen Fehler, bei dem die Oracle-Tabellenreflexion unter Verwendung von Synonymen fehlschlagen würde, wenn sich das Synonym und die Tabelle in verschiedenen Remote-Schemas befanden. Patch zur Behebung mit freundlicher Genehmigung von Kyle Derr.

    Referenzen: #2853

misc

  • [feature]

    Es wurde ein neues Flag system=True zu Column hinzugefügt, das die Spalte als "System"-Spalte kennzeichnet, die automatisch von der Datenbank bereitgestellt wird (wie z. B. PostgreSQL oid oder xmin). Die Spalte wird von der CREATE TABLE-Anweisung weggelassen, aber ansonsten zum Abfragen verfügbar sein. Darüber hinaus kann das Konstrukt CreateColumn auf eine benutzerdefinierte Kompilierungsregel angewendet werden, die das Überspringen von Spalten ermöglicht, indem eine Regel erzeugt wird, die None zurückgibt.

0.8.2

Veröffentlicht: 3. Juli 2013

orm

  • [orm] [feature]

    Es wurde eine neue Methode Query.select_entity_from() hinzugefügt, die in 0.9 einen Teil der Funktionalität von Query.select_from() ersetzen wird. In 0.8 erfüllen die beiden Methoden die gleiche Funktion, so dass Code bei Bedarf zur Verwendung der Methode Query.select_entity_from() migriert werden kann. Details finden Sie im Migrationshandbuch für 0.9.

    Referenzen: #2736

  • [orm] [bug]

    Es wird eine Warnung 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.

    Referenzen: #2750

  • [orm] [bug]

    Behob einen Fehler in der generierten polymorphen SQL-Anweisung, bei der mehrere joined-inheritance-Entitäten gegen dieselbe Basisklasse, die auch untereinander verbunden waren, die Spalten in der Basistabelle nicht unabhängig voneinander verfolgten, wenn die Zeichenkette der Joins mehr als zwei Entitäten lang war.

    Referenzen: #2759

  • [orm] [bug]

    Behob einen Fehler, bei dem das Senden eines zusammengesetzten Attributs in Query.order_by() einen parenthetischen Ausdruck erzeugte, der von einigen Datenbanken nicht akzeptiert wurde.

    Referenzen: #2754

  • [orm] [bug]

    Behob die Interaktion zwischen zusammengesetzten Attributen und der Funktion aliased(). Zuvor funktionierten zusammengesetzte Attribute in Vergleichsoperationen nicht korrekt, wenn Aliasing angewendet wurde.

    Referenzen: #2755

  • [orm] [bug] [ext]

    Behob einen Fehler, bei dem MutableDict kein Änderungsereignis meldete, wenn clear() aufgerufen wurde.

    Referenzen: #2730

  • [orm] [bug]

    Behob eine Regression, die durch #2682 verursacht wurde, wodurch die von Query.update() und Query.delete() aufgerufene Auswertung auf nicht unterstützte True- und False-Symbole stieß, die nun aufgrund der Verwendung von IS erscheinen.

    Referenzen: #2737

  • [orm] [bug]

    Behob eine Regression aus 0.7, die durch dieses Ticket verursacht wurde und bei der die Prüfung auf Rekursionsüberlauf bei selbstreferenziellen Eager-Joins zu locker war, wodurch ein bestimmter Umstand übersehen wurde, bei dem eine Unterklasse lazy="joined" oder "subquery" konfiguriert hatte und der Ladevorgang ein "with_polymorphic" gegen die Basis war.

    Referenzen: #2481

  • [orm] [bug]

    Behob eine Regression aus 0.7, bei der das Context-Manager-Feature von Session.begin_nested() die Transaktion nicht korrekt zurückrollen konnte, wenn ein Flush-Fehler auftrat, stattdessen eine eigene Ausnahme auslöste, während die Sitzung immer noch auf ein Rollback wartete.

    Referenzen: #2718

orm declarative

  • [orm] [declarative] [feature]

    ORM-Deskriptoren wie Hybrid-Properties können nun über ihren Namen in einem Zeichenkettenargument für order_by, primaryjoin oder ähnliche in relationship() referenziert werden, zusätzlich zu Spalten-gebundenen Attributen.

    Referenzen: #2761

examples

  • [examples] [bug]

    Behob ein Problem mit dem "Versioning"-Rezept, 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.

  • [examples] [bug]

    Behob einen kleinen Fehler im Dogpile-Beispiel, bei dem die Generierung von SQL-Cache-Schlüsseln die Deduping-Labels nicht auf die Anweisung anwendete, so wie Query dies normalerweise tut.

engine

  • [engine] [bug]

    Behob einen Fehler, bei dem das Argument reset_on_return für verschiedene Pool-Implementierungen nicht weitergegeben wurde, wenn der Pool neu generiert wurde. Mit freundlicher Genehmigung von Eevee.

  • [engine] [bug] [sybase]

    Behob einen Fehler, bei dem die Routine zur Erkennung der richtigen kwargs, die an create_engine() gesendet wurden, in einigen Fällen fehlschlug, z. B. bei der Sybase-Dialekt.

    Referenzen: #2732

sql

  • [sql] [feature]

    Es wurde ein neues Attribut für TypeDecorator namens TypeDecorator.coerce_to_is_types hinzugefügt, um die Kontrolle darüber zu erleichtern, wie Vergleiche mit == oder != mit None und booleschen Typen zu einem IS-Ausdruck oder einem einfachen Gleichheitsausdruck mit einem gebundenen Parameter führen.

    Referenzen: #2734, #2744

  • [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 hinweg, wenn eine explizite Korrelation über Select.correlate() hergestellt wird, vorausgesetzt, dass das Ziel-SELECT irgendwo entlang der Kette von einer WHERE/ORDER BY/columns-Klausel umschlossen ist, nicht nur von verschachtelten FROM-Klauseln. Dies bewirkt, dass Select.correlate() wieder kompatibler mit 0.7 ist und dennoch die neue "smarte" Korrelation beibehält.

    • 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, was die Kompatibilität mit 0.8.0/0.8.1 beibehält.

    • Die Methode Select.correlate_except() verhinderte nicht in allen Fällen, dass die angegebenen FROM-Klauseln korreliert wurden, und führte auch dazu, dass FROM-Klauseln fälschlicherweise ganz weggelassen wurden (ähnlich wie in 0.7), dies wurde behoben.

    • Das Aufrufen von select.correlate_except(None) führt dazu, dass alle FROM-Klauseln wie erwartet in die Korrelation einbezogen werden.

    Referenzen: #2668, #2746

  • [sql] [bug]

    Behob einen Fehler, bei dem das Verknüpfen eines select()-Aufrufs einer Tabelle "A" mit mehreren Fremdschlüsselpfaden zu einer Tabelle "B" mit dieser Tabelle "B" fehlschlug, indem nicht die Fehlermeldung "Mehrdeutige Verknüpfungsbedingung" erzeugt wurde, die bei einer direkten Verknüpfung der Tabelle "A" mit "B" gemeldet worden wäre; stattdessen wurde eine Verknüpfungsbedingung mit mehreren Kriterien erzeugt.

    Referenzen: #2738

  • [sql] [bug] [reflection]

    Behob einen Fehler, bei dem die Verwendung von MetaData.reflect() über ein Remote-Schema und ein lokales Schema hinweg zu falschen Ergebnissen führen konnte, wenn beide Schemata eine Tabelle mit demselben Namen hatten.

    Referenzen: #2728

  • [sql] [bug]

    Der nicht implementierte Aufruf von __iter__() in der Basisklasse ColumnOperators wurde entfernt. Obwohl dies in 0.8.0 eingeführt wurde, um eine endlose, speicherfressende Schleife zu verhindern, wenn man auch eine __getitem__()-Methode für einen benutzerdefinierten Operator implementiert und dann versehentlich list() auf diesem Objekt aufruft, hatte es zur Folge, dass Spaltenelemente als iterierbare Typen gemeldet wurden, was dann beim Versuch, sie zu iterieren, einen Fehler 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__() für Ihre benutzerdefinierten Operatoren!

    Referenzen: #2726

  • [sql] [bug] [mssql]

    Eine Regression aus diesem Ticket führte dazu, dass das nicht unterstützte Schlüsselwort "true" gerendert wurde; es wurde eine Logik hinzugefügt, um dies für den SQL Server in 1/0 umzuwandeln.

    Referenzen: #2682

postgresql

  • [postgresql] [feature]

    Die Unterstützung für PostgreSQL 9.2 Bereichstypen wurde hinzugefügt. Derzeit wird keine Typenübersetzung bereitgestellt, so dass es derzeit direkt mit Strings oder den psycopg2 2.5 Bereichs-Erweiterungstypen funktioniert. Patch mit freundlicher Genehmigung von Chris Withers.

  • [postgresql] [feature]

    Es wurde die Unterstützung für die "AUTOCOMMIT"-Isolierung bei Verwendung des psycopg2 DBAPI hinzugefügt. Das Schlüsselwort ist über die Ausführungsoption isolation_level verfügbar. Patch mit freundlicher Genehmigung von Roman Podolyaka.

    Referenzen: #2072

  • [postgresql] [bug]

    Das Verhalten von extract() wurde im PostgreSQL-Dialekt vereinfacht, so dass keine fest kodierte ::timestamp oder ähnliche Casts mehr in den angegebenen Ausdruck eingefügt werden, da dies Typen wie zeitzonenbehaftete Datums-/Zeitwerte beeinträchtigte, aber auch bei modernen Versionen von psycopg2 überhaupt nicht notwendig zu sein scheint.

    Referenzen: #2740

  • [postgresql] [bug]

    Behob einen Fehler im HSTORE-Typ, bei dem Schlüssel/Werte, die Backslash-Anführungszeichen enthielten, bei Verwendung der "nicht nativen" (d. h. nicht-psycopg2) Mittel zur Übersetzung von HSTORE-Daten nicht korrekt maskiert wurden. Patch mit freundlicher Genehmigung von Ryan Kelly.

    Referenzen: #2766

  • [postgresql] [bug]

    Behob einen Fehler, bei dem die Reihenfolge der Spalten in einem mehrspaltigen PostgreSQL-Index in der falschen Reihenfolge reflektiert wurde. Mit freundlicher Genehmigung von Roman Podolyaka.

    Referenzen: #2767

  • [postgresql] [bug]

    Der HSTORE-Typ wurde korrigiert, um Unicode korrekt zu kodieren/dekodieren. Dies ist immer aktiv, da HSTORE ein Texttyp ist und dem Verhalten von psycopg2 bei der Verwendung von Python 3 entspricht. Mit freundlicher Genehmigung von Dmitry Mugtasimov.

    Referenzen: #2735

mysql

  • [mysql] [feature]

    Der Parameter mysql_length, der mit Index verwendet wird, kann nun als Wörterbuch von Spaltennamen/Längen übergeben werden, für die Verwendung mit zusammengesetzten Indizes. Großen Dank an Roman Podolyaka für den Patch.

    Referenzen: #2704

  • [mysql] [bug]

    Behob einen Fehler bei der Verwendung von Multi-Table-UPDATE, bei dem eine zusätzliche Tabelle eine SELECT-Anweisung mit eigenen gebundenen Parametern ist, wobei die Position der gebundenen Parameter gegenüber der Anweisung selbst vertauscht war, wenn die spezielle Syntax von MySQL verwendet wurde.

    Referenzen: #2768

  • [mysql] [bug]

    Es wurde eine weitere Bedingung zum mysql+gaerdbms-Dialekt hinzugefügt, um den sogenannten "development"-Modus zu erkennen, bei dem wir die rdbms_mysqldb DBAPI verwenden sollten. Patch mit freundlicher Genehmigung von Brett Slatkin.

    Referenzen: #2715

  • [mysql] [bug]

    Das Schlüsselwortargument deferrable für ForeignKey und ForeignKeyConstraint wird im MySQL-Dialekt nicht das Schlüsselwort DEFERRABLE rendern. Lange Zeit haben wir dies beibehalten, da ein nicht-deferrable Fremdschlüssel sich sehr anders verhält als ein deferrable, aber einige Umgebungen deaktivieren FKs auf MySQL, daher werden wir hier weniger meinungsstark sein.

    Referenzen: #2721

  • [mysql] [bug]

    Der mysqlconnector-Dialekt wurde aktualisiert, um die Trennung basierend auf der scheinbar übermittelten Fehlermeldung in der Ausnahme zu prüfen; getestet gegen mysqlconnector 1.0.9.

sqlite

  • [sqlite] [bug]

    Es wurde sqlalchemy.types.BIGINT zur Liste der Typennamen hinzugefügt, die vom SQLite-Dialekt reflektiert werden können; mit freundlicher Genehmigung von Russell Stuart.

    Referenzen: #2764

mssql

  • [mssql] [bug]

    Beim Abfragen des Informationsschemas auf SQL Server 2000 wurde ein CAST-Aufruf entfernt, der in 0.8.1 hinzugefügt wurde, um Treiberprobleme zu beheben, der anscheinend auf 2000 nicht kompatibel ist. Der CAST bleibt für SQL Server 2005 und höher bestehen.

    Referenzen: #2747

misc

  • [feature] [firebird]

    Es wurden neue Flags retaining=True 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 gesendet wird. Aufgrund historischer Bedenken ist dieses Flag in 0.8.2 standardmäßig auf True gesetzt, in 0.9.0b1 jedoch standardmäßig auf False.

    Referenzen: #2763

  • [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 welchem Fall er als NUMERIC behandelt wird. Patch mit freundlicher Genehmigung von Russell Stuart.

    Referenzen: #2757

  • [bug] [ext]

    Behob einen Fehler, bei dem die mutable Erweiterung fehlschlug, wenn ein zusammengesetzter Typ mit einer Funktion anstelle einer Klasse eingerichtet wurde, als sie versuchte zu prüfen, ob diese Spalte eine MutableComposite war (was sie nicht ist). Mit freundlicher Genehmigung von asldevi.

  • [requirements]

    Die Python-Bibliothek mock 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.

0.8.1

Veröffentlicht: 27. April 2013

orm

  • [orm] [feature]

    Es wurde eine praktische Methode für Query hinzugefügt, die eine Abfrage in eine EXISTS-Unterabfrage der Form EXISTS (SELECT 1 FROM ... WHERE ...) umwandelt.

    Referenzen: #2673

  • [orm] [bug]

    Fehler behoben, bei dem eine Abfrage der Form: query(SubClass).options(subqueryload(Baseclass.attrname)), wobei SubClass ein joined inh von BaseClass ist, die JOIN innerhalb der Subquery auf das Attributladen nicht korrekt anwenden würde, was zu einem kartesischen Produkt führt. Die gefüllten Ergebnisse waren immer noch korrekt, da zusätzliche Zeilen einfach ignoriert wurden, so dass dieses Problem als Leistungsminderung in Anwendungen vorhanden sein kann, die ansonsten korrekt funktionieren.

    Diese Änderung wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2699

  • [orm] [bug]

    Fehler in der Unit of Work behoben, bei dem eine Joined-Inheritance-Subklasse die Zeile für die "Sub"-Tabelle vor der Elterntabelle einfügen konnte, wenn zwischen den beiden Tabellen keine ForeignKey-Constraints eingerichtet waren.

    Diese Änderung wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2689

  • [orm] [bug]

    Korrekturen an der Erweiterung sqlalchemy.ext.serializer, einschließlich der Tatsache, dass die vom Pickler übergebene "id" in einen String umgewandelt wird, um zu verhindern, dass Bytes auf Py3K geparst werden, sowie dass relationship() und orm.join() Konstrukte jetzt korrekt serialisiert werden.

    Referenzen: #2698

  • [orm] [bug]

    Eine deutliche Verbesserung der internen Funktionsweise von query.join(), so dass die Entscheidung, wie verbunden wird, drastisch vereinfacht wurde. Neue Testfälle werden jetzt bestanden, wie z. B. mehrere Joins, die von der Mitte einer bereits komplexen Join-Reihe ausgehen und Vererbung usw. betreffen. Das Beitreten von tief verschachtelten Subquery-Strukturen ist immer noch kompliziert und nicht ohne Vorbehalte, aber mit diesen Verbesserungen werden die Randfälle hoffentlich noch weiter an die Ränder verschoben.

    Referenzen: #2714

  • [orm] [bug]

    Dem Unpickling-Prozess für ORM-gemappte Objekte wurde eine Bedingung hinzugefügt, so dass, wenn die Referenz auf das Objekt beim Pickling verloren ging, nicht fälschlicherweise versucht wird, _sa_instance_state einzurichten – behebt einen NoneType-Fehler.

  • [orm] [bug]

    Fehler behoben, bei dem eine Many-to-Many-Beziehung mit uselist=False die Assoziationszeile nicht löschen und einen Fehler auslösen würde, wenn das skalare Attribut auf None gesetzt wurde. Dies war eine Regression, die durch die Änderungen für #2229 eingeführt wurde.

    Referenzen: #2710

  • [orm] [bug]

    Verbesserung des Verhaltens des Instanzmanagements bezüglich der Erstellung von starken Referenzen innerhalb der Session; ein Objekt wird keine internen Referenzzyklen mehr erzeugen, wenn es sich im transienten Zustand befindet oder in den detachierten Zustand übergeht – die starke Referenz wird nur erstellt, wenn das Objekt an eine Session angehängt ist und entfernt, wenn das Objekt abgelöst wird. Dies macht es etwas sicherer für ein Objekt, eine Methode __del__() zu haben, auch wenn dies nicht empfohlen wird, da Beziehungen mit Backrefs ebenfalls Zyklen erzeugen. Eine Warnung wurde hinzugefügt, wenn eine Klasse mit einer Methode __del__() gemappt wird.

    Referenzen: #2708

  • [orm] [bug]

    Fehler behoben, bei dem ORM die falsche Art von Abfrage ausführte, wenn eine vererbungszugeordnete Klasse aktualisiert wurde, bei der die Oberklasse auf ein Nicht-Tabellen-Objekt abgebildet war, wie z. B. ein benutzerdefiniertes join() oder ein select(), und eine Abfrage ausführte, die eine Hierarchie annahm, die auf einzelne Tabellen pro Klasse abgebildet ist.

    Referenzen: #2697

  • [orm] [bug]

    Fehler behoben: __repr__() auf Mapper-Eigenschafts-Konstrukten funktioniert jetzt vor der Initialisierung des Objekts, sodass Sphinx-Builds mit neueren Sphinx-Versionen sie lesen können.

orm deklarativ

  • [orm] [declarative] [bug]

    Indirekte Regression bezüglich has_inherited_table() behoben, da diese die __table__ der aktuellen Klasse berücksichtigt und empfindlich darauf reagierte, wann sie aufgerufen wurde. Dies ist auch das Verhalten von 0.7, aber in 0.7 "gaben sich die Dinge" in Ereignissen wie __mapper_args__(). has_inherited_table() berücksichtigt jetzt nur noch Oberklassen und sollte daher unabhängig davon, wann sie aufgerufen wird, dieselbe Antwort bezüglich der aktuellen Klasse liefern (natürlich unter der Annahme des Zustands der Oberklasse).

    Referenzen: #2656

examples

  • [examples] [bug]

    Langjähriger Fehler im Caching-Beispiel behoben, bei dem die Limit/Offset-Parameterwerte bei der Berechnung des Cache-Schlüssels nicht berücksichtigt wurden. Die Funktion _key_from_query() wurde vereinfacht, um direkt von der endgültigen kompilierten Anweisung auszugehen, um sowohl die vollständige Anweisung als auch die vollständig verarbeitete Parameterliste zu erhalten.

sql

  • [sql] [feature]

    Die Prüfung auf Dialekt-spezifische Argumentnamen, die an Table() übergeben werden, wurde gelockert. Da wir externe Dialekte unterstützen und auch Argumente ohne einen bestimmten installierten Dialekt unterstützen wollen, wird jetzt nur noch das Format des Arguments geprüft, anstatt nach diesem Dialekt in sqlalchemy.dialects zu suchen.

  • [sql] [bug] [mysql]

    Die Operatoren IS und IS NOT im Hinblick auf die Konstanten True/False wurden vollständig implementiert. Ein Ausdruck wie col.is_(True) rendert nun col IS true auf der Zielplattform, anstatt die True/False-Konstante in einen ganzzahligen gebundenen Parameter umzuwandeln. Dies ermöglicht, dass der Operator is_() unter MySQL funktioniert, wenn er mit True/False-Konstanten verwendet wird.

    Referenzen: #2682

  • [sql] [bug]

    Eine wichtige Korrektur der Art und Weise, wie ein select()-Objekt beschriftete Spalten erzeugt, wenn apply_labels() verwendet wird; dieser Modus erzeugt ein SELECT, bei dem jede Spalte als <<tablename>_<columnname>> beschriftet ist, um Spaltennamenskollisionen bei einem Mehrfach-Tabellen-SELECT zu vermeiden. Die Korrektur besteht darin, dass, wenn zwei Labels in Kombination mit dem Tabellennamen kollidieren, z. B. "foo.bar_id" und "foo_bar.id", eine anonyme Aliasbildung auf eine der Duplikate angewendet wird. Dies ermöglicht es ORM, beide Spalten unabhängig zu verarbeiten; zuvor gab 0.7 in einigen Fällen stillschweigend ein zweites SELECT für die "duplizierte" Spalte aus, und in 0.8 wurde ein Fehler mit ambiguöser Spalte ausgegeben. Die "Schlüssel", die auf die .c.-Sammlung des select() angewendet werden, werden ebenfalls dedupliziert, so dass die Warnung "Spalte wird ersetzt" nicht mehr für ein select() ausgegeben wird, das use_labels angibt, obwohl der Duplikatschlüssel eine anonyme Bezeichnung erhält, die im Allgemeinen nicht benutzerfreundlich ist.

    Referenzen: #2702

  • [sql] [bug]

    Fehler behoben, bei dem die Erkennung von Verbindungsabbrüchen bei einem Fehler einen Attributfehler auslöste, wenn der Fehler nach dem bereits erfolgten Schließen des Connection-Objekts auftrat.

    Referenzen: #2691

  • [sql] [bug]

    Interne Ausnahmeauslösungen, die ein rollback() vor dem erneuten Auslösen ausgeben, wurden überarbeitet, so dass der Stack-Trace von sys.exc_info() vor dem Eintritt in das Rollback erhalten bleibt. Dies dient dazu, den Traceback beim Verwenden von Coroutine-Frameworks zu erhalten, die den Kontext möglicherweise gewechselt haben, bevor die Rollback-Funktion zurückkehrt.

    Referenzen: #2703

  • [sql] [bug] [postgresql]

    Der _Binary-Basistyp konvertiert Werte jetzt über den bytes()-Aufruf, wenn er unter Python 3 ausgeführt wird; insbesondere scheint psycopg2 2.5 mit Python 3.3 jetzt den Typ "memoryview" zurückzugeben, so dass dieser vor der Rückgabe in Bytes konvertiert wird.

  • [sql] [bug]

    Verbesserungen bei der Behandlung der automatischen Invalidierung von Verbindungen. Wenn ein Nicht-Disconnect-Fehler auftritt, aber zu einem verzögerten Disconnect-Fehler während der Fehlerbehandlung führt (passiert bei MySQL), wird die Disconnect-Bedingung erkannt. Die Verbindung kann jetzt auch in einem ungültigen Zustand geschlossen werden, was bedeutet, dass bei der nächsten Verwendung "closed" ausgelöst wird, und zusätzlich funktioniert das "Close with result"-Feature auch dann, wenn das automatische Rollback in einer Fehlerbehandlungsroutine fehlschlägt und unabhängig davon, ob die Bedingung ein Disconnect ist oder nicht.

    Referenzen: #2695

  • [sql] [bug]

    Fehler behoben, bei dem eine DBAPI, die "0" für cursor.lastrowid zurückgeben kann, nicht korrekt in Verbindung mit ResultProxy.inserted_primary_key funktionierte.

postgresql

  • [postgresql] [bug]

    Die Prüfung auf "disconnect" mit psycopg2/libpq wurde erweitert, um alle verschiedenen "disconnect"-Meldungen innerhalb der gesamten Ausnahmehierarchie zu prüfen. Insbesondere die Meldung "closed the connection unexpectedly" wurde jetzt in mindestens drei verschiedenen Exception-Typen gesehen. Mit freundlicher Genehmigung von Eli Collins.

    Referenzen: #2712

  • [postgresql] [bug]

    Die Operatoren für den PostgreSQL ARRAY-Typ unterstützen Eingabetypen von Sets, Generatoren usw. auch dann, wenn keine Dimension angegeben ist, indem sie das gegebene Iterable bedingungslos in eine Sammlung umwandeln.

    Referenzen: #2681

  • [postgresql] [bug]

    Der fehlende HSTORE-Typ wurde den PostgreSQL-Typnamen hinzugefügt, damit der Typ reflektiert werden kann.

    Referenzen: #2680

mysql

  • [mysql] [bug]

    Korrekturen zur Unterstützung des neuesten cymysql DBAPI, mit freundlicher Genehmigung von Hajime Nakagami.

  • [mysql] [bug]

    Verbesserungen am Betrieb des pymysql-Dialekts unter Python 3, einschließlich wichtiger Dekodierungs-/Bytes-Schritte. Probleme mit BLOB-Typen bleiben aufgrund von Treiberproblemen bestehen. Mit freundlicher Genehmigung von Ben Trofatter.

    Referenzen: #2663

  • [mysql] [bug]

    Eine reguläre Expression wurde aktualisiert, um den Fehlercode auf Google App Engine v1.7.5 und neuer korrekt zu extrahieren. Mit freundlicher Genehmigung von Dan Ring.

mssql

  • [mssql] [bug]

    Teil einer längeren Reihe von Korrekturen für pyodbc+ mssql, ein CAST zu NVARCHAR(max) wurde dem gebundenen Parameter für Tabellen- und Schemanamen in allen Information-Schema-Abfragen hinzugefügt, um das Problem der Vergleiche von NVARCHAR mit NTEXT zu vermeiden, das vom ODBC-Treiber in einigen Fällen, wie z. B. FreeTDS (nur 0.91?) und übergebenen Unicode-gebundenen Parametern, abgelehnt zu werden scheint. Das Problem scheint spezifisch für die SQL Server Information Schema Tabellen zu sein und der Workaround ist harmlos für Fälle, in denen das Problem nicht besteht.

    Referenzen: #2355

  • [mssql] [bug]

    Unterstützung für zusätzliche "disconnect"-Meldungen für den pymssql-Dialekt hinzugefügt. Mit freundlicher Genehmigung von John Anderson.

  • [mssql] [bug]

    Fehler behoben, der Py3K betrifft, bezüglich "binärer" Typen und pymssql. Mit freundlicher Genehmigung von Marc Abramowitz.

    Referenzen: #2683

0.8.0

Veröffentlicht: 9. März 2013

Hinweis

Ab 0.8.0 gibt es einige neue Verhaltensänderungen, die in 0.8.0b2 nicht vorhanden waren. Sie sind in der Migrationsdokumentation wie folgt aufgeführt:

orm

  • [orm] [feature]

    Ein aussagekräftiges Attribut QueryableAttribute.info wird hinzugefügt, das auf das Attribut .info entweder auf dem Column-Objekt, falls direkt vorhanden, oder andernfalls auf dem MapperProperty weitergeleitet wird. Das vollständige Verhalten ist dokumentiert und durch Tests gesichert, um stabil zu bleiben.

    Referenzen: #2675

  • [orm] [feature]

    Das Attribut "cascade" eines relationship()-Konstrukts kann nach dessen Erstellung gesetzt/geändert werden. Dies ist kein Muster für den normalen Gebrauch, aber wir möchten die Einstellung für Demonstrationszwecke in Tutorials ändern.

  • [orm] [feature]

    Neue Hilfsfunktion was_deleted() hinzugefügt, gibt True zurück, wenn das gegebene Objekt Gegenstand eines Session.delete()-Vorgangs war.

    Referenzen: #2658

  • [orm] [feature]

    Das System der Laufzeitinspektion (Runtime Inspection API) wurde erweitert, so dass alle Python-Deskriptoren, die mit ORM oder seinen Erweiterungen verbunden sind, abgerufen werden können. Dies erfüllt die gängige Anforderung, alle QueryableAttribute-Deskriptoren zusätzlich zu Erweiterungstypen wie hybrid_property und AssociationProxy inspizieren zu können. Siehe Mapper.all_orm_descriptors.

  • [orm] [bug]

    Die Prüfung auf einen bestehenden Backref-Namenskonflikt während der Mapper-Konfiguration wurde verbessert; es werden jetzt Namenskonflikte auf Ober- und Unterklassen sowie auf dem aktuellen Mapper geprüft, da diese Konflikte genauso störend sind. Dies ist neu für 0.8, aber siehe unten für eine Warnung, die auch in 0.7.11 ausgelöst wird.

    Referenzen: #2674

  • [orm] [bug]

    Die Fehlermeldung bei der Erkennung einer "Backref-Schleife" wurde verbessert, d.h. wenn ein Ereignis eine bidirektionale Zuweisung zwischen zwei anderen Attributen ohne Ende auslöst. Dieser Zustand kann nicht nur auftreten, wenn ein Objekt des falschen Typs zugewiesen wird, sondern auch, wenn ein Attribut falsch konfiguriert ist, um in ein bestehendes Backref-Paar zurückzuweisen. Ebenfalls in 0.7.11.

    Referenzen: #2674

  • [orm] [bug]

    Eine Warnung wird ausgegeben, wenn einer MapperProperty ein Mapper zugewiesen wird, der eine bestehende Eigenschaft ersetzt, wenn die betreffenden Eigenschaften keine reinen spaltenbasierten Eigenschaften sind. Das Ersetzen von Beziehungs-Eigenschaften ist selten (nie?) beabsichtigt und bezieht sich normalerweise auf eine fehlerhafte Mapper-Konfiguration. Ebenfalls in 0.7.11.

    Referenzen: #2674

  • [orm] [bug]

    Eine klare Fehlermeldung wird ausgegeben, wenn ein Ereignishandler versucht, SQL auf einer Session innerhalb des after_commit()-Handlers auszugeben, wo keine gültige Transaktion aktiv ist.

    Referenzen: #2662

  • [orm] [bug]

    Die Erkennung einer primären Schlüsseländerung während der Kaskadierung einer natürlichen Primärschlüsselaktualisierung gelingt auch dann, wenn der Schlüssel zusammengesetzt ist und nur einige der Attribute geändert wurden.

    Referenzen: #2665

  • [orm] [bug]

    Ein Objekt, das aus einer Session gelöscht wird, wird nach Bestätigung der Transaktion vollständig von dieser Session getrennt, d.h. die Funktion object_session() gibt None zurück.

    Referenzen: #2658

  • [orm] [bug]

    Fehler behoben, bei dem Query.yield_per() die Ausführungsoptionen falsch setzte, wodurch die nachfolgende Verwendung der Methode Query.execution_options() fehlschlug. Mit freundlicher Genehmigung von Ryan Kelly.

    Referenzen: #2661

  • [orm] [bug]

    Die Berücksichtigung des between()-Operators wurde korrigiert, sodass er mit dem neuen System für lokale/entfernte Beziehungen korrekt funktioniert.

    Referenzen: #1768

  • [orm] [bug]

    Die Berücksichtigung eines ausstehenden Objekts als "Waise" wurde so geändert, dass sie dem Verhalten von persistenten Objekten enger entspricht, d.h. das Objekt wird aus der Session gelöscht, sobald es von einem seiner "Waisen"-fähigen Eltern abgetrennt wird. Zuvor wurde das ausstehende Objekt nur gelöscht, wenn es von allen seinen "Waisen"-fähigen Eltern abgetrennt wurde. Das neue Flag legacy_is_orphan wird zu Mapper hinzugefügt, das das alte Verhalten wiederherstellt.

    Siehe die Änderungsnotiz und das Beispiel unter Die Betrachtung eines „ausstehenden“ Objekts als „Waise“ wurde aggressiver gestaltet für eine detaillierte Erläuterung dieser Änderung.

    Referenzen: #2655

  • [orm] [bug]

    Die Methode "@collection.link" für Sammlungen, die jedes Mal ausgelöst wird, wenn die Sammlung mit einem gemappten Objekt verknüpft oder davon getrennt wird, wurde korrigiert (war höchstwahrscheinlich nie in Gebrauch) – der Dekorator wurde nicht getestet oder war funktionsfähig. Die Dekoratormethode heißt jetzt collection.linker(), der Name "link" bleibt jedoch aus Gründen der Abwärtskompatibilität bestehen. Mit freundlicher Genehmigung von Luca Wehrstedt.

    Referenzen: #2653

  • [orm] [bug]

    Einige Korrekturen am System der Erzeugung benutzerdefinierter instrumentierter Sammlungen wurden vorgenommen, hauptsächlich, dass die Verwendung der @collection-Dekoratoren jetzt die __mro__ der gegebenen Klasse berücksichtigt und die Logik der untersten Klassenversion einer bestimmten Sammlungsmethode anwendet. Zuvor war es nicht vorhersehbar, ob bei der Unterklassebildung einer bestehenden instrumentierten Klasse wie MappedCollection benutzerdefinierte Methoden korrekt aufgelöst würden.

    Referenzen: #2654

  • [orm] [bug]

    Potenzieller Speicherleck behoben, der auftreten konnte, wenn eine beliebige Anzahl von sessionmaker-Objekten erstellt wurde. Die vom Sessionmaker erstellte anonyme Unterklasse konnte bei der Dereferenzierung nicht vom Garbage Collector bereinigt werden, da im Paket "event" noch klassenweite Referenzen vorhanden waren. Dieses Problem betrifft auch jedes benutzerdefinierte System, das Ad-hoc-Unterklassen in Verbindung mit einem Event-Dispatcher verwendet hat. Ebenfalls in 0.7.10.

    Referenzen: #2650

  • [orm] [bug]

    Query.merge_result() kann nun Zeilen aus einem Outer Join laden, bei dem eine Entität None sein kann, ohne einen Fehler auszulösen. Ebenfalls in 0.7.10.

    Referenzen: #2640

  • [orm] [bug]

    Korrekturen am "dynamischen" Loader von relationship(), einschließlich der Tatsache, dass Backrefs auch dann ordnungsgemäß funktionieren, wenn Autoflush deaktiviert ist, und dass History-Ereignisse in Szenarien, in denen dasselbe Objekt mehrfach hinzugefügt/entfernt wird, genauer sind.

    Referenzen: #2637

  • [orm] [removed]

    Das undokumentierte (und hoffentlich ungenutzte) System zur Erzeugung benutzerdefinierter Sammlungen mittels einer __instrumentation__-Datenstruktur, die mit der Sammlung verknüpft ist, wurde entfernt, da dies eine komplexe und ungetestete Funktion war, die außerdem im Wesentlichen redundant gegenüber dem Dekorator-Ansatz war. Weitere interne Vereinfachungen im Modul orm.collections wurden ebenfalls vorgenommen.

examples

  • [examples] [bug]

    Eine Regression im Beispiel examples/dogpile_caching behoben, die auf die Änderung in #2614 zurückzuführen war.

sql

  • [sql] [feature]

    Ein neues Argument inherit_schema wurde zu Enum und dessen Basis SchemaType hinzugefügt. Wenn auf True gesetzt, setzt der Typ sein schema-Attribut auf das der Table, der er zugeordnet ist. Dies geschieht auch während einer Table.tometadata()-Operation; der SchemaType wird jetzt in allen Fällen kopiert, wenn Table.tometadata() ausgeführt wird, und wenn inherit_schema=True, übernimmt der Typ den neuen Schemanamen, der der Methode übergeben wird. Das schema ist wichtig, wenn es mit dem PostgreSQL-Backend verwendet wird, da der Typ zu einer CREATE TYPE-Anweisung führt.

    Referenzen: #2657

  • [sql] [feature]

    Index unterstützt nun beliebige SQL-Ausdrücke und/oder Funktionen zusätzlich zu einfachen Spalten. Gängige Modifikatoren sind somecolumn.desc() für einen absteigenden Index und func.lower(somecolumn) für einen case-insensitiven Index, abhängig von den Fähigkeiten des Ziel-Backends.

    Referenzen: #695

  • [sql] [bug]

    Das Verhalten der SELECT-Korrelation wurde verbessert, so dass die Methoden Select.correlate() und Select.correlate_except() sowie ihre ORM-Analoga weiterhin das Verhalten der "Auto-Korrelation" beibehalten, d.h. die FROM-Klausel wird nur geändert, wenn die Ausgabe gültiges SQL ist; das heißt, die FROM-Klausel bleibt unverändert, wenn die korrelierte SELECT nicht im Kontext einer umschließenden SELECT innerhalb der WHERE-, Spalten- oder HAVING-Klausel verwendet wird. Die beiden Methoden spezifizieren nun nur noch Bedingungen für die standardmäßige "Auto-Korrelation" und nicht mehr absolute FROM-Listen.

    Referenzen: #2668

  • [sql] [bug]

    Behob einen Fehler bei Spaltenannotationen, der insbesondere einige Verwendungen der neuen remote() und local() Annotationsfunktionen beeinträchtigen konnte, bei denen Annotationen verloren gehen konnten, wenn die Spalte in einem nachfolgenden Ausdruck verwendet wurde.

    Referenzen: #1768, #2660

  • [sql] [bug]

    Der Operator ColumnOperators.in_() wird nun Werte von None in null() umwandeln.

    Referenzen: #2496

  • [sql] [bug]

    Behob einen Fehler, bei dem Table.tometadata() fehlschlagen würde, wenn eine Column sowohl einen Fremdschlüssel als auch einen alternativen „.key“-Namen für die Spalte hatte. Ebenfalls in 0.7.10.

    Referenzen: #2643

  • [sql] [bug]

    insert().returning() löst einen informativen CompileError aus, wenn versucht wird, ihn auf einem Dialekt zu kompilieren, der RETURNING nicht unterstützt.

    Referenzen: #2629

  • [sql] [bug]

    Das vom Compiler verwendete Symbol „REQUIRED“ zur Identifizierung von INSERT/UPDATE-gebundenen Parametern, die übergeben werden müssen, wurde angepasst, sodass es beim Schreiben von benutzerdefiniertem Bindungsbehandlungscode leichter identifizierbar ist.

    Referenzen: #2648

schema

  • [schema] [bug]

    MetaData.create_all() und MetaData.drop_all() werden nun eine leere Liste als Anweisung zum Nichterstellen/Nichtlöschen von Elementen akzeptieren, anstatt die Sammlung zu ignorieren.

    Referenzen: #2664

postgresql

  • [postgresql] [feature]

    Unterstützung für die traditionelle SUBSTRING-Funktionssyntax von PostgreSQL wurde hinzugefügt, die als „SUBSTRING(x FROM y FOR z)“ gerendert wird, wenn die normale func.substring() verwendet wird. Mit freundlicher Genehmigung von Gunnlaugur Þór Briem.

    Diese Änderung wird auch **zurückportiert** zu: 0.7.11

    Referenzen: #2676

  • [postgresql] [feature]

    Die Methoden Comparator.any() und Comparator.all() sowie eigenständige Ausdruckskonstrukte wurden hinzugefügt. Ein großes Dankeschön geht an Audrius Kažukauskas für die großartige Arbeit hier.

  • [postgresql] [bug]

    Behob einen Fehler im Konstrukt array(), bei dem dessen Verwendung innerhalb eines insert()-Konstrukts einen Fehler bezüglich eines Parameterproblems in der Methode self_group() verursachte.

mysql

  • [mysql] [feature]

    Neuer Dialekt für CyMySQL hinzugefügt, mit freundlicher Genehmigung von Hajime Nakagami.

  • [mysql] [feature]

    Der GAE-Dialekt akzeptiert nun Benutzername/Passwort-Argumente in der URL, mit freundlicher Genehmigung von Owen Nelson.

  • [mysql] [bug] [gae]

    Es wurde ein bedingter Import zum gaerdbms-Dialekt hinzugefügt, der versucht, rdbms_apiproxy vs. rdbms_googleapi zu importieren, um sowohl auf Dev- als auch auf Produktionsplattformen zu funktionieren. Berücksichtigt nun auch das Attribut instance. Mit freundlicher Genehmigung von Sean Lynch. Ebenfalls in 0.7.10.

    Referenzen: #2649

  • [mysql] [bug]

    Der GAE-Dialekt schlägt bei None-Übereinstimmungen nicht fehl, wenn der Fehlercode nicht aus dem Ausnahme-Throw extrahiert werden kann; mit freundlicher Genehmigung von Owen Nelson.

mssql

  • [mssql] [feature]

    Die Optionen mssql_include und mssql_clustered wurden zu Index hinzugefügt, die die Schlüsselwörter INCLUDE und CLUSTERED rendern. Mit freundlicher Genehmigung von Derek Harland.

  • [mssql] [feature]

    Die DDL für IDENTITY-Spalten wird nun auch für Nicht-Primärschlüsselspalten unterstützt, indem ein Sequence-Konstrukt für jede Ganzzahlspalte erstellt wird. Mit freundlicher Genehmigung von Derek Harland.

    Referenzen: #2644

  • [mssql] [bug]

    Es wurde eine py3K-bedingte Bedingung um den unnötigen .decode()-Aufruf im MSSQL-Information-Schema hinzugefügt, was die Reflexion in Py3K behebt. Ebenfalls in 0.7.10.

    Referenzen: #2638

  • [mssql] [bug]

    Behob eine Regression, bei der der Parameter „collation“ der Zeichentypen CHAR, NCHAR usw. nicht mehr funktionierte, da „collation“ nun von den Basiszeichentypen unterstützt wird. Die Typen TEXT, NCHAR, CHAR, VARCHAR im MSSQL-Dialekt sind nun Synonyme für die Basistypen.

oracle

  • [oracle] [bug]

    Der cx_oracle-Dialekt wird die Bindungsparameternamen nicht mehr durch encode() laufen lassen, da dies unter Python 3 nicht zulässig ist und die korrekte Funktion von Anweisungen unter Python 3 verhinderte. Wir kodieren nun nur noch, wenn supports_unicode_binds falsch ist, was bei cx_oracle nicht der Fall ist, wenn mindestens Version 5 von cx_oracle verwendet wird.

tests

  • [tests] [bug]

    Behob einen Import von „logging“ in test_execute, der auf einigen Linux-Plattformen nicht funktionierte. Ebenfalls in 0.7.11.

    Referenzen: #2669

0.8.0b2

Veröffentlicht: 14. Dezember 2012

orm

  • [orm] [feature]

    Die Klassen KeyedTuple._asdict() und KeyedTuple._fields wurden zur Klasse KeyedTuple hinzugefügt, um ein gewisses Maß an Kompatibilität mit der collections.namedtuple() aus der Python-Standardbibliothek zu bieten.

    Referenzen: #2601

  • [orm] [feature]

    Synonyme können nun bei der Definition von Primär- und Sekundärjoins für Beziehungen verwendet werden.

  • [orm] [bug]

    Die Methode Query.select_from() kann nun mit einem aliased()-Konstrukt verwendet werden, ohne die ausgewählten Entitäten zu beeinträchtigen. Grundsätzlich behält eine Anweisung wie diese

    ua = aliased(User)
    session.query(User.name).select_from(ua).join(User, User.name > ua.name)

    Der Spaltenabschnitt des SELECT wird wie angegeben aus dem nicht-aliasierten „user“ stammen; das select_from findet nur in der FROM-Klausel statt.

    SELECT users.name AS users_name FROM users AS users_1
    JOIN users ON users.name < users_1.name

    Beachten Sie, dass dieses Verhalten im Gegensatz zum ursprünglichen, älteren Anwendungsfall für Query.select_from() steht, nämlich der Neudefinition der abgebildeten Entität in Bezug auf ein anderes auswählbares Objekt.

    session.query(User.name).select_from(user_table.select().where(user_table.c.id > 5))

    Was erzeugt

    SELECT anon_1.name AS anon_1_name FROM (SELECT users.id AS id,
    users.name AS name FROM users WHERE users.id > :id_1) AS anon_1

    Es war das „Aliasing“-Verhalten des letzteren Anwendungsfalls, das den ersteren Anwendungsfall beeinträchtigte. Die Methode betrachtet nun ausdrücklich einen SQL-Ausdruck wie select() oder alias() getrennt von einer abgebildeten Entität wie einem aliased()-Konstrukt.

    Referenzen: #2635

  • [orm] [bug]

    Der Typ MutableComposite erlaubte nicht die Verwendung der Methode MutableBase.coerce(), obwohl der Code diese Absicht anzuzeigen schien. Dies funktioniert nun und ein kurzes Beispiel wurde hinzugefügt. Als Nebeneffekt wurden die Mechanismen dieses Ereignis-Handlers geändert, sodass neue MutableComposite-Typen keine globalen Ereignis-Handler mehr pro Typ hinzufügen. Ebenfalls in 0.7.10.

    Referenzen: #2624

  • [orm] [bug]

    Eine zweite Überarbeitung der Aliasing-/internen Pfadmechanismen erlaubt nun, dass zwei Unterklassen unterschiedliche Beziehungen desselben Namens haben, unterstützt durch Subquery- oder Joined-Eager-Laden beider gleichzeitig, wenn ein vollständiges polymorphes Laden verwendet wird.

    Referenzen: #2614

  • [orm] [bug]

    Behob einen Fehler, bei dem eine Multi-Hop-Subqueryload innerhalb eines bestimmten with_polymorphic-Ladens einen KeyError auslöste. Nutzt die gleiche interne Pfadüberarbeitung wie #2614.

    Referenzen: #2617

  • [orm] [bug]

    Behob eine Regression, bei der query.update() einen Fehler auslöste, wenn ein Objekt, das von der Synchronisierungsstrategie „fetch“ abgeglichen wurde, lokal nicht vorhanden war. Mit freundlicher Genehmigung von Scott Torborg.

    Referenzen: #2602

orm extensions

engine

  • [engine] [feature]

    Die Methoden Connection.connect() und Connection.contextual_connect() geben nun eine „verzweigte“ Version zurück, sodass die Methode Connection.close() auf der zurückgegebenen Verbindung aufgerufen werden kann, ohne die ursprüngliche zu beeinträchtigen. Ermöglicht Symmetrie bei der Verwendung von Engine und Connection als Kontextmanager.

    with conn.connect() as c:  # leaves the Connection open
        c.execute("...")
    
    with engine.connect() as c:  # closes the Connection
        c.execute("...")

  • [engine] [bug]

    Behob den Fehler, dass MetaData.reflect() die gegebene Connection korrekt verwendete, wenn diese angegeben war, ohne eine zweite Verbindung von der Engine dieser Verbindung zu öffnen.

    Diese Änderung wird auch auf 0.7.10 **zurückportiert**.

    Referenzen: #2604

  • [engine]

    Das Argument „reflect=True“ für MetaData ist veraltet. Bitte verwenden Sie die Methode MetaData.reflect().

sql

  • [sql] [feature]

    Das Konstrukt Insert unterstützt nun Mehrfachwerteinfügungen, d.h. einen INSERT, der wie folgt gerendert wird: „INSERT INTO table VALUES (…), (…), …“. Unterstützt von PostgreSQL, SQLite und MySQL. Ein großes Dankeschön an Idan Kamara für die Vorarbeit hierfür.

    Referenzen: #2623

  • [sql] [bug]

    Behob einen Fehler, bei dem die Verwendung von server_onupdate=<FetchedValue|DefaultClause> ohne Übergabe des Flags „for_update=True“ das Standardobjekt auf server_default anwenden würde, wodurch alles, was dort vorhanden war, überschrieben würde. Das explizite Argument for_update=True sollte bei dieser Verwendung nicht benötigt werden (insbesondere da die Dokumentation ein Beispiel ohne seine Verwendung zeigt), daher wird es nun intern mithilfe einer Kopie des gegebenen Standardobjekts arrangiert, wenn das Flag nicht auf das korrespondierende Argument gesetzt ist.

    Diese Änderung wird auch auf 0.7.10 **zurückportiert**.

    Referenzen: #2631

  • [sql] [bug]

    Behob eine Regression, die durch #2410 verursacht wurde, bei der sich eine CheckConstraint während einer Table.tometadata()-Operation wieder auf die ursprüngliche Tabelle anwandte, da sie den SQL-Ausdruck für eine übergeordnete Tabelle parsen würde. Die Operation kopiert nun den gegebenen Ausdruck, um ihn an die neue Tabelle anzupassen.

    Referenzen: #2633

  • [sql] [bug]

    Behob einen Fehler, bei dem die Verwendung von label_length bei einem Dialekt, der kleiner war als die Größe der tatsächlichen Spaltenkennungen, dazu führte, dass die Spalten in einer SELECT-Anweisung nicht korrekt gerendert wurden.

    Referenzen: #2610

  • [sql] [bug]

    Der Typ DECIMAL berücksichtigt nun die Argumente „precision“ und „scale“ bei der Rendern von DDL.

    Referenzen: #2618

  • [sql] [bug]

    Es wurde eine Anpassung an der „boolean“- (d.h. __nonzero__) Auswertung von binären Ausdrücken, d.h. x1 == x2, vorgenommen, sodass die von BinaryExpression in einigen Fällen angewandte „Auto-Gruppierung“ dieser Vergleich nicht beeinträchtigt. Zuvor würde ein Ausdruck wie

    expr1 = mycolumn > 2
    bool(expr1 == expr1)

    Würde als False ausgewertet, obwohl dies ein Identitätsvergleich ist, da mycolumn > 2 gruppiert würde, bevor er in den BinaryExpression eingefügt wird, wodurch seine Identität geändert wird. BinaryExpression merkt sich nun die „ursprünglichen“ übergebenen Objekte. Zusätzlich gibt die Methode __nonzero__ nun nur noch zurück, wenn der Operator == oder != ist – alle anderen lösen TypeError aus.

    Referenzen: #2621

  • [sql] [bug]

    Behob ein Problem, bei dem das versehentliche Aufrufen von list() auf einem ColumnElement in eine Endlosschleife geriet, wenn ColumnOperators.__getitem__() implementiert wäre. Ein neues NotImplementedError wird über __iter__() ausgegeben.

  • [sql] [bug]

    Behob einen Fehler bei type_coerce(), bei dem Typinformationen verloren gehen konnten, wenn die Anweisung als Subquery innerhalb einer anderen Anweisung verwendet wurde, sowie andere ähnliche Situationen. Unter anderem gingen Typinformationen verloren, wenn die Oracle/mssql-Dialekte Limit/Offset-Wrappings anwendeten.

    Referenzen: #2603

  • [sql] [bug]

    Behob einen Fehler, bei dem der „.key“ einer Spalte nicht verwendet wurde, wenn ein „Proxy“ der Spalte gegen ein auswählbares Objekt erzeugt wurde. Dies trat wahrscheinlich nicht in 0.7 auf, da 0.7 den „.key“ in einem größeren Bereich von Szenarien nicht berücksichtigt.

    Referenzen: #2597

postgresql

  • [postgresql] [feature]

    HSTORE ist nun im PostgreSQL-Dialekt verfügbar. Wird auch die Erweiterungen von psycopg2 verwenden, falls verfügbar. Mit freundlicher Genehmigung von Audrius Kažukauskas.

    Referenzen: #2606

sqlite

  • [sqlite] [bug]

    Weitere Anpassungen an diesem SQLite-bezogenen Problem, das in 0.7.9 veröffentlicht wurde, um Legacy-SQLite-Anführungszeichen beim Reflektieren von Fremdschlüsseln abzufangen. Zusätzlich zum Abfangen von doppelten Anführungszeichen werden nun auch andere Anführungszeichen wie Klammern, Backticks und einfache Anführungszeichen abgefangen.

    Diese Änderung wird auch auf 0.7.10 **zurückportiert**.

    Referenzen: #2568

mssql

  • [mssql] [feature]

    Unterstützung für die Reflexion des „Namens“ von Primärschlüssel-Constraints wurde hinzugefügt, mit freundlicher Genehmigung von Dave Moore.

    Referenzen: #2600

  • [mssql] [bug]

    Behob einen Fehler, bei dem die Verwendung von „key“ mit Column in Verbindung mit „schema“ für die besitzende Tabelle dazu führte, dass Ergebniszeilen nicht gefunden wurden, da die „Schema-Rendering“-Logik des MSSQL-Dialekts .key nicht berücksichtigte.

    Diese Änderung wird auch auf 0.7.10 **zurückportiert**.

oracle

  • [oracle] [bug]

    Behob die Tabellenreflexion für Oracle beim Zugriff auf ein Synonym, das auf eine DBLINK-Remote-Datenbank verweist; obwohl die Syntax seit einiger Zeit im Oracle-Dialekt vorhanden ist, wurde sie bisher nie getestet. Die Syntax wurde gegen eine Beispieldatenbank getestet, die mit sich selbst verknüpft ist, es besteht jedoch weiterhin Unsicherheit darüber, was für den „Besitzer“ bei der Abfrage der Remote-Datenbank nach Tabelleninformationen verwendet werden soll. Derzeit wird der Wert von „username“ aus user_db_links verwendet, um den „owner“ abzugleichen.

    Referenzen: #2619

  • [oracle] [bug]

    Der Oracle LONG-Typ ist zwar ein unbegrenzter Texttyp, scheint aber den cx_Oracle.LOB-Typ nicht zu verwenden, wenn Ergebniszeilen zurückgegeben werden. Daher wurde der Dialekt repariert, um LONG von der Anwendung der cx_Oracle.LOB-Filterung auszuschließen. Ebenfalls in 0.7.10.

    Referenzen: #2620

  • [oracle] [bug]

    Reparierte die Verwendung von .prepare() in Verbindung mit cx_Oracle, sodass ein Rückgabewert von False nicht zum Aufruf von connection.commit() führt und somit „no transaction“-Fehler vermieden werden. Zweiphasentransaktionen haben sich nun rudimentär mit SQLAlchemy und cx_oracle als funktionierend erwiesen, unterliegen jedoch den bekannten Einschränkungen des Treibers; weitere Einzelheiten finden Sie in der Dokumentation. Ebenfalls in 0.7.10.

    Referenzen: #2611

misc

  • [feature] [sybase]

    Reflexionsunterstützung wurde dem Sybase-Dialekt hinzugefügt. Ein großes Dankeschön an Ben Trofatter für die gesamte Arbeit bei der Entwicklung und dem Testen.

    Referenzen: #1753

  • [feature] [pool]

    Der Pool wird nun alle connection.close()-Operationen protokollieren, einschließlich Schließungen von ungültigen Verbindungen, getrennten Verbindungen und Verbindungen über der Poolkapazität.

  • [feature] [pool]

    Der Pool konsultiert nun den Dialect für Funktionalität bezüglich dessen, wie die Verbindung „automatisch zurückgerollt“ und geschlossen werden soll. Dies gibt dem Dialekt mehr Kontrolle über den Transaktionsumfang, sodass wir Transaktions-Workarounds besser implementieren können, wie sie möglicherweise für pysqlite und cx_oracle benötigt werden.

    Referenzen: #2611

  • [feature] [pool]

    Neuer PoolEvents.reset() Hook wurde hinzugefügt, um das Ereignis abzufangen, bevor eine Verbindung beim Zurückkehren in den Pool automatisch zurückgerollt wird. Zusammen mit ConnectionEvents.rollback() können so alle Rollback-Ereignisse abgefangen werden.

  • [bug] [firebird]

    Fehlender Import für „fdb“ zum experimentellen „firebird+fdb“-Dialekt wurde hinzugefügt.

    Referenzen: #2622

  • [informix]

    Einige unnötige Teile bezüglich der Informix-Transaktionsbehandlung wurden entfernt, einschließlich einer Funktion, die das Aufrufen von commit()/rollback() übersprang, sowie einige hartkodierte Annahmen über das Isolationsniveau bei begin(). Der Status dieses Dialekts ist nicht gut verstanden, da wir keine Benutzer haben, die damit arbeiten, und auch keinen Zugriff auf eine Informix-Datenbank haben. Wenn jemand mit Informix-Zugriff diesen Dialekt testen möchte, bitte lassen Sie es uns wissen.

0.8.0b1

Veröffentlicht: 30. Oktober 2012

general

  • [general] [removed]

    Das Synonym „sqlalchemy.exceptions“ für „sqlalchemy.exc“ wird vollständig entfernt.

    Referenzen: #2433

  • [general]

    SQLAlchemy 0.8 zielt nun auf Python 2.5 und höher ab. Python 2.4 wird nicht mehr unterstützt.

orm

  • [orm] [feature]

    Umfangreiche Überarbeitung der Beziehung()-Interna erlaubt nun Join-Bedingungen, die Spalten enthalten, die auf sich selbst in zusammengesetzten Fremdschlüsseln verweisen. Eine neue API für sehr spezialisierte primaryjoin-Bedingungen wird hinzugefügt, die Bedingungen basierend auf SQL-Funktionen, CAST usw. ermöglicht, indem die Annotationsfunktionen remote() und foreign() bei Bedarf inline innerhalb des Ausdrucks platziert werden. Frühere Rezepte, die den semi-privaten _local_remote_pairs-Ansatz verwendeten, können auf diesen neuen Ansatz aufgerüstet werden.

    Referenzen: #1401

  • [orm] [feature]

    Die neue eigenständige Funktion with_polymorphic() bietet die Funktionalität von query.with_polymorphic() in eigenständiger Form. Sie kann auf jede Entität innerhalb einer Abfrage angewendet werden, auch als Ziel eines Joins anstelle des „of_type()“-Modifikators.

    Referenzen: #2333

  • [orm] [feature]

    Das of_type()-Konstrukt für Attribute akzeptiert nun aliased()-Klassenkonstrukte sowie with_polymorphic-Konstrukte und funktioniert mit query.join(), any(), has() sowie mit den Eager-Loadern subqueryload(), joinedload(), contains_eager()

    Referenzen: #1106, #2438

  • [orm] [feature]

    Verbesserungen beim Event-Listening für abgebildete Klassen ermöglichen, dass nicht abgebildete Klassen für Instanz- und Mapper-Events angegeben werden können. Die eingerichteten Events werden automatisch auf Unterklassen dieser Klasse gesetzt, wenn das propagate=True-Flag übergeben wird, und die Events werden für die Klasse selbst gesetzt, wenn sie schließlich abgebildet wird.

    Referenzen: #2585

  • [orm] [feature]

    Das System für „Deferred Declarative Reflection“ wurde in die deklarative Erweiterung selbst verschoben und verwendet die neue Klasse DeferredReflection. Diese Klasse wird nun mit Single- und Joined-Table-Inheritance-Anwendungsfällen getestet.

    Referenzen: #2485

  • [orm] [feature]

    Neue Kernfunktion „inspect()“ hinzugefügt, die als generisches Gateway für Introspektion in Mappern, Objekten, etc. dient. Die Objekte Mapper und InstanceState wurden mit einer öffentlichen API erweitert, die die Inspektion von gemappten Attributen ermöglicht, einschließlich Filter für spaltengebundene oder beziehungsgebundene Eigenschaften, Inspektion des aktuellen Objektzustands, Historie von Attributen usw.

    Referenzen: #2208

  • [orm] [feature]

    Das Aufrufen von rollback() innerhalb von session.begin_nested() wird nun nur noch die Objekte ablaufen lassen, die innerhalb des Geltungsbereichs dieser Transaktion Nettoänderungen hatten, d.h. Objekte, die dirty waren oder bei einem Flush geändert wurden. Dies ermöglicht den typischen Anwendungsfall für begin_nested(), nämlich die Änderung einer kleinen Teilmenge von Objekten, wobei die Daten des größeren umschließenden Satzes von Objekten, die in dieser Subtransaktion nicht geändert wurden, unverändert bleiben.

    Referenzen: #2452

  • [orm] [feature]

    Hilfsfunktion Session.enable_relationship_loading() hinzugefügt, ersetzt relationship.load_on_pending. Beide Funktionen sollten jedoch vermieden werden.

    Referenzen: #2372

  • [orm] [feature]

    Unterstützung für das .info Dictionary-Argument zu column_property(), relationship(), composite() hinzugefügt. Alle MapperProperty-Klassen haben ein automatisch erstelltes .info Dictionary zur Verfügung.

  • [orm] [feature]

    Das Hinzufügen/Entfernen von None aus einer gemappten Collection generiert nun Attributereignisse. Zuvor wurde ein None-Append in einigen Fällen ignoriert. Verwandt mit.

    Referenzen: #2229

  • [orm] [feature]

    Die Anwesenheit von None in einer gemappten Collection löst nun einen Fehler während des Flushes aus. Zuvor wurden None-Werte in Collections stillschweigend ignoriert.

    Referenzen: #2229

  • [orm] [feature]

    Die Methode Query.update() ist nun nachsichtiger bezüglich der zu aktualisierenden Tabelle. Reine Tabellenobjekte werden nun besser unterstützt und eine zusätzliche Joined-Inheritance-Unterklasse kann mit update() verwendet werden; die Unterklassentabelle wird das Ziel des Updates sein, und wenn die übergeordnete Tabelle in der WHERE-Klausel referenziert wird, ruft der Compiler die UPDATE..FROM-Syntax auf, wie sie vom Dialekt erlaubt wird, um die WHERE-Klausel zu erfüllen. Die Multi-Table-Update-Funktion von MySQL wird ebenfalls unterstützt, wenn Spalten nach Objekt im "values"-Dictionary angegeben werden. PG's DELETE..USING ist in Core noch nicht verfügbar.

  • [orm] [feature]

    Neue Session-Events after_transaction_create und after_transaction_end ermöglichen die Verfolgung neuer SessionTransaction-Objekte. Wenn das Objekt inspiziert wird, kann es verwendet werden, um zu bestimmen, wann eine Session zum ersten Mal aktiv wird und wann sie deaktiviert wird.

  • [orm] [feature]

    Die Query kann nun Entity-/Skalar-gemischte "Tuple"-Zeilen laden, die Typen enthalten, die nicht hashbar sind, indem das Flag "hashable=False" auf dem entsprechenden verwendeten TypeEngine-Objekt gesetzt wird. Benutzerdefinierte Typen, die unhashbare Typen (typischerweise Listen) zurückgeben, können dieses Flag auf False setzen.

    Referenzen: #2592

  • [orm] [feature]

    Query "korreliert" nun standardmäßig automatisch, ähnlich wie select(). Zuvor erforderte eine Query, die als Unterabfrage in einer anderen verwendet wurde, dass die Methode correlate() explizit aufgerufen wurde, um eine Tabelle auf der Innenseite mit der Außenseite zu korrelieren. Wie immer deaktiviert correlate(None) die Korrelation.

    Referenzen: #2179

  • [orm] [feature]

    Das after_attach-Ereignis wird nun nach der Etablierung des Objekts in Session.new oder Session.identity_map bei Session.add(), Session.merge() usw. ausgelöst, damit das Objekt in diesen Sammlungen repräsentiert wird, wenn das Ereignis aufgerufen wird. Das before_attach-Ereignis wurde hinzugefügt, um Anwendungsfälle zu ermöglichen, die autoflush mit vorab angehängtem Objekt benötigen.

    Referenzen: #2464

  • [orm] [feature]

    Die Session gibt Warnungen aus, wenn nicht unterstützte Methoden im "execute"-Teil des Flushes verwendet werden. Dies sind die bekannten Methoden add(), delete() usw. sowie Sammlungs- und verwandte Objektmanipulationen, die innerhalb von Mapper-Level-Flush-Events wie after_insert(), after_update() usw. aufgerufen werden. Es ist seit langem prominent dokumentiert, dass SQLAlchemy keine Ergebnisse garantieren kann, wenn die Session innerhalb der Ausführung des Flush-Plans manipuliert wird, aber Benutzer tun dies immer noch, also gibt es jetzt eine Warnung. Vielleicht wird die Session eines Tages erweitert, um diese Operationen innerhalb des Flushes zu unterstützen, aber vorerst können die Ergebnisse nicht garantiert werden.

  • [orm] [feature]

    ORM-Entitäten können nun an das Kernkonstrukt select() sowie an die Methoden select_from(), correlate() und correlate_except() von select() übergeben werden, wo sie in wählbare Elemente "entpackt" werden.

    Referenzen: #2245

  • [orm] [feature]

    Einige Unterstützung für die automatische Wiedergabe einer Beziehungs-JOIN-Bedingung basierend auf dem gemappten Attribut, mit Verwendung von Core SQL-Konstrukten. Z.B. select([SomeClass]).where(SomeClass.somerelationship) würde SELECT von "someclass" rendern und die primaryjoin von "somerelationship" als WHERE-Klausel verwenden. Dies ändert die frühere Bedeutung von "SomeClass.somerelationship" im Core SQL-Kontext; zuvor würde es sich zum übergeordneten wählbaren Element "auflösen", was im Allgemeinen nicht nützlich war. Funktioniert auch mit query.filter(). Verwandt mit.

    Referenzen: #2245

  • [orm] [feature]

    Das Registry von Klassen in declarative_base() ist nun ein WeakValueDictionary. Daher werden Unterklassen von "Base", die dereferenziert werden, garbage collected, *wenn sie nicht von anderen Mapper/Superklassen-Mapper referenziert werden*. Siehe die nächste Notiz für dieses Ticket.

    Referenzen: #2526

  • [orm] [feature]

    Konflikte zwischen Spalten bei Single-Inheritance-Deklarations-Unterklassen, mit oder ohne Verwendung eines Mixins, können mit einer neuen @declared_attr-Nutzung gelöst werden, wie in der Dokumentation beschrieben.

    Referenzen: #2472

  • [orm] [feature]

    declared_attr kann nun auch auf Nicht-Mixin-Klassen angewendet werden, obwohl dies im Allgemeinen nur für die Auflösung von Spaltenkonflikten bei Single-Inheritance-Unterklassen nützlich ist.

    Referenzen: #2472

  • [orm] [feature]

    declared_attr kann nun mit Attributen verwendet werden, die keine Column oder MapperProperty sind; einschließlich beliebiger benutzerdefinierter Werte sowie Association Proxy-Objekte.

    Referenzen: #2517

  • [orm] [feature]

    Eine *sehr begrenzte* Unterstützung für das Erben von Mappern, die GC'ed werden, wenn die Klasse selbst dereferenziert wird. Der Mapper darf keine eigene Tabelle haben (d.h. nur Single-Table-Inh.) ohne polymorphe Attribute. Dies ermöglicht den Anwendungsfall, eine temporäre Unterklasse einer deklarativ zugeordneten Klasse zu erstellen, ohne eigene Tabelle oder Mapping-Direktiven, um beim Dereferenzieren durch einen Unit-Test garbage collected zu werden.

    Referenzen: #2526

  • [orm] [feature]

    Declarative pflegt nun eine Registry von Klassen nach String-Namen sowie nach vollständig Modul-qualifiziertem Namen. Mehrere Klassen mit demselben Namen können nun basierend auf einem Modul-qualifizierten String innerhalb von relationship() nachgeschlagen werden. Einfache Klassenname-Lookups, bei denen mehr als eine Klasse denselben Namen hat, lösen nun eine informative Fehlermeldung aus.

    Referenzen: #2338

  • [orm] [feature]

    Können nun klassenbezogene Attribute bereitstellen, die Spalten überschreiben, welche von einem beliebigen Nicht-ORM-Typ sind, nicht nur Deskriptoren.

    Referenzen: #2535

  • [orm] [feature]

    Die Schlüsselwörter with_labels und reduce_columns wurden zu Query.subquery() hinzugefügt, um zwei alternative Strategien für die Erzeugung von Abfragen mit eindeutig benannten Spalten bereitzustellen. .

    Referenzen: #1729

  • [orm] [feature]

    Eine Warnung wird ausgegeben, wenn eine Referenz auf eine instrumentierte Sammlung nicht mehr mit der übergeordneten Klasse verbunden ist (aufgrund von Ablauf/Attributaktualisierung/Sammlungsersetzung), aber eine Anfüge- oder Entfernungsoperation auf der nun getrennten Sammlung empfangen wird.

    Referenzen: #2476

  • [orm] [bug]

    ORM wird zusätzliche Anstrengungen unternehmen, um festzustellen, dass eine FK-Abhängigkeit zwischen zwei Tabellen während des Flushes nicht signifikant ist, wenn die Tabellen über Joined Inheritance verknüpft sind und die FK-Abhängigkeit nicht Teil der inherit_condition ist, spart dem Benutzer eine use_alter-Direktive.

    Referenzen: #2527

  • [orm] [bug]

    Die Instrumentierungsereignisse class_instrument(), class_uninstrument() und attribute_instrument() werden nun nur noch für Nachfahrenklassen der Klasse ausgelöst, der zugeordnet wurde, um zuzuhören(). Zuvor würde ein Ereignis-Listener zugewiesen, um auf alle Klassen in allen Fällen zu hören, unabhängig vom übergebenen "target"-Argument.

    Referenzen: #2590

  • [orm] [bug]

    with_polymorphic() erzeugt JOINs in der richtigen Reihenfolge und mit den richtigen erbenden Tabellen, wenn mehrstufige Unterklassen in beliebiger Reihenfolge oder mit fehlenden Zwischenklassen gesendet werden.

    Referenzen: #1900

  • [orm] [bug]

    Verbesserungen bei Joined/Subquery Eager Loading, die Ketten von Unterklassen-Entitäten behandeln, die eine gemeinsame Basis teilen, ohne eine spezifische "Join-Tiefe" anzugeben. Wird jede Unterklassen-Mapper individuell erweitern, bevor ein "Zyklus" erkannt wird, anstatt die Basisklasse als Quelle des "Zyklus" zu betrachten.

    Referenzen: #2481

  • [orm] [bug]

    Das "passive"-Flag von Session.is_modified() hat keine Auswirkungen mehr. is_modified() betrachtet in allen Fällen nur lokale In-Memory-Änderungsflags und löst keine SQL-Anweisungen aus oder ruft Loader-Callables/Initialisierer auf.

    Referenzen: #2320

  • [orm] [bug]

    Die Warnung, die bei der Verwendung des delete-orphan-Cascades mit One-to-Many oder Many-to-Many ohne single-parent=True ausgegeben wurde, ist nun ein Fehler. Der ORM würde ohnehin nach dieser Warnung nicht mehr funktionieren.

    Referenzen: #2405

  • [orm] [bug]

    Lazy Loads, die innerhalb von Flush-Events wie before_flush(), before_update() usw. ausgelöst werden, funktionieren nun wie im Nicht-Event-Code, in Bezug auf die Berücksichtigung der PK/FK-Werte, die in der Lazy-Emitted-Abfrage verwendet werden. Zuvor wurden spezielle Flags gesetzt, die dazu führten, dass Lazy Loads verwandte Elemente basierend auf dem "vorherigen" Wert der übergeordneten PK/FK-Werte luden, speziell wenn sie innerhalb eines Flushes aufgerufen wurden; das Signal zum Laden auf diese Weise ist nun dort lokalisiert, wo die Arbeitseinheit diese Art von Laden tatsächlich benötigt. Beachten Sie, dass die UOW manchmal diese Sammlungen lädt, bevor das before_update()-Ereignis aufgerufen wird, sodass die Verwendung von "passive_updates" oder nicht beeinflussen kann, ob eine Sammlung die "alten" oder "neuen" Daten darstellt, wenn sie innerhalb eines Flush-Events zugegriffen wird, basierend darauf, wann der Lazy Load ausgelöst wurde. Die Änderung ist rückwärtskompatibel in der äußerst geringen Chance, dass benutzerdefinierter Ereigniscode vom alten Verhalten abhing.

    Referenzen: #2350

  • [orm] [bug]

    Weiterhin bezüglich zusätzlichem Zustand nach dem Flush aufgrund von Event-Listenern; alle Zustände, die aus Attributsicht als "dirty" markiert sind, normalerweise über Column-Attribute-Set-Events innerhalb von after_insert(), after_update() usw., erhalten das "history"-Flag in allen Fällen zurückgesetzt, anstatt nur bei denen, die Teil des Flushes waren. Dies hat zur Folge, dass dieser "dirty" Zustand nicht nach dem Flush übernommen wird und keine UPDATE-Anweisungen erzeugt. Eine Warnung wird diesbezüglich ausgegeben; die Methode set_committed_state() kann verwendet werden, um Attribute auf Objekten zuzuweisen, ohne Historienereignisse zu erzeugen.

    Referenzen: #2566, #2582

  • [orm] [bug]

    Ein Disconnect, der sich langsam zwischen einer @declared_attr Column und einer direkt definierten Column auf einem Mixin entwickelt hatte, wurde behoben. In beiden Fällen wird die Column auf die Tabelle der deklarierten Klasse angewendet, nicht aber auf die einer Joined-Inheritance-Unterklasse. Zuvor wurde die direkt definierte Column sowohl auf die Basis- als auch auf die Untertabelle platziert, was typischerweise nicht erwünscht ist.

    Referenzen: #2565

  • [orm] [bug]

    Declarative kann nun eine auf einer Single-Table-Inheritance-Unterklasse deklarierte Spalte bis zur Tabelle der übergeordneten Klasse weiterleiten, wenn die übergeordnete Klasse selbst auf ein join() oder select() Statement abgebildet ist, direkt oder über Joined Inheritance, und nicht nur auf eine Table.

    Referenzen: #2549

  • [orm] [bug]

    Ein Fehler wird ausgegeben, wenn uselist=False mit einem "dynamischen" Loader kombiniert wird. Dies ist in 0.7.9 eine Warnung.

  • [orm] [removed]

    Das Legacy-"mutable"-System des ORM, einschließlich der MutableType-Klasse sowie des mutable=True-Flags auf PickleType und postgresql.ARRAY, wurde entfernt. In-Place-Mutationen werden vom ORM mit der Erweiterung sqlalchemy.ext.mutable erkannt, die in 0.7 eingeführt wurde. Die Entfernung von MutableType und zugehörigen Konstrukten entfernt eine große Menge an Komplexität aus den internen Abläufen von SQLAlchemy. Der Ansatz funktionierte schlecht, da er bei Verwendung einen Scan des gesamten Inhalts der Session verursachte.

    Referenzen: #2442

  • [orm] [removed]

    Veraltete Bezeichner entfernt

    • allow_null_pks mapper()-Argument (verwenden Sie allow_partial_pks)

    • _get_col_to_prop() mapper-Methode (verwenden Sie get_property_by_column())

    • dont_load-Argument für Session.merge() (verwenden Sie load=True)

    • sqlalchemy.orm.shard-Modul (verwenden Sie sqlalchemy.ext.horizontal_shard)

  • [orm] [moved]

    Die InstrumentationManager-Schnittstelle und das gesamte zugehörige System alternativer Klassenimplementierungen wurden nach sqlalchemy.ext.instrumentation verschoben. Dies ist ein selten genutztes System, das den Mechanismus der Klasseninstrumentierung erheblich verkompliziert und verteuert. Die neue Architektur ermöglicht es, dass es ungenutzt bleibt, bis InstrumentationManager tatsächlich importiert wird, woraufhin es in den Kern integriert wird.

examples

  • [examples]

    Das Beaker Caching-Beispiel wurde auf die Verwendung von dogpile.cache umgestellt. Dies ist eine neue Caching-Bibliothek, die vom selben Erfinder der Beaker Caching-Interna geschrieben wurde und ein stark verbessertes, vereinfachtes und modernisiertes Caching-System darstellt.

    Siehe auch

    Dogpile Caching

    Referenzen: #2589

engine

  • [engine] [feature]

    Connection-Ereignis-Listener können nun individuellen Connection-Objekten zugeordnet werden, nicht nur Engine-Objekten.

    Referenzen: #2511

  • [engine] [feature]

    Das before_cursor_execute-Ereignis wird für sogenannte "_cursor_execute"-Ereignisse ausgelöst, die normalerweise spezielle Ausführungen von primärschlüsselgebundenen Sequenzen und Standardgenerierungs-SQL-Phrasen sind, die separat aufgerufen werden, wenn RETURNING nicht mit INSERT verwendet wird.

    Referenzen: #2459

  • [engine] [feature]

    Die von der Testsuite verwendeten Bibliotheken wurden etwas verschoben, sodass sie wieder Teil der SQLAlchemy-Installation sind. Zusätzlich gibt es eine neue Suite von Tests im neuen Paket sqlalchemy.testing.suite. Dies ist ein System in der Entwicklung, das darauf abzielt, eine universelle Testsuite für externe Dialekte bereitzustellen. Externe Dialekte können das neue Test-Fixture als Framework für ihre eigenen Tests verwenden und erhalten kostenlos eine "Compliance"-Suite von Dialekt-spezifischen Tests, einschließlich eines verbesserten "Requirements"-Systems, bei dem spezifische Fähigkeiten und Funktionen zum Testen aktiviert oder deaktiviert werden können.

  • [engine] [feature]

    Ein neues System zur Registrierung von neuen Dialekten im Prozess ohne Verwendung eines Entrypoints wurde hinzugefügt. Siehe die Dokumentation für "Registering New Dialects".

    Referenzen: #2462

  • [engine] [feature]

    Das "required"-Flag ist standardmäßig auf True gesetzt, wenn die Parameter "value" oder "callable" nicht übergeben werden, auf bindparam(). Dies führt dazu, dass die Statement-Ausführung prüft, ob der Parameter in der endgültigen Sammlung von gebundenen Parametern vorhanden ist, anstatt implizit None zuzuweisen.

    Referenzen: #2556

  • [engine] [feature]

    Verschiedene API-Anpassungen an der "dialect"-API, um stark spezialisierte Systeme wie die Akiban-Datenbank besser zu unterstützen, einschließlich weiterer Hooks, die es einem Ausführungskontext ermöglichen, auf Typenprozessoren zuzugreifen.

  • [engine] [feature]

    Inspector.get_primary_keys() ist veraltet; verwenden Sie Inspector.get_pk_constraint(). Mit freundlicher Genehmigung von Diana Clarke.

    Referenzen: #2422

  • [engine] [feature]

    Ein neues C-Erweiterungsmodul "utils" wurde für zusätzliche Funktionsbeschleunigungen hinzugefügt, wenn Zeit zur Implementierung vorhanden ist.

  • [engine] [bug]

    Das Feature Inspector.get_table_names() order_by="foreign_key" sortiert nun Tabellen zuerst nach Abhängigkeiten, um mit util.sort_tables und metadata.sorted_tables konsistent zu sein.

  • [engine] [bug]

    Fehler behoben, bei dem, wenn ein Datenbankneustart mehrere Verbindungen betraf, jede Verbindung einzeln eine neue Entsorgung des Pools auslöste, obwohl nur eine Entsorgung benötigt wurde.

    Referenzen: #2522

  • [engine] [bug]

    Die Namen der Spalten im .c.-Attribut von select().apply_labels() basieren nun auf _ statt auf _, für die Spalten, die einen eindeutig benannten .key haben.

    Referenzen: #2397

  • [engine] [bug]

    Das autoload_replace-Flag auf Table wird, wenn es auf False gesetzt ist, dazu führen, dass alle reflektierten Fremdschlüssel-Constraints, die sich auf bereits deklarierte Spalten beziehen, übersprungen werden, unter der Annahme, dass die In-Python deklarierte Spalte die Aufgabe der Spezifikation von In-Python ForeignKey- oder ForeignKeyConstraint-Deklarationen übernimmt.

  • [engine] [bug]

    Die ResultProxy-Methoden inserted_primary_key, last_updated_params(), last_inserted_params(), postfetch_cols(), prefetch_cols() stellen nun sicher, dass die gegebene Anweisung ein kompiliertes Konstrukt ist und eine entsprechende insert()- oder update()-Anweisung ist, andernfalls wird InvalidRequestError ausgelöst.

    Referenzen: #2498

  • [engine]

    ResultProxy.last_inserted_ids wurde entfernt und durch inserted_primary_key ersetzt.

sql

  • [sql] [feature]

    Eine neue Methode Engine.execution_options() wurde zu Engine hinzugefügt. Diese Methode funktioniert ähnlich wie Connection.execution_options(), indem sie eine Kopie des Elternobjekts erstellt, das auf die neuen Optionen verweist. Die Methode kann verwendet werden, um Sharding-Schemata zu erstellen, bei denen jede Engine denselben zugrunde liegenden Pool von Verbindungen teilt. Die Methode wurde auch gegen das horizontale Shard-Rezept im ORM getestet.

  • [sql] [feature]

    Umfassende Überarbeitung des Operator-Systems in Core, um die Neudefinition bestehender Operatoren sowie die Hinzufügung neuer Operatoren auf Typenebene zu ermöglichen. Neue Typen können aus bestehenden erstellt werden, die Operationen hinzufügen oder neu definieren, die an Spaltenausdrücke exportiert werden, ähnlich wie das ORM comparator_factory erlaubt hat. Die neue Architektur verschiebt diese Funktionalität in Core, damit sie in allen Fällen konsistent nutzbar ist und sauber mit dem bestehenden Typenweitergabeverhalten weitergegeben wird.

    Referenzen: #2547

  • [sql] [feature]

    Ergänzend dazu können Typen nun "Bind-Ausdrücke" und "Spalten-Ausdrücke" bereitstellen, die eine Kompilierungszeit-Injektion von SQL-Ausdrücken in Anweisungen auf Spalten- oder Bind-Ebene ermöglichen. Dies dient dem Anwendungsfall eines Typs, der das Binde- und Ergebnisverhalten auf SQL-Ebene augmentieren muss, im Gegensatz zur Python-Ebene. Ermöglicht Schemata wie transparente Verschlüsselung/Entschlüsselung, Verwendung von PostGIS-Funktionen usw.

    Referenzen: #1534, #2547

  • [sql] [feature]

    Das Core-Operator-System umfasst nun den getitem-Operator, d.h. den Klammeroperator in Python. Dieser wird zunächst verwendet, um Index- und Slice-Verhalten für den PostgreSQL ARRAY-Typ bereitzustellen, und bietet auch einen Hook für die Endbenutzerdefinition von benutzerdefinierten __getitem__-Schemata, die sowohl auf Typenebene als auch innerhalb von ORM-Level benutzerdefinierten Operator-Schemata angewendet werden können. lshift (<<) und rshift (>>) werden ebenfalls als optionale Operatoren unterstützt.

    Beachten Sie, dass diese Änderung dazu führt, dass deskriptorbasierte __getitem__-Schemata, die vom ORM in Verbindung mit synonym() oder anderen "deskriptor-umhüllten" Schemata verwendet werden, eine benutzerdefinierte comparator-Factory verwenden müssen, um dieses Verhalten beizubehalten.

  • [sql] [feature]

    Die Regeln für die Bestimmung der Operator-Präzedenz für benutzerdefinierte Operatoren, d.h. die durch die Methode op() gewährten, wurden überarbeitet. Zuvor wurde in allen Fällen die kleinste Präzedenz angewendet, jetzt ist die Standardpräzedenz Null, niedriger als alle Operatoren außer "Komma" (wie in der Argumentliste eines func-Aufrufs verwendet) und "AS", und ist auch über das "precedence"-Argument auf der op()-Methode anpassbar.

    Referenzen: #2537

  • [sql] [feature]

    Der Parameter "collation" wurde zu allen String-Typen hinzugefügt. Wenn vorhanden, wird er als COLLATE gerendert. Dies dient zur Unterstützung des COLLATE-Schlüsselworts, das nun von mehreren Datenbanken, darunter MySQL, SQLite und PostgreSQL, unterstützt wird.

    Referenzen: #2276

  • [sql] [feature]

    Benutzerdefinierte unäre Operatoren können nun durch Kombination von operators.custom_op() mit UnaryExpression() verwendet werden.

  • [sql] [feature]

    GenericFunction und func.* wurden verbessert, um benutzerdefinierten GenericFunction-Unterklassen über den func.*-Namensraum automatisch nach Klassennamen verfügbar zu machen, optional unter Verwendung eines Paketnamens, sowie mit der Möglichkeit, den gerenderten Namen vom identifizierten Namen in func.* zu unterscheiden.

  • [sql] [feature]

    Die Konstrukte cast() und extract() werden nun ebenfalls über den func.*-Accessor erzeugt, da Benutzer diese Namen natürlich von func.* abrufen, daher können sie auch das tun, was erwartet wird, auch wenn das zurückgegebene Objekt kein FunctionElement ist.

    Referenzen: #2562

  • [sql] [feature]

    Der Inspector-Objekt kann nun über den neuen Inspect()-Dienst erworben werden, Teil von

    Referenzen: #2208

  • [sql] [feature]

    Das column_reflect-Ereignis akzeptiert nun das Inspector-Objekt als erstes Argument, vor "table". Code, der die 0.7-Version dieses sehr neuen Ereignisses verwendet, muss angepasst werden, um das "inspector"-Objekt als erstes Argument hinzuzufügen.

    Referenzen: #2418

  • [sql] [feature]

    Das Verhalten der Spaltenzielsetzung in Ergebnisdatensätzen ist standardmäßig nun case-sensitiv. SQLAlchemy hat über viele Jahre hinweg eine case-insensitive Konvertierung dieser Werte vorgenommen, wahrscheinlich um frühe Case-Sensitivity-Probleme bei Dialekten wie Oracle und Firebird zu mildern. Diese Probleme wurden in neueren Versionen sauberer gelöst, sodass der Performance-Hit des Aufrufs von lower() auf Bezeichnern entfällt. Die Case-Insensitive-Vergleiche können durch Setzen von "case_insensitive=False" auf create_engine() reaktiviert werden.

    Referenzen: #2423

  • [sql] [feature]

    Die Warnung "unconsumed column names", die ausgegeben wird, wenn Schlüssel in insert.values() oder update.values() vorhanden sind, die nicht in der Ziel-Tabelle vorhanden sind, ist nun eine Ausnahme.

    Referenzen: #2415

  • [sql] [feature]

    “MATCH” Klausel zu ForeignKey, ForeignKeyConstraint hinzugefügt, bereitgestellt von Ryan Kelly.

    Referenzen: #2502

  • [sql] [feature]

    Unterstützung für DELETE und UPDATE aus einem Alias einer Tabelle hinzugefügt, der sich mutmaßlich im Abfragekontext auf sich selbst bezieht, bereitgestellt von Ryan Kelly.

    Referenzen: #2507

  • [sql] [feature]

    select() verfügt über eine correlate_except()-Methode, die alle Selectables außer den übergebenen automatisch korreliert.

  • [sql] [feature]

    Die Methode prefix_with() ist jetzt für jede von select(), insert(), update(), delete() verfügbar, alle mit derselben API, akzeptieren mehrfache Präfixaufrufe sowie einen „Dialektnamen“, damit das Präfix auf eine Art Dialekt beschränkt werden kann.

    Referenzen: #2431

  • [sql] [feature]

    Die Methode reduce_columns() wurde dem select()-Konstrukt hinzugefügt. Sie ersetzt Spalten inline unter Verwendung der Hilfsfunktion util.reduce_columns, um äquivalente Spalten zu entfernen. reduce_columns() fügt auch „with_only_synonyms“ hinzu, um die Reduktion nur auf Spalten zu beschränken, die denselben Namen haben. Die veraltete Funktion fold_equivalents() wurde entfernt.

    Referenzen: #1729

  • [sql] [feature]

    Die Operatoren startswith(), endswith(), contains() wurden überarbeitet, um Negationen (NOT LIKE) besser zu handhaben und sie zur Kompilierungszeit zusammenzustellen, damit ihre gerenderten SQL-Abfragen geändert werden können, wie z. B. bei Firebird STARTING WITH.

    Referenzen: #2470

  • [sql] [feature]

    Ein Hook wurde zum System des Renderns von CREATE TABLE hinzugefügt, der Zugriff auf das Rendern jeder einzelnen Spalte bietet, indem eine @compiles-Funktion gegen das neue schema.CreateColumn-Konstrukt erstellt wird.

    Referenzen: #2463

  • [sql] [feature]

    „scalar“-Selects haben jetzt eine WHERE-Methode, um beim generativen Aufbau zu helfen. Auch eine leichte Anpassung bezüglich der Korrelation von Spalten durch SS; die neue Methodik hat keine Bedeutung mehr für die zugrunde liegende Tabellenspalte, die ausgewählt wird. Dies verbessert einige ziemlich esoterische Situationen, und die vorhandene Logik schien keinen Zweck zu haben.

  • [sql] [feature]

    Eine explizite Fehlermeldung wird ausgegeben, wenn ein ForeignKeyConstraint(), das zur Referenzierung mehrerer entfernter Tabellen konstruiert wurde, zum ersten Mal verwendet wird.

    Referenzen: #2455

  • [sql] [feature]

    ColumnOperators.notin_(), ColumnOperators.notlike(), ColumnOperators.notilike() wurden zu ColumnOperators hinzugefügt.

    Referenzen: #2580

  • [sql] [change]

    Der Text()-Typ rendert die ihm übergebene Länge, falls eine Länge angegeben wurde.

  • [sql] [changed]

    Die meisten Klassen in expression.sql werden nicht mehr mit einem Unterstrich versehen, d. h. Label, SelectBase, Generative, CompareMixin. _BindParamClause wird ebenfalls in BindParameter umbenannt. Die alten Namen mit Unterstrich für diese Klassen bleiben auf absehbare Zeit als Synonyme verfügbar.

  • [sql] [bug]

    Fehler behoben, bei dem Schlüsselwortargumente, die an Compiler.process() übergeben wurden, nicht an die Spaltenausdrücke in der Spaltenklausel einer SELECT-Anweisung weitergegeben wurden. Dies trat insbesondere bei benutzerdefinierten Kompilierungsschemata auf, die spezielle Flags verwendeten.

    Referenzen: #2593

  • [sql] [bug] [orm]

    Die automatische Korrelationsfunktion von select() und damit auch von Query() wird für eine SELECT-Anweisung, die direkt in der FROM-Liste der umschließenden SELECT gerendert wird, nicht wirksam. Die Korrelation in SQL gilt nur für Spaltenausdrücke wie die in der WHERE-, ORDER BY- und Spaltenklausel.

    Referenzen: #2595

  • [sql] [bug]

    Eine Anpassung der Spaltenpräzedenz, die die Operatoren „concat“ und „match“ auf dieselbe Stufe wie „is“, „like“ und andere verschiebt; dies hilft bei der Klammerung beim Rendern, wenn sie zusammen mit „IS“ verwendet werden.

    Referenzen: #2564

  • [sql] [bug]

    Das Anwenden eines Spaltenausdrucks auf eine SELECT-Anweisung mit einem Alias, mit oder ohne andere modifizierende Konstrukte, wird diesen Ausdruck nicht mehr auf die zugrunde liegende Spalte „zielen“; dies wirkt sich auf ORM-Operationen aus, die auf die Spaltenzielsetzung angewiesen sind, um Ergebnisse abzurufen. Das heißt, eine Abfrage wie query(User.id, User.id.label(‘foo’)) wird nun den Wert jedes „User.id“-Ausdrucks separat verfolgen, anstatt sie zusammenzuführen. Es wird nicht erwartet, dass Benutzer dadurch beeinträchtigt werden; eine Verwendung, die select() in Verbindung mit query.from_statement() verwendet und versucht, vollständig zusammengesetzte ORM-Entitäten zu laden, funktioniert möglicherweise nicht wie erwartet, wenn select() benannte Spaltenobjekte mit beliebigen .label()-Namen verwendet, da diese nicht mehr auf die von dieser Entität gemappten Spaltenobjekte zielen werden.

    Referenzen: #2591

  • [sql] [bug]

    Korrekturen bei der Interpretation des Spaltenparameters „default“ als aufrufbar, um ExecutionContext nicht als Schlüsselwortargument zu übergeben.

    Referenzen: #2520

  • [sql] [bug]

    Alle UniqueConstraint, ForeignKeyConstraint, CheckConstraint und PrimaryKeyConstraint werden automatisch an ihre übergeordnete Tabelle angehängt, wenn sie sich direkt auf ein Tabellen-gebundenes Spaltenobjekt beziehen (d. h. nicht nur ein Spaltenname als String) und sich auf genau eine Tabelle beziehen. Vor 0.8 trat dieses Verhalten für UniqueConstraint und PrimaryKeyConstraint auf, jedoch nicht für ForeignKeyConstraint oder CheckConstraint.

    Referenzen: #2410

  • [sql] [bug]

    TypeDecorator enthält jetzt ein generisches repr(), das standardmäßig auf dem „impl“-Typ basiert. Dies ist eine Verhaltensänderung für TypeDecorator-Klassen, die eine benutzerdefinierte __init__-Methode angeben; diese Typen müssen __repr__() neu definieren, wenn sie benötigen, dass __repr__() eine getreue Konstruktorrepräsentation liefert.

    Referenzen: #2594

  • [sql] [bug]

    column.label(None) erzeugt jetzt ein anonymes Label, anstatt das Spaltenobjekt selbst zurückzugeben, konsistent mit dem Verhalten von label(column, None).

    Referenzen: #2168

  • [sql] [removed]

    Das lange veraltete und nicht funktionierende assert_unicode-Flag bei create_engine() sowie String wurde entfernt.

postgresql

  • [postgresql] [feature]

    postgresql.ARRAY verfügt über ein optionales Argument „dimension“. Es weist dem Array eine bestimmte Anzahl von Dimensionen zu, die in DDL als ARRAY[][]… gerendert werden, und verbessert auch die Leistung der Bindungs-/Ergebnisverarbeitung.

    Referenzen: #2441

  • [postgresql] [feature]

    postgresql.ARRAY unterstützt jetzt Indizierung und Slicing. Der Python []-Operator ist für alle SQL-Ausdrücke vom Typ ARRAY verfügbar; ganze Zahlen oder einfache Slices können übergeben werden. Die Slices können auch auf der Zuweisungsseite in der SET-Klausel einer UPDATE-Anweisung verwendet werden, indem sie in Update.values() übergeben werden; siehe Dokumentation für Beispiele.

  • [postgresql] [feature]

    Neues Konstrukt „array literal“ postgresql.array() hinzugefügt. Grundsätzlich ein „Tupel“, das als ARRAY[1,2,3] gerendert wird.

  • [postgresql] [feature]

    Unterstützung für das PostgreSQL ONLY-Schlüsselwort hinzugefügt, das bei einer Tabelle in einer SELECT-, UPDATE- oder DELETE-Anweisung erscheinen kann. Die Phrase wird mit with_hint() eingerichtet. Bereitgestellt von Ryan Kelly.

    Referenzen: #2506

  • [postgresql] [feature]

    Das Wörterbuch „ischema_names“ des PostgreSQL-Dialekts ist „inoffiziell“ anpassbar. Das bedeutet, neue Typen wie PostGIS-Typen können diesem Wörterbuch hinzugefügt werden, und der PG-Typreflexionscode sollte einfache Typen mit variabler Anzahl von Argumenten handhaben können. Die Funktionalität hier ist aus drei Gründen „inoffiziell“

    1. Dies ist keine „offizielle“ API. Idealerweise würde eine „offizielle“ API benutzerdefinierte Typ-Handling-Callables auf Dialekt- oder globaler Ebene generisch ermöglichen.

    2. Dies ist nur für den PG-Dialekt implementiert, insbesondere weil PG eine breite Unterstützung für benutzerdefinierte Typen im Vergleich zu anderen Datenbank-Backends hat. Eine echte API würde auf der Standard-Dialektebene implementiert werden.

    3. Der Reflexionscode hier ist nur für einfache Typen getestet und hat wahrscheinlich Probleme mit komplexeren Typen.

    Patch bereitgestellt von Éric Lemoine.

mysql

  • [mysql] [feature]

    Der TIME-Typ wurde dem mysql-Dialekt hinzugefügt, akzeptiert das Argument „fst“, das der neue „fractional seconds“-Spezifizierer für neuere MySQL-Versionen ist. Der Datentyp interpretiert einen Mikrosekundenanteil, der vom Treiber zurückgegeben wird, aber beachten Sie, dass die meisten/alle MySQL DBAPIs diesen Wert derzeit nicht zurückgeben können.

    Referenzen: #2534

  • [mysql] [bug]

    Der Dialekt gibt bei der ersten Verbindung keine teuren Server-Kollations-Abfragen und auch keine Server-Groß-/Kleinschreibung mehr aus. Diese Funktionen sind weiterhin als semi-privat verfügbar.

    Referenzen: #2404

sqlite

  • [sqlite] [feature]

    Die SQLite-Datums- und Zeitdatentypen wurden überarbeitet, um ein offeneres Format für Eingabe und Ausgabe zu unterstützen, wobei namensbasierte Formatzeichenfolgen und reguläre Ausdrücke verwendet werden. Ein neues Argument „microseconds“ bietet auch die Option, den „microseconds“-Teil von Zeitstempeln wegzulassen. Vielen Dank an Nathan Wright für die Arbeit und die Tests hierfür.

    Referenzen: #2363

  • [sqlite]

    NCHAR, NVARCHAR zur Liste der erkannten Typnamen für die Reflexion des SQLite-Dialekts hinzugefügt. SQLite gibt den Namen, der einem Typ gegeben wurde, als zurückgegebenen Namen zurück.

    Referenzen: rc3addcc9ffad

mssql

  • [mssql] [feature]

    Der SQL Server-Dialekt kann datenbankqualifizierte Schemanamen erhalten, z. B. „schema=’mydatabase.dbo‘“; Reflexionsoperationen erkennen dies, teilen das Schema anhand des „.“ auf, um den Besitzer separat zu erhalten, und geben eine „USE mydatabase“-Anweisung aus, bevor sie Ziele innerhalb des „dbo“-Besitzers reflektieren; die vorhandene Datenbank, die von DB_NAME() zurückgegeben wird, wird dann wiederhergestellt.

  • [mssql] [feature]

    Unterstützung für den mxodbc-Treiber aktualisiert; mxodbc 3.2.1 wird für volle Kompatibilität empfohlen.

  • [mssql] [bug]

    Legacy-Verhalten entfernt, bei dem ein Spaltenvergleich mit einem skalaren SELECT über == zu einem IN mit dem SQL Server-Dialekt koerziert wurde. Dies ist ein implizites Verhalten, das in anderen Szenarien fehlschlägt, und wurde daher entfernt. Code, der sich darauf verlässt, muss explizit auf column.in_(select) umgestellt werden.

    Referenzen: #2277

oracle

  • [oracle] [feature]

    Die Typen von Spalten, die von setinputsizes() ausgeschlossen sind, können angepasst werden, indem eine Liste von Zeichenketten-DBAPI-Typnamen zum Ausschluss über den Parameter exclude_setinputsizes des Dialekts gesendet wird. Diese Liste war zuvor fest. Die Liste enthält jetzt standardmäßig STRING, UNICODE und entfernt CLOB, NCLOB aus der Liste.

    Referenzen: #2561

  • [oracle] [bug]

    Quoting-Informationen werden jetzt von einer Spalte mit quote=True weitergegeben, wenn ein gebundener Parameter mit demselben Namen für das bindparam()-Objekt generiert wird, wie es bei generierten INSERT- und UPDATE-Anweisungen der Fall ist, damit unbekannte reservierte Namen vollständig unterstützt werden können.

    Referenzen: #2437

  • [oracle] [bug]

    Das CreateIndex-Konstrukt in Oracle qualifiziert nun den Namen des zu erstellenden Index mit dem Schema der übergeordneten Tabelle. Zuvor wurde dieser Name weggelassen, was anscheinend den Index im Standard-Schema erstellte, anstatt im Schema der Tabelle.

misc

  • [feature] [access]

    Der MS Access-Dialekt wurde in ein eigenes Projekt auf Bitbucket verschoben und nutzt die neue SQLAlchemy Dialect Compliance Suite. Der Dialekt ist immer noch in einem sehr rohen Zustand und wahrscheinlich noch nicht für den allgemeinen Gebrauch bereit, verfügt jedoch nun über *extrem* rudimentäre Funktionalität. https://github.com/gordthompson/sqlalchemy-access

  • [feature] [firebird]

    Der Operator „startswith()“ wird als „STARTING WITH“ gerendert, „~startswith()“ als „NOT STARTING WITH“, wobei der effizientere Operator von FB verwendet wird.

    Referenzen: #2470

  • [feature] [firebird]

    Ein experimenteller Dialekt für den fdb-Treiber wurde hinzugefügt, ist aber ungetestet, da ich das fdb-Paket nicht kompilieren kann.

    Referenzen: #2504

  • [bug] [firebird]

    CompileError wird ausgegeben, wenn versucht wird, VARCHAR ohne Länge zu emittieren, ähnlich wie bei MySQL.

    Referenzen: #2505

  • [bug] [firebird]

    Firebird verwendet jetzt strenge „ansi bind rules“, sodass gebundene Parameter nicht in den Spalten einer Anweisung gerendert werden – stattdessen werden sie wörtlich gerendert.

  • [bug] [firebird]

    Unterstützung für die Übergabe von datetime als date bei Verwendung des DateTime-Typs mit Firebird; andere Dialekte unterstützen dies.

  • [moved] [maxdb]

    Der MaxDB-Dialekt, der seit mehreren Jahren nicht mehr funktionierte, wurde in ein ausstehendes Bitbucket-Projekt verschoben (gelöscht; um den MaxDB-Code anzuzeigen, siehe den Commit, bevor er entfernt wurde unter https://github.com/sqlalchemy/sqlalchemy/tree/ba67f7dbc5eb7a1ed2a3e1b56df72a837130f7bb/lib/sqlalchemy/dialects/maxdb)