SQLAlchemy 2.0 Dokumentation
Änderungen und Migration
- SQLAlchemy 2.0 - Major Migration Guide
- Was ist neu in SQLAlchemy 2.0?
- 2.0 Changelog
- 1.4 Changelog
- 1.3 Changelog
- 1.2 Changelog
- 1.1 Changelog
- 1.0 Changelog
- 0.9 Changelog
- 0.8 Changelog¶
- 0.7 Changelog
- 0.6 Changelog
- 0.5 Changelog
- 0.4 Changelog
- 0.3 Changelog
- 0.2 Changelog
- 0.1 Changelog
- Was ist neu in SQLAlchemy 1.4?
- Was ist neu in SQLAlchemy 1.3?
- Was ist neu in SQLAlchemy 1.2?
- Was ist neu in SQLAlchemy 1.1?
- Was ist neu in SQLAlchemy 1.0?
- Was ist neu in SQLAlchemy 0.9?
- Was ist neu in SQLAlchemy 0.8?
- Was ist neu in SQLAlchemy 0.7?
- Was ist neu in SQLAlchemy 0.6?
- Was ist neu in SQLAlchemy 0.5?
- Was ist neu in SQLAlchemy 0.4?
Projektversionen
- Vorheriger: 0.9 Changelog
- Nächster: 0.7 Changelog
- Nach oben: Startseite
- Auf dieser Seite
0.8 Changelog¶
0.8.7¶
Veröffentlicht: 22. Juli 2014orm¶
[orm] [bug] ¶
Fehler in der Subquery-Eager-Ladung behoben, bei der eine lange Kette von Eager-Ladungen über eine polymorphe Klassengrenze in Verbindung mit polymorpher Ladung die Unterklasse-Verknüpfung in der Kette nicht finden konnte und mit einem fehlenden Eigenschaftsnamen bei einer
AliasedClassfehlschlug.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
Enumund anderenSchemaType-Unterklassen behoben, bei denen die direkte Zuordnung des Typs zu einemMetaDatazu einem Hängenbleiben führte, wenn Ereignisse (wie Erstellungsereignisse) auf demMetaDataausgelöst wurden.Referenzen: #3124
[sql] [bug] ¶
Fehler im benutzerdefinierten Operator Plus
TypeEngine.with_variant()behoben, bei dem die Verwendung einesTypeDecoratorin Verbindung mit Varianten mit einem MRO-Fehler fehlschlug, wenn ein Vergleichsoperator verwendet wurde.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()undTable.delete()eine leere WHERE-Klausel erzeugten, wenn eine leereand_()oderor_()oder ein anderer leerer Ausdruck angewendet wurde. Dies ist nun konsistent mit dem vonselect().Referenzen: #3045
postgresql¶
[postgresql] [bug] ¶
Das Flag
hashable=Falsewurde dem PGHSTORE-Typ hinzugefügt, was erforderlich ist, damit der ORM versucht, eine ORM-gemappte HSTORE-Spalte beim Anfordern in einer gemischten Spalten-/Entitätsliste nicht zu "hashen". Patch von Gunnlaugur Þór Briem.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_lengthauf einem Index hinzugefügt wurden, die gleiche Anführungszeichen für Anführungszeichennamen benötigten, um erkannt zu werden. Die Korrektur macht die Anführungszeichen optional, bietet aber auch das alte Verhalten für Abwärtskompatibilität mit denen, die den Workaround verwenden.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_encodingrepariert, die, wenn sie nicht explizit gesetzt war, die Analyse von cursor.description verhinderte, wenn Ergebnismengen Namen in alternativen Kodierungen enthielten. Dieser Parameter sollte zukünftig nicht mehr benötigt werden.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 Argumenteversion_id_colundpolymorphic_onmodifiziert 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
MutableDictkeine Änderungsereignisse für die Wörterbuchoperationsetdefault()meldete.[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é.
0.8.6¶
Veröffentlicht: 28. März 2014general¶
[general] [bug] ¶
Die Datei
setup.pywurde angepasst, um die mögliche zukünftige Entfernung der Erweiterungsetuptools.Featureaus 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 einenQuery.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 alsNonebestimmt 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 einimport *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 2014orm¶
[orm] [bug] ¶
Fehler behoben, bei dem
Query.get()dieInvalidRequestError, 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.
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 denARRAY-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=Falsegesetzt 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, dassInsert.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
BindParameterin 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
DATETIMEmit Unterstützung für Bruchteile von Sekunden hinzugefügt; Bruchteile von Sekunden wurden auch zuTIMESTAMPhinzugefü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 BYundPARTITIONShinzugefügt, die alsmysql_partition_by='value'undmysql_partitions='value'anTableü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
UniqueConstraintmit 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 2013orm¶
engine¶
[engine] [bug] ¶
Ein DBAPI, der bei
connect()einen Fehler auslöst, der keine Unterklasse von dbapi.Error ist (wie z. B.TypeError,NotImplementedErroretc.), wird die Ausnahme unverändert weitergeben. Zuvor würde die spezifische Fehlerbehandlung für die Routineconnect()die Ausnahme sowohl unangemessen durch die RoutineDialect.is_disconnect()des Dialekts laufen lassen als auch sie in einensqlalchemy.exc.DBAPIErroreinhüllen. Sie wird nun unverändert weitergegeben, wie es auch im Ausführungsprozess geschieht.Referenzen: #2881
[engine] [bug] [pool] ¶
Der
QueuePoolwurde 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
StatementErrorinnerhalb vonConnection.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¶
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 eineCASToder ähnliches) falschNone CHARoder ähnliches renderten.Referenzen: #2870
misc¶
0.8.3¶
Veröffentlicht: 26. Oktober 2013orm¶
[orm] [feature] ¶
Neue Option
distinct_target_keyzur Beziehungrelationship()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 aufTruegesetzt ist, wird DISTINCT bedingungslos gerendert, und wenn es aufNonegesetzt 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 voninsert(0, item)mit dem Association Proxy auftreten konnte. Aufgrund einer Eigenart in Python-Collections war das Problem bei Python 3 viel wahrscheinlicher als bei Python 2.Diese Änderung wird auch **zurückportiert** zu: 0.7.11
Referenzen: #2807
[orm] [bug] ¶
Behob einen Fehler, bei dem die Verwendung einer Annotation wie
remote()oderforeign()für eineColumn, bevor sie mit einer übergeordnetenTableverbunden 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, dassdefer()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ürdeclarative_base(), der es ermöglicht, eine bestehende Basisklasse mit einem ausgefallenen Klassen-Decorator-Ansatz anzuwenden.
examples¶
[examples] [feature] ¶
Die Beispiele in
examples/generic_associationswurden verbessert, einschließlich der Tatsache, dassdiscriminator_on_association.pySingle Table Inheritance verwendet, um die Arbeit mit dem "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 dieURLeinerEnginewird 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
Engineaufgrund 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
QueuePooldie 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()-KonstruktInsert.from_select()hinzugefügt. Gegeben eine Liste von Spalten und ein auswählbares Objekt, rendert diesINSERT INTO (tabelle) (spalten) SELECT ...Referenzen: #722
[sql] [feature] ¶
Die Konstrukte
update(),insert()unddelete()interpretieren nun ORM-Entitäten als Zieltabellen, auf denen operiert werden soll, z. B.from sqlalchemy import insert, update, delete ins = insert(SomeMappedClass).values(x=5) del_ = delete(SomeMappedClass).where(SomeMappedClass.id == 5) upd = update(SomeMappedClass).where(SomeMappedClass.id == 5).values(name="ed")
[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 einemColumn-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
EnumundBooleanumgehen 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
Indexkonnte alsNonegeneriert werden, wenn es von einerColumnstammte, die `unique` nicht spezifiziert hatte (wo es standardmäßigNoneist). Das Flag wird nun immerTrueoderFalsesein.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
ForeignKeyist 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
Columnverhinderte, 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
UnsupportedCompilationErrorhinzu, 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
deferrablevonForeignKeyConstraintim 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üsselwortinitially. In 0.8 bleiben die Schlüsselwörter ignoriert, aber eine Warnung wird ausgegeben. Zusätzlich löst das Schlüsselwortmatchunter 0.9 einenCompileErroraus und gibt unter 0.8 eine Warnung aus; dieses Schlüsselwort wird von MySQL nicht nur stillschweigend ignoriert, sondern bricht auch die ON UPDATE/ON DELETE-Optionen.Um eine
ForeignKeyConstraintzu verwenden, die unter MySQL nicht gerendert wird oder anders gerendert wird, verwenden Sie eine benutzerdefinierte Kompilierungsoption. Ein Beispiel für diese Verwendung wurde zur Dokumentation hinzugefügt, siehe MySQL / MariaDB Foreign Keys.[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¶
oracle¶
misc¶
[feature] ¶
Es wurde ein neues Flag
system=TruezuColumnhinzugefügt, das die Spalte als "System"-Spalte kennzeichnet, die automatisch von der Datenbank bereitgestellt wird (wie z. B. PostgreSQLoidoderxmin). Die Spalte wird von derCREATE TABLE-Anweisung weggelassen, aber ansonsten zum Abfragen verfügbar sein. Darüber hinaus kann das KonstruktCreateColumnauf eine benutzerdefinierte Kompilierungsregel angewendet werden, die das Überspringen von Spalten ermöglicht, indem eine Regel erzeugt wird, dieNonezurückgibt.
0.8.2¶
Veröffentlicht: 3. Juli 2013orm¶
[orm] [feature] ¶
Es wurde eine neue Methode
Query.select_entity_from()hinzugefügt, die in 0.9 einen Teil der Funktionalität vonQuery.select_from()ersetzen wird. In 0.8 erfüllen die beiden Methoden die gleiche Funktion, so dass Code bei Bedarf zur Verwendung der MethodeQuery.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
MutableDictkein Änderungsereignis meldete, wennclear()aufgerufen wurde.Referenzen: #2730
[orm] [bug] ¶
Behob eine Regression, die durch #2682 verursacht wurde, wodurch die von
Query.update()undQuery.delete()aufgerufene Auswertung auf nicht unterstützteTrue- undFalse-Symbole stieß, die nun aufgrund der Verwendung vonISerscheinen.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,primaryjoinoder ähnliche inrelationship()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
Querydies normalerweise tut.
engine¶
[engine] [bug] ¶
Behob einen Fehler, bei dem das Argument
reset_on_returnfür verschiedenePool-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
TypeDecoratornamensTypeDecorator.coerce_to_is_typeshinzugefügt, um die Kontrolle darüber zu erleichtern, wie Vergleiche mit==oder!=mitNoneund booleschen Typen zu einemIS-Ausdruck oder einem einfachen Gleichheitsausdruck mit einem gebundenen Parameter führen.[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, dassSelect.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.
[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 BasisklasseColumnOperatorswurde 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 versehentlichlist()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_levelverfü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::timestampoder ä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 mitIndexverwendet 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 dierdbms_mysqldbDBAPI verwenden sollten. Patch mit freundlicher Genehmigung von Brett Slatkin.Referenzen: #2715
[mysql] [bug] ¶
Das Schlüsselwortargument
deferrablefürForeignKeyundForeignKeyConstraintwird im MySQL-Dialekt nicht das SchlüsselwortDEFERRABLErendern. 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.BIGINTzur Liste der Typennamen hinzugefügt, die vom SQLite-Dialekt reflektiert werden können; mit freundlicher Genehmigung von Russell Stuart.Referenzen: #2764
mssql¶
misc¶
[feature] [firebird] ¶
Es wurden neue Flags
retaining=Truezu den Dialekten kinterbasdb und fdb hinzugefügt. Dies steuert den Wert des Flagsretaining, das an die Methodencommit()undrollback()der DBAPI-Verbindung gesendet wird. Aufgrund historischer Bedenken ist dieses Flag in 0.8.2 standardmäßig aufTruegesetzt, in 0.9.0b1 jedoch standardmäßig aufFalse.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
MutableCompositewar (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.testingfür externe Dialekte zu verwenden.
0.8.1¶
Veröffentlicht: 27. April 2013orm¶
[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)), wobeiSubClassein joined inh vonBaseClassist, dieJOINinnerhalb 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 dassrelationship()undorm.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 nuncol IS trueauf der Zielplattform, anstatt die True/False-Konstante in einen ganzzahligen gebundenen Parameter umzuwandeln. Dies ermöglicht, dass der Operatoris_()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_keyfunktionierte.
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 2013Hinweis
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.infowird hinzugefügt, das auf das Attribut.infoentweder auf demColumn-Objekt, falls direkt vorhanden, oder andernfalls auf demMapperPropertyweitergeleitet 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 einesSession.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 wiehybrid_propertyundAssociationProxyinspizieren zu können. SieheMapper.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 MethodeQuery.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
Sessiongelö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 Flaglegacy_is_orphanwird zuMapperhinzugefü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
MappedCollectionbenutzerdefinierte 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ätNonesein 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¶
sql¶
[sql] [feature] ¶
Ein neues Argument
inherit_schemawurde zuEnumund dessen BasisSchemaTypehinzugefügt. Wenn aufTruegesetzt, setzt der Typ seinschema-Attribut auf das derTable, der er zugeordnet ist. Dies geschieht auch während einerTable.tometadata()-Operation; derSchemaTypewird jetzt in allen Fällen kopiert, wennTable.tometadata()ausgeführt wird, und wenninherit_schema=True, übernimmt der Typ den neuen Schemanamen, der der Methode übergeben wird. Dasschemaist wichtig, wenn es mit dem PostgreSQL-Backend verwendet wird, da der Typ zu einerCREATE TYPE-Anweisung führt.Referenzen: #2657
[sql] [feature] ¶
Indexunterstützt nun beliebige SQL-Ausdrücke und/oder Funktionen zusätzlich zu einfachen Spalten. Gängige Modifikatoren sindsomecolumn.desc()für einen absteigenden Index undfunc.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()undSelect.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()undlocal()Annotationsfunktionen beeinträchtigen konnte, bei denen Annotationen verloren gehen konnten, wenn die Spalte in einem nachfolgenden Ausdruck verwendet wurde.[sql] [bug] ¶
Der Operator
ColumnOperators.in_()wird nun Werte vonNoneinnull()umwandeln.Referenzen: #2496
[sql] [bug] ¶
Behob einen Fehler, bei dem
Table.tometadata()fehlschlagen würde, wenn eineColumnsowohl 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¶
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 einesinsert()-Konstrukts einen Fehler bezüglich eines Parameterproblems in der Methodeself_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 Attributinstance. 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_includeundmssql_clusteredwurden zuIndexhinzugefügt, die die SchlüsselwörterINCLUDEundCLUSTEREDrendern. 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, wennsupports_unicode_bindsfalsch ist, was bei cx_oracle nicht der Fall ist, wenn mindestens Version 5 von cx_oracle verwendet wird.
tests¶
0.8.0b2¶
Veröffentlicht: 14. Dezember 2012orm¶
[orm] [feature] ¶
Die Klassen
KeyedTuple._asdict()undKeyedTuple._fieldswurden zur KlasseKeyedTuplehinzugefügt, um ein gewisses Maß an Kompatibilität mit dercollections.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 dieseua = 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()oderalias()getrennt von einer abgebildeten Entität wie einemaliased()-Konstrukt.Referenzen: #2635
[orm] [bug] ¶
Der Typ
MutableCompositeerlaubte nicht die Verwendung der MethodeMutableBase.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 neueMutableComposite-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¶
[orm] [extensions] [feature] ¶
Die Erweiterung
sqlalchemy.ext.mutableenthält nun die BeispielklasseMutableDictals Teil der Erweiterung.
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
EngineundConnectionals 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 gegebeneConnectionkorrekt verwendete, wenn diese angegeben war, ohne eine zweite Verbindung von derEnginedieser Verbindung zu öffnen.Diese Änderung wird auch auf 0.7.10 **zurückportiert**.
Referenzen: #2604
[engine] ¶
Das Argument „reflect=True“ für
MetaDataist veraltet. Bitte verwenden Sie die MethodeMetaData.reflect().
sql¶
[sql] [feature] ¶
Das Konstrukt
Insertunterstü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.Siehe auch
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
CheckConstraintwährend einerTable.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
DECIMALberü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 vonBinaryExpressionin einigen Fällen angewandte „Auto-Gruppierung“ dieser Vergleich nicht beeinträchtigt. Zuvor würde ein Ausdruck wieexpr1 = mycolumn > 2 bool(expr1 == expr1)
Würde als
Falseausgewertet, obwohl dies ein Identitätsvergleich ist, damycolumn > 2gruppiert würde, bevor er in denBinaryExpressioneingefügt wird, wodurch seine Identität geändert wird.BinaryExpressionmerkt 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ösenTypeErroraus.Referenzen: #2621
[sql] [bug] ¶
Behob ein Problem, bei dem das versehentliche Aufrufen von list() auf einem
ColumnElementin eine Endlosschleife geriet, wennColumnOperators.__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¶
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 vonFalsenicht zum Aufruf vonconnection.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
Poolwird 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
Poolkonsultiert nun denDialectfü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 mitConnectionEvents.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 2012general¶
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()
[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.
[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
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 zuEnginehinzugefügt. Diese Methode funktioniert ähnlich wieConnection.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.Siehe auch
[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.
[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 einesfunc-Aufrufs verwendet) und "AS", und ist auch über das "precedence"-Argument auf derop()-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“
Dies ist keine „offizielle“ API. Idealerweise würde eine „offizielle“ API benutzerdefinierte Typ-Handling-Callables auf Dialekt- oder globaler Ebene generisch ermöglichen.
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.
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)
Die Designs von flambé! dem Drachen und Der Alchemist wurden von Rotem Yaari erstellt und großzügig gespendet.
Erstellt mit Sphinx 7.2.6. Dokumentation zuletzt generiert: Di 11 Mär 2025 14:40:17 EDT