1.0 Changelog

1.0.19

Veröffentlicht: 3. August 2017

oracle

  • [oracle] [bug] [performance] [py2k]

    Behebung eines Performance-Rückschritts, verursacht durch die Korrektur von #3937, bei dem cx_Oracle ab Version 5.3 das Symbol .UNICODE aus seinem Namensraum entfernt hat. Dies wurde als bedingungsloses Einschalten des „WITH_UNICODE“-Modus von cx_Oracle interpretiert, was Funktionen auf der SQLAlchemy-Seite aufrief, die alle Strings bedingungslos in Unicode konvertieren und dadurch die Leistung beeinträchtigten. Tatsächlich wurde laut dem Autor von cx_Oracle der „WITH_UNICODE“-Modus bereits in Version 5.1 vollständig entfernt, sodass die aufwändigen Unicode-Konvertierungsfunktionen nicht mehr erforderlich sind und deaktiviert werden, wenn cx_Oracle 5.1 oder höher unter Python 2 erkannt wird. Die Warnung vor dem „WITH_UNICODE“-Modus, die unter #3937 entfernt wurde, wird ebenfalls wiederhergestellt.

    Referenzen: #4035

1.0.18

Veröffentlicht: 24. Juli 2017

oracle

  • [oracle] [bug]

    Ein Fix für den WITH_UNICODE-Modus von cx_Oracle, der sich daraus ergab, dass cx_Oracle 5.3 dieses Flag im Build fest zuordnet; eine interne Methode, die diesen Modus verwendet, verwendete nicht die korrekte Signatur.

    Referenzen: #3937

tests

  • [tests] [bug] [py3k]

    Behebung eines Problems in den Test-Fixtures, das mit einer Änderung an Kontextmanagern in Python 3.6.2 inkompatibel war.

    Referenzen: #4034

1.0.17

Veröffentlicht: 17. Januar 2017

orm

  • [orm] [bug]

    behoben: Bug bei joined eager loading auf mehrere Entitäten, wenn polymorphe Vererbung verwendet wird, was zu “‘NoneType’ object has no attribute ‘isa’” führte. Das Problem wurde durch den Fix für #3611 eingeführt.

    Referenzen: #3884

misc

  • [bug] [py3k]

    behoben: Python 3.6 DeprecationWarnings bezüglich maskierter Strings ohne den 'r'-Modifikator, und Testabdeckung für Python 3.6 hinzugefügt.

    Referenzen: #3886

1.0.16

Veröffentlicht: 15. November 2016

orm

  • [orm] [bug]

    behoben: Bug in Session.bulk_update_mappings(), bei dem ein alternativer Primärschlüsselname nicht korrekt in die UPDATE-Anweisung nachverfolgt wurde.

    Referenzen: #3849

  • [orm] [bug]

    behoben: Bug, bei dem joined eager loading bei einer polymorph geladenen Mapper fehlschlägt, wenn polymorphic_on auf einen nicht abgebildeten Ausdruck wie einen CASE-Ausdruck gesetzt wurde.

    Referenzen: #3800

  • [orm] [bug]

    behoben: Bug, bei dem der für einen ungültigen an eine Session über Session.bind_mapper(), Session.bind_table() oder den Konstruktor gesendete Bindung ausgelöste ArgumentError nicht korrekt ausgelöst wurde.

    Referenzen: #3798

  • [orm] [bug]

    behoben: Bug in Session.bulk_save(), bei dem ein UPDATE in Verbindung mit einem Mapping, das einen Versionszähler implementiert, nicht korrekt funktionierte.

    Referenzen: #3781

  • [orm] [bug]

    behoben: Bug, bei dem die Mapper.attrs, Mapper.all_orm_descriptors und andere abgeleitete Attribute nicht aktualisiert wurden, wenn Mapper-Eigenschaften oder andere ORM-Konstrukte nach dem ersten Aufruf dieser Zugriffsmethoden zum Mapper/zur Klasse hinzugefügt wurden.

    Referenzen: #3778

mssql

  • [mssql] [bug]

    Geänderte Abfrage zur Ermittlung des "standardmäßigen Schemanamens": von einer Abfrage der Datenbank-Principals-Tabelle zur Verwendung der Funktion "schema_name()", da Probleme gemeldet wurden, dass das erstere System in der Azure Data Warehouse-Edition nicht verfügbar war. Es wird gehofft, dass dies endlich über alle SQL Server-Versionen und Authentifizierungsstile hinweg funktioniert.

    Referenzen: #3810

  • [mssql] [bug]

    Aktualisierte das Serverversions-Infoschema für pyodbc zur Verwendung von SQL Server SERVERPROPERTY() anstelle von pyodbc.SQL_DBMS_VER, was insbesondere bei FreeTDS weiterhin unzuverlässig ist.

    Referenzen: #3814

  • [mssql] [bug]

    Fehlercode 20017 "unerwartetes EOF vom Server" zur Liste der Trennungsfehler hinzugefügt, die zu einem Zurücksetzen des Verbindungspools führen. Pull-Request von Ken Robbins.

    Referenzen: #3791

  • [mssql] [bug]

    behoben: Bug im pyodbc-Dialekt (sowie im größtenteils nicht funktionierenden adodbapi-Dialekt), bei dem ein Semikolon im Passwort- oder Benutzernamenfeld als Trennzeichen für ein anderes Token interpretiert werden konnte; die Werte werden nun in Anführungszeichen gesetzt, wenn Semikolons vorhanden sind.

    Referenzen: #3762

misc

  • [bug] [orm.declarative]

    behoben: Bug, bei dem die Einrichtung einer Single-Table-Unterklasse einer Joined-Table-Unterklasse mit einer zusätzlichen Spalte die Fremdschlüssel-Sammlung der abgebildeten Tabelle beschädigte und somit die Initialisierung von Beziehungen beeinträchtigte.

    Referenzen: #3797

1.0.15

Veröffentlicht: 1. September 2016

orm

  • [orm] [bug]

    behoben: Bug in subquery eager loading, bei dem eine subqueryload eines "of_type()"-Objekts, das mit einer zweiten subqueryload einer einfachen abgebildeten Klasse oder einer längeren Kette mehrerer "of_type()"-Attribute verbunden war, die Joins nicht korrekt verknüpfte.

    Referenzen: #3773, #3774

sql

  • [sql] [bug]

    behoben: Bug in Table, bei dem die interne Methode _reset_exported() den Zustand des Objekts beschädigte. Diese Methode ist für wählbare Objekte vorgesehen und wird in einigen Fällen vom ORM aufgerufen; eine fehlerhafte Mapper-Konfiguration konnte dazu führen, dass das ORM diese auf ein Table-Objekt anwendet.

    Referenzen: #3755

mysql

  • [mysql] [bug]

    Unterstützung für das Parsen von MySQL/Connector-Booleschen und Ganzzahl-Argumenten in der URL-Abfragezeichenfolge hinzugefügt: connection_timeout, connect_timeout, pool_size, get_warnings, raise_on_warnings, raw, consume_results, ssl_verify_cert, force_ipv6, pool_reset_session, compress, allow_local_infile, use_pure.

    Referenzen: #3787

misc

  • [bug] [ext]

    behoben: Bug in sqlalchemy.ext.baked, bei dem das "Unbaken" einer Subquery-Eager-Loader-Abfrage aufgrund eines Variablen-Scoping-Problems fehlschlug, wenn mehrere Subquery-Loader beteiligt waren. Pull-Request von Mark Hahnenberg.

    Referenzen: #3743

1.0.14

Veröffentlicht: 6. Juli 2016

examples

  • [examples] [bug]

    behoben: Eine Regression im Beispiel "examples/vertical/dictlike-polymorphic.py", die dessen Ausführung verhinderte.

    Referenzen: #3704

engine

  • [engine] [bug] [postgresql]

    behoben: Bug bei der Reflexion von Fremdschlüsseln zwischen Schemata in Verbindung mit dem Argument MetaData.schema, bei dem eine referenzierte Tabelle im "Standard"-Schema fehlschlug, da es keine Möglichkeit gab, ein Table anzugeben, das "leer" für ein Schema hatte. Das spezielle Symbol sqlalchemy.schema.BLANK_SCHEMA wurde als möglicher Wert für Table.schema und Sequence.schema hinzugefügt, was anzeigt, dass der Schemaname auf None erzwungen werden soll, auch wenn MetaData.schema angegeben ist.

    Referenzen: #3716

sql

  • [sql] [bug]

    behoben: Problem mit dem SQL-Operator für mathematische Negation, bei dem der Typ des Ausdrucks nicht mehr der numerische Typ des Originals war. Dies führte zu Problemen, bei denen der ermittelte Typ das Verhalten der Ergebnismenge bestimmte.

    Referenzen: #3735

  • [sql] [bug]

    behoben: Bug, bei dem die Methoden __getstate__ / __setstate__ für sqlalchemy.util.Properties aufgrund des Übergangs in der 1.0-Serie zu __slots__ nicht funktionierten. Das Problem beeinträchtigte möglicherweise einige Drittanbieteranwendungen. Pull-Request von Pieter Mulder.

    Referenzen: #3728

  • [sql] [bug]

    FromClause.count() wird für 1.1 zur Deprecation anstehen. Diese Funktion verwendet eine beliebige Spalte in der Tabelle und ist nicht zuverlässig; für Core-Verwendung sollte func.count() bevorzugt werden.

    Referenzen: #3724

  • [sql] [bug]

    behoben: Bug in der CTE-Struktur, die dazu führte, dass sie bei Verwendung eines UNIONs, wie es bei einer rekursiven CTE üblich ist, nicht korrekt geklont wurde. Das fehlerhafte Klonen führte zu Fehlern, wenn die CTE in verschiedenen ORM-Kontexten, wie z. B. bei einer column_property(), verwendet wurde.

    Referenzen: #3722

  • [sql] [bug]

    behoben: Bug, bei dem Table.tometadata() für jede UniqueConstraint, die den Parameter unique=True für Column-Objekte enthielt, eine Duplikat-UniqueConstraint erstellte.

    Referenzen: #3721

postgresql

  • [postgresql] [bug]

    behoben: Bug, bei dem TypeDecorator- und Variant-Typen vom PostgreSQL-Dialekt nicht tief genug inspiziert wurden, um festzustellen, ob SMALLSERIAL oder BIGSERIAL anstelle von SERIAL gerendert werden mussten.

    Referenzen: #3739

oracle

  • [oracle] [bug]

    behoben: Bug in Select.with_for_update.of, bei dem der Oracle-Ansatz "rownum" für LIMIT/OFFSET die Ausdrücke in der "OF"-Klausel nicht berücksichtigte, die auf der obersten Ebene auf Ausdrücke innerhalb der Subquery verweisen müssen. Die Ausdrücke werden nun bei Bedarf zur Subquery hinzugefügt.

    Referenzen: #3741

1.0.13

Veröffentlicht: 16. Mai 2016

orm

  • [orm] [bug]

    behoben: Bug in der "evaluate"-Strategie von Query.update() und Query.delete(), die einen gebundenen Parameter mit einem "callable"-Wert nicht verarbeiten konnte, wie es beim Filtern nach einer Many-to-One-Gleichheitsausdruck entlang einer Beziehung vorkommt.

    Referenzen: #3700

  • [orm] [bug]

    behoben: Bug, bei dem die für Backrefs verwendeten Event-Listener versehentlich mehrmals angewendet werden konnten, wenn eine tiefe Klassenhierarchie in Verbindung mit mehreren Mapper-Konfigurationsschritten verwendet wurde.

    Referenzen: #3710

  • [orm] [bug]

    behoben: Bug, bei dem die Übergabe einer text()-Konstruktion an die Methode Query.group_by() einen Fehler auslöste, anstatt das Objekt als SQL-Fragment zu interpretieren.

    Referenzen: #3706

  • [orm] [bug]

    Anonyme Benennung wird auf eine func-Konstruktion angewendet, die an column_property() übergeben wird, so dass, wenn dasselbe Attribut zweimal als Spaltenausdruck referenziert wird, die Namen dedupliziert werden, wodurch "Mehrdeutige Spalten"-Fehler vermieden werden. Zuvor musste .label(None) angewendet werden, damit der Name de-anonymisiert werden konnte.

    Referenzen: #3663

  • [orm] [bug]

    behoben: Regression, die in der 1.0-Serie im ORM-Laden auftrat, bei der die für eine erwartete fehlende Spalte ausgelöste Ausnahme fälschlicherweise ein NoneType-Fehler war und nicht die erwartete NoSuchColumnError.

    Referenzen: #3658

examples

  • [examples] [bug]

    Geändertes "gerichtetes Graph"-Beispiel, um Integer-IDs von Knoten nicht mehr als signifikant zu betrachten; die "höher"/"niedriger"-Referenzen erlauben nun gegenseitige Kanten in beide Richtungen.

    Referenzen: #3698

sql

  • [sql] [bug]

    behoben: Bug, bei dem bei Verwendung von case_sensitive=False mit einer Engine das Ergebnis fehlerhaft war, da doppelte Spaltennamen im Ergebnis nicht korrekt berücksichtigt wurden, was bei der Ausführung der Anweisung in 1.0 zu einem Fehler führte und die Ausnahme "Mehrdeutige Spalte" in 1.1 verhinderte.

    Referenzen: #3690

  • [sql] [bug]

    behoben: Bug, bei dem die Negation eines EXISTS-Ausdrucks nicht korrekt als boolescher Typ im Ergebnis typisiert wurde und auch nicht anonym als Alias in einer SELECT-Liste aufgeführt wurde, wie es bei einem nicht-negierten EXISTS-Konstrukt der Fall ist.

    Referenzen: #3682

  • [sql] [bug]

    behoben: Bug, bei dem die Ausnahme "unconsumed column names" nicht ausgelöst wurde, wenn Insert.values() mit einer Liste von Parameterzuordnungen aufgerufen wurde, anstatt mit einer einzelnen Zuordnung von Parametern. Pull-Request von Athena Yao.

    Referenzen: #3666

postgresql

  • [postgresql] [bug]

    Unterstützung für die Erkennung von Trennungen für den Fehlertext "SSL error: decryption failed or bad record mac" hinzugefügt. Pull-Request von Iuri de Silvio.

    Referenzen: #3715

mssql

  • [mssql] [bug]

    behoben: Bug, bei dem die ROW_NUMBER OVER-Klausel, die für OFFSET-SELECTS in SQL Server angewendet wurde, fälschlicherweise eine einfache Spalte aus der lokalen Anweisung ersetzte, die sich mit einem Bezeichner überschnitt, der vom ORDER BY-Kriterium der Anweisung verwendet wurde.

    Referenzen: #3711

  • [mssql] [bug] [oracle]

    behoben: Regression, die in der 1.0-Serie auftrat und dazu führte, dass die Oracle- und SQL Server-Dialekte die Ergebnisspalten falsch berücksichtigten, wenn diese Dialekte eine SELECT-Anweisung in eine Subquery verpackten, um LIMIT/OFFSET-Verhalten bereitzustellen, und die ursprüngliche SELECT-Anweisung dieselbe Spalte mehrmals referenzierte, z. B. eine Spalte und einen Alias derselben Spalte. Dieses Problem steht im Zusammenhang mit #3658, da es beim Auftreten des Fehlers auch zu einem NoneType-Fehler führte, anstatt zu melden, dass keine Spalte gefunden werden konnte.

    Referenzen: #3657

oracle

  • [oracle] [bug]

    behoben: Bug im cx_Oracle-Verbindungsprozess, der einen TypeError verursachte, wenn der Benutzer, das Passwort oder die DSN leer waren. Dies verhinderte die externe Authentifizierung bei Oracle-Datenbanken und das Verbinden mit der Standard-DSN. Die Verbindungszeichenfolge oracle:// stellt nun eine Verbindung zur Standard-DSN her und verwendet den Benutzernamen des Betriebssystems, was dem Verbinden mit '/' mit sqlplus entspricht.

    Referenzen: #3705

  • [oracle] [bug]

    behoben: Bug im Ergebnisproxy, der hauptsächlich von Oracle verwendet wurde, wenn Binär- und andere LOB-Typen im Spiel waren, so dass bei Verwendung von Abfrage-/Anweisungscaching die ergebnisprozessortyp-basierten Prozessoren, insbesondere der für den Binärtyp erforderliche, aber auch jeder andere Prozessor, nach dem ersten Durchlauf der Anweisung verloren gingen, da er aus den Metadaten des gecachten Ergebnisses entfernt wurde.

    Referenzen: #3699

misc

  • [bug] [py3k]

    behoben: Bug in der "to_list"-Konvertierung, bei der ein einzelnes Bytes-Objekt in eine Liste einzelner Zeichen umgewandelt wurde. Dies beeinträchtigte unter anderem die Verwendung der Methode Query.get() für einen Primärschlüssel, der ein Bytes-Objekt ist.

    Referenzen: #3660

1.0.12

Veröffentlicht: 15. Februar 2016

orm

  • [orm] [bug]

    behoben: Bug in Session.merge(), bei dem ein Objekt mit einem zusammengesetzten Primärschlüssel, das Werte für einige, aber nicht alle PK-Felder hatte, eine SELECT-Anweisung ausgab, die das interne NEVER_SET-Symbol in die Abfrage leckte, anstatt zu erkennen, dass dieses Objekt keinen durchsuchbaren Primärschlüssel hat und keine SELECT-Anweisung ausgegeben werden sollte.

    Referenzen: #3647

  • [orm] [bug]

    behoben: Regression seit 0.9, bei der das Ladeoptionen-System im 0.9-Stil mehrere undefer_group()-Ladeoptionen in einer einzelnen Abfrage nicht berücksichtigte. Mehrere undefer_group()-Optionen werden nun auch für dieselbe Entität berücksichtigt.

    Referenzen: #3623

engine

  • [engine] [bug] [mysql]

    Erneut betrachtet: #2696, erstmals veröffentlicht in 1.0.10, was versucht, Pythons Mangel an Ausnahme-Kontextberichterstattung zu umgehen, indem eine Warnung für eine Ausnahme ausgegeben wird, die durch eine zweite Ausnahme unterbrochen wurde, als versucht wurde, die bereits fehlgeschlagene Transaktion zurückzusetzen. Dieses Problem tritt weiterhin bei MySQL-Backends in Verbindung mit einem Savepoint auf, der unerwartet verloren geht, was dann einen "no such savepoint"-Fehler beim Zurücksetzen verursacht und die ursprüngliche Bedingung verschleiert.

    Der Ansatz wurde auf die Core "safe reraise"-Funktion verallgemeinert, die im gesamten ORM und Core an allen Stellen stattfindet, an denen eine Transaktion als Reaktion auf einen Fehler beim Commit zurückgesetzt wird, einschließlich der von Session und Connection bereitgestellten Kontextmanager, und bei Operationen wie einem Fehler bei "RELEASE SAVEPOINT" stattfindet. Zuvor war der Fix nur für einen bestimmten Pfad innerhalb des ORM-Flush/Commit-Prozesses vorhanden; er findet nun für alle transaktionalen Kontextmanager statt.

    Referenzen: #2696

sql

  • [sql] [bug]

    behoben: Problem, bei dem das Flag "literal_binds" für insert(), update() oder delete()-Konstrukte beim Kompilieren zu String-SQL nicht weitergegeben wurde. Pull-Request von Tim Tate.

    Referenzen: #3643

  • [sql] [bug]

    behoben: Problem, bei dem die unbeabsichtigte Verwendung der Python-Überschreibung __contains__ mit einem Spaltenausdruck (z. B. durch Verwendung von 'x' in col) bei einem ARRAY-Typ zu einer Endlosschleife führte, da Python dies an den __getitem__-Zugriff delegiert, der für diesen Typ nie eine Ausnahme auslöst. Insgesamt löst die gesamte Verwendung von __contains__ nun NotImplementedError aus.

    Referenzen: #3642

  • [sql] [bug]

    Fehler behoben im Table Metadaten-Konstrukt, das um die 0.9 Serie herum auftrat, wobei das Hinzufügen von Spalten zu einer unpickelten Table die Column in der 'c'-Sammlung nicht korrekt etablierte, was zu Problemen in Bereichen wie der ORM-Konfiguration führte. Dies konnte Anwendungsfälle wie extend_existing und andere beeinträchtigen.

    Referenzen: #3632

postgresql

  • [postgresql] [bug]

    Fehler behoben im text() Konstrukt, wo ein Doppelpunkt-Ausdruck nicht richtig escaped wurde, z.B. some\:\:expr, wie es am häufigsten beim Rendern von PostgreSQL-ähnlichen CAST-Ausdrücken erforderlich ist.

    Referenzen: #3644

mssql

  • [mssql] [bug]

    Die Syntax der extract() Funktion wurde korrigiert, wenn sie auf MSSQL gegen einen Datums-/Zeitwert angewendet wurde; die Anführungszeichen um das Schlüsselwort wurden entfernt. Pull-Request von Guillaume Doumenc.

    Referenzen: #3624

  • [mssql] [bug] [firebird]

    Behobene Regression in 1.0, bei der das Eager-Fetching von cursor.rowcount für eine UPDATE- oder DELETE-Anweisung, die über Plain Text oder über den text()-Konstrukt ausgegeben wurde, nicht mehr aufgerufen wurde. Dies beeinträchtigte Treiber, die cursor.rowcount löschen, sobald der Cursor geschlossen ist, wie z.B. SQL Server ODBC- und Firebird-Treiber.

    Referenzen: #3622

oracle

  • [oracle] [bug] [jython]

    Ein kleines Problem im Jython Oracle Compiler wurde behoben, das das Rendern von "RETURNING" betraf. Dies ermöglicht es diesem derzeit nicht unterstützten/getesteten Dialekt, rudimentär mit der 1.0-Serie zu funktionieren. Pull-Request von Carlos Rivas.

    Referenzen: #3621

misc

  • [bug] [py3k]

    Fehler behoben, bei dem einige Wiederholungsversuche von Ausnahmen die Ausnahme selbst als "Ursache" anhängten; während der Python 3 Interpreter damit einverstanden ist, konnte dies zu Endlosschleifen in iPython führen.

    Referenzen: #3625

1.0.11

Veröffentlicht: 22. Dezember 2015

orm

  • [orm] [bug]

    Regression behoben, die in 1.0.10 durch die Korrektur von #3593 verursacht wurde. Die hinzugefügte Prüfung für ein polumorphes joinedload von einer poly_subclass->class->poly_baseclass-Verbindung schlug für das Szenario class->poly_subclass->class fehl.

    Referenzen: #3611

  • [orm] [bug]

    Fehler behoben, bei dem Session.bulk_update_mappings() und verwandte Funktionen einen Versionszähler nicht erhöhten, wenn sie in Gebrauch waren. Die Erfahrung hier ist immer noch etwas holprig, da die ursprüngliche Versions-ID in den bereitgestellten Dictionaries erforderlich ist und es hier noch keine saubere Fehlerberichterstattung gibt.

    Referenzen: #3610

  • [orm] [bug]

    Umfangreiche Korrekturen an der Flagge Mapper.eager_defaults. Diese Flagge wurde nicht korrekt beachtet, wenn mehrere UPDATE-Anweisungen ausgegeben werden sollten, sei es als Teil eines Flushs oder einer Bulk-Update-Operation. Zusätzlich wurde RETURNING unnötigerweise in UPDATE-Anweisungen ausgegeben.

    Referenzen: #3609

  • [orm] [bug]

    Fehler behoben, bei dem die Verwendung der Methode Query.select_from() zu einem Fehler bei einem nachfolgenden Aufruf der Methode Query.with_parent() führte.

    Referenzen: #3606

sql

  • [sql] [bug]

    Fehler behoben in Update.return_defaults(), der dazu führte, dass alle Spalten mit Standardwerten für Einfügungen, die nicht bereits im SET-Teil enthalten waren (z. B. Primärschlüsselspalten), in RETURNING gerendert wurden, obwohl es sich um ein UPDATE handelte.

    Referenzen: #3609

mysql

  • [mysql] [bug]

    Eine Anpassung des regulären Ausdrucks, der zur Analyse von MySQL-Views verwendet wird, sodass wir nicht mehr davon ausgehen, dass das Schlüsselwort "ALGORITHM" in der reflektierten View-Quelle vorhanden ist, da einige Benutzer berichtet haben, dass es in einigen Amazon RDS-Umgebungen nicht vorhanden ist.

    Referenzen: #3613

  • [mysql] [bug]

    Neue reservierte Wörter für MySQL 5.7 zum MySQL-Dialekt hinzugefügt, darunter 'generated', 'optimizer_costs', 'stored', 'virtual'. Pull-Request von Hanno Schlichting.

misc

  • [bug] [ext]

    Weitere Korrekturen an #3605, der pop-Methode auf MutableDict, bei der das Argument "default" nicht enthalten war.

    Referenzen: #3605

  • [bug] [ext]

    Fehler im Baked-Loader-System behoben, bei dem das systemweite Monkeypatching zum Einrichten von Baked Lazy Loaders mit anderen Laderstrategien, die Lazy Loading als Fallback verwenden (z. B. Joined- und Subquery-Eager-Loader), interferierte, was zu IndexError-Ausnahmen zur Mapper-Konfigurationszeit führte.

    Referenzen: #3612

1.0.10

Veröffentlicht: 11. Dezember 2015

orm

  • [orm] [bug]

    Fehler behoben, bei dem post_update bei einer Many-to-One-Beziehung keine UPDATE-Anweisung ausgab, wenn das Attribut auf None gesetzt und vorher nicht geladen wurde.

    Referenzen: #3599

  • [orm] [bug]

    Fehler behoben, der tatsächlich eine Regression zwischen den Versionen 0.8.0 und 0.8.1 aufgrund von #2714 war. Der Fall, in dem Joined-Eager-Loading über eine Subclass-gebundene Beziehung joinen musste, wenn "with_polymorphic" ebenfalls verwendet wurde, schlug fehl, von der richtigen Entität aus zu joinen.

    Referenzen: #3593

  • [orm] [bug]

    Fehler bei Joinedload behoben, der auftrat, wenn a. die Abfrage LIMIT/OFFSET-Kriterien enthielt, die eine Subquery erzwingen, b. die Beziehung "secondary" verwendet, c. die Primaryjoin der Beziehung auf eine Spalte verweist, die entweder nicht Teil des Primärschlüssels ist, oder eine PK-Spalte in einer Joined-Inheritance-Subclass-Tabelle ist, die unter einem anderen Attributnamen als die Primärschlüsselspalte der Eltern-Tabelle steht, d. die Abfrage die Spalten, die in der Primaryjoin enthalten sind, typischerweise durch Nicht-Aufnahme in load_only() verzögert; die notwendige Spalte(n) wären nicht in der Subquery vorhanden und würden ungültige SQL erzeugen.

    Referenzen: #3592

  • [orm] [bug]

    Ein seltener Fall, der auftritt, wenn ein Session.rollback() im Geltungsbereich einer Session.flush()-Operation fehlschlägt, die eine Ausnahme auslöst, wie in einigen MySQL SAVEPOINT-Fällen beobachtet, verhindert, dass die ursprüngliche Datenbank-Ausnahme beobachtet wird, wenn sie während des Flushs ausgelöst wurde, aber nur auf Py2K, da Py2K keine Ausnahmekettenbildung unterstützt; auf Py3K wird die auslösende Ausnahme verkettet. Als Workaround wird in diesem speziellen Fall eine Warnung ausgegeben, die zumindest die String-Nachricht des ursprünglichen Datenbankfehlers anzeigt, bevor wir mit dem Auslösen der vom Rollback ausgelösten Ausnahme fortfahren.

    Referenzen: #2696

orm declarative

  • [orm] [declarative] [bug]

    Fehler behoben, bei dem in Py2K ein Unicode-Literal nicht als String-Name einer Klasse oder eines anderen Arguments innerhalb von Deklarativ unter Verwendung von backref() auf relationship() akzeptiert wurde. Pull-Request von Nils Philippsen.

sql

  • [sql] [feature]

    Unterstützung für parameterorientierte SET-Klauseln in einer UPDATE-Anweisung hinzugefügt. Diese Funktion ist verfügbar, indem die Flagge update.preserve_parameter_order entweder an das Kern-Konstrukt Update übergeben oder alternativ zum Query.update.update_args Dictionary auf ORM-Ebene hinzugefügt wird, wobei auch die Parameter selbst als Liste von 2-Tupeln übergeben werden. Dank Gorka Eguileor für Implementierung und Tests.

  • [sql] [bug]

    Fehler im Konstrukt Insert.from_select() behoben, bei dem die Select-Konstruktsammlung ._raw_columns in-place mutiert wurde, wenn das Insert-Konstrukt kompiliert wurde, wenn die Ziel-Tabelle Table Python-seitige Standardwerte hat. Das Select-Konstrukt würde nach der Kompilierung des Insert-Konstrukts mit der fehlerhaften Spalte eigenständig kompiliert werden, und die Insert-Anweisung selbst würde bei einem zweiten Kompilierungsversuch aufgrund doppelter gebundener Parameter fehlschlagen.

    Referenzen: #3603

  • [sql] [bug] [postgresql]

    Fehler behoben, bei dem CREATE TABLE mit einer leeren Tabelle, aber einer Einschränkung wie einer CHECK-Einschränkung einen fehlerhaften Komma in der Definition rendern würde; dieses Szenario kann beispielsweise bei einer PostgreSQL INHERITS-Tabelle auftreten, die keine eigenen Spalten hat.

    Referenzen: #3598

postgresql

  • [postgresql] [bug]

    Fehler behoben, bei dem der PostgreSQL-spezifische SELECT-Modifikator "FOR UPDATE OF" fehlschlagen würde, wenn die referenzierte Tabelle einen Schemanamen-Qualifizierer hatte; PG benötigt, dass der Schemaname weggelassen wird. Pull-Request von Diana Clarke.

    Referenzen: #3573

  • [postgresql] [bug]

    Fehler behoben, bei dem einige Varianten von SQL-Ausdrücken, die an die "where"-Klausel von ExcludeConstraint übergeben wurden, nicht korrekt akzeptiert wurden. Pull-Request von aisch.

  • [postgresql] [bug]

    Das Attribut .python_type von INTERVAL wurde korrigiert, um datetime.timedelta zurückzugeben, genau wie bei python_type, anstatt NotImplementedError auszulösen.

    Referenzen: #3571

mysql

  • [mysql] [bug]

    Fehler bei der MySQL-Reflektion behoben, bei dem der "Bruchstückabschnitt" der Typen DATETIME, TIMESTAMP und TIME falsch in das Attribut timezone, das von MySQL nicht verwendet wird, anstatt in das Attribut fsp eingeordnet wurde.

    Referenzen: #3602

mssql

  • [mssql] [bug]

    Der Fehler "20006: Write to the server failed" wurde der Liste der Trennungsfehler für den Pymssql-Treiber hinzugefügt, da beobachtet wurde, dass dies eine Verbindung unbrauchbar macht.

    Referenzen: #3585

  • [mssql] [bug]

    Ein aussagekräftiger ValueError wird nun ausgelöst, falls der SQL Server ein ungültiges Datums- oder Zeitformat von einer DATE- oder TIME-Spalte zurückgibt, anstatt mit einem NoneType-Fehler zu scheitern. Pull-Request von Ed Avis.

  • [mssql] [bug]

    Fehler behoben, bei dem die DDL, die für die MSSQL-Typen DATETIME2, TIME und DATETIMEOFFSET mit einer Präzision von "Null" generiert wurde, das Präzisionsfeld nicht generierte. Pull-Request von Jacobo de Vera.

tests

  • [tests] [change]

    Die ORM- und Core-Tutorials, die immer im Doctest-Format vorlagen, werden nun sowohl in Python 2 als auch in Python 3 innerhalb der normalen Unit-Test-Suite ausgeführt.

misc

  • [bug] [ext]

    Unterstützung für die Methoden dict.pop() und dict.popitem() wurde zur Klasse MutableDict hinzugefügt.

    Referenzen: #3605

  • [bug] [py3k]

    Aktualisierungen von internen getargspec()-Aufrufen, einige py36-bezogene Fixture-Aktualisierungen und Änderungen an zwei Iteratoren, die anstelle von StopIteration "zurückgeben", damit Tests ohne Fehler oder Warnungen auf Py3.5, Py3.6 erfolgreich sind. Pull-Requests von Jacob MacDonald, Luri de Silvio und Phil Jones.

  • [bug] [ext]

    Ein Problem bei Baked-Queries wurde behoben, bei dem die .get()-Methode, die entweder direkt oder in Lazy Loads verwendet wurde, die "get-Klausel" des Mappers nicht als Teil des Cache-Schlüssels berücksichtigte, was zu Abweichungen bei gebundenen Parametern führte, wenn die Klausel neu generiert wurde. Diese Klausel wird von Mappern im Fly gecacht, kann aber in stark nebenläufigen Szenarien beim ersten Zugriff mehrmals generiert werden.

    Referenzen: #3597

1.0.9

Veröffentlicht: 20. Oktober 2015

orm

  • [orm] [feature]

    Neue Methode Query.one_or_none() hinzugefügt; identisch mit Query.one(), gibt aber None zurück, wenn keine Zeile gefunden wird. Pull-Request von esiegerman.

  • [orm] [bug] [postgresql]

    Regression in 1.0 behoben, bei der die neue Funktion zur Verwendung von "executemany" für UPDATE-Anweisungen im ORM (z.B. UPDATE-Anweisungen werden nun mit executemany() in einem Flush gebündelt) unter PostgreSQL und anderen RETURNING-Backends bei serverseitigen Versionsgenerierungsschemata fehlschlug, da der serverseitige Wert über RETURNING abgerufen wird, was mit executemany nicht unterstützt wird.

    Referenzen: #3556

  • [orm] [bug]

    Seltene TypeError behoben, die auftreten konnte, wenn bestimmte Arten von internen Spalten-Laderoptionen in der internen Protokollierung als String dargestellt wurden.

    Referenzen: #3539

  • [orm] [bug]

    Fehler in Session.bulk_save_objects() behoben, bei dem eine gemappte Spalte mit einem "fetch on update"-Wert, die nicht lokal im gegebenen Objekt vorhanden war, einen AttributeError innerhalb der Operation verursachte.

    Referenzen: #3525

  • [orm] [bug]

    Regression in 1.0 behoben, bei der die "noload"-Laderstrategie für eine Many-to-One-Beziehung fehlschlug. Der Lader verwendete eine API, um "None" in das Dictionary zu schreiben, was tatsächlich keinen Wert mehr schrieb; dies ist eine Nebenwirkung von #3061.

    Referenzen: #3510

examples

  • [examples] [bug]

    Zwei Probleme im "history_meta"-Beispiel behoben, bei denen die Historienverfolgung auf eine leere Historie stoßen konnte und bei denen eine Spalte, die auf einen alternativen Attributnamen abgebildet war, nicht korrekt verfolgt wurde. Korrekturen von Alex Fraser.

sql

  • [sql] [bug]

    Regression im Standardprozessor für Multi-VALUES INSERT-Anweisungen der 1.0-Version, #3288, behoben, bei der der Spaltentyp für die Standardwert-haltende Spalte nicht an die kompilierte Anweisung weitergegeben wurde, wenn der Standardwert verwendet wurde, was dazu führte, dass Bindungs-Level-Typ-Handler nicht aufgerufen wurden.

    Referenzen: #3520

postgresql

  • [postgresql] [bug]

    Eine Anpassung der neuen PostgreSQL-Funktion zur Reflektion von Speicheroptionen und USING von #3455, die in 1.0.6 veröffentlicht wurde, um die Funktion für PostgreSQL-Versionen < 8.2 zu deaktivieren, bei denen die Spalte reloptions nicht bereitgestellt wird; dies ermöglicht, dass Amazon Redshift wieder funktioniert, da es auf einer PostgreSQL-Version 8.0.x basiert. Korrektur von Pete Hollobon.

oracle

  • [oracle] [bug] [py3k]

    Unterstützung für cx_Oracle Version 5.2 behoben, die die Versionserkennung von SQLAlchemy unter Python 3 beeinträchtigte und versehentlich nicht den richtigen Unicode-Modus für Python 3 verwendete. Dies führte zu Problemen wie falsch interpretierten NULL-Werten für gebundene Variablen und stillschweigend nicht zurückgegebenen Zeilen.

    Diese Änderung wird auch zurückportiert auf: 0.7.0b1

    Referenzen: #3491

  • [oracle] [bug]

    Fehler im Oracle-Dialekt behoben, bei dem die Reflektion von Tabellen und anderen Symbolen mit Namen, die in Kleinschreibung gezwungen wurden, in Reflektionsabfragen nicht richtig identifiziert wurde. Das Konstrukt quoted_name wird nun auf eingehende Symbolnamen angewendet, die im Prozess der "Namensnormalisierung" als erzwungenermaßen kleingeschrieben erkannt werden.

    Referenzen: #3548

misc

  • [feature] [ext]

    Der Parameter AssociationProxy.info wurde dem Konstruktor von AssociationProxy hinzugefügt, um den Akzessor AssociationProxy.info zu unterstützen, der in #2971 hinzugefügt wurde. Dies ist möglich, da AssociationProxy explizit konstruiert wird, im Gegensatz zu einem Hybrid, das implizit über die Decorator-Syntax konstruiert wird.

    Referenzen: #3551

  • [bug] [sybase]

    Zwei Probleme bei der Sybase-Reflektion behoben, die es erlaubten, Tabellen ohne Primärschlüssel zu reflektieren und sicherstellten, dass eine SQL-Anweisung, die an der Fremdschlüssel-Erkennung beteiligt ist, vorab geholt wird, um Treiberprobleme bei verschachtelten Abfragen zu vermeiden. Korrekturen von Eugene Zapolsky; Beachten Sie, dass wir Sybase derzeit nicht lokal testen können, um diese Änderungen zu verifizieren.

    Referenzen: #3508, #3509

1.0.8

Veröffentlicht: 22. Juli 2015

engine

  • [engine] [bug]

    Kritisches Problem behoben, bei dem der Pool "checkout" Event-Handler gegen eine veraltete Verbindung aufgerufen werden konnte, ohne dass der "connect" Event-Handler aufgerufen wurde, wenn der Pool versuchte, sich nach der Ungültigkeit wieder zu verbinden und fehlschlug; die veraltete Verbindung blieb vorhanden und wurde bei einem nachfolgenden Versuch verwendet. Dieses Problem hat in der 1.0-Serie nach 1.0.2 eine größere Auswirkung, da es auch ein leeres .info-Dictionary an den Event-Handler liefert; vor 1.0.2 war das .info-Dictionary noch das vorherige.

    Diese Änderung wird auch zurückportiert auf: 0.7.0b1

    Referenzen: #3497

sqlite

  • [sqlite] [bug]

    Fehler im SQLite-Dialekt behoben, bei dem die Reflektion von UNIQUE-Einschränkungen, die nicht-alphabetische Zeichen in ihren Namen enthielten (wie Punkte oder Leerzeichen), nicht mit ihrem Namen reflektiert wurde.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3495

misc

  • [misc] [bug]

    Ein Problem behoben, bei dem eine bestimmte Basisklasse in utils __slots__ nicht implementierte und daher bedeutete, dass alle Unterklassen dieser Klasse dies auch nicht taten, was den Grund für die Verwendung von __slots__ negierte. Dies verursachte keine Probleme, außer bei IronPython, das anscheinend das __slots__-Verhalten nicht kompatibel mit cPython implementiert.

    Referenzen: #3494

1.0.7

Veröffentlicht: 20. Juli 2015

orm

  • [orm] [bug]

    Regression in 1.0 behoben, bei der Wertobjekte, die __eq__() überschreiben, um ein nicht boolesches Objekt zurückzugeben (wie einige GeoAlchemy-Typen sowie Numpy-Typen), während einer Unit-of-Work-Update-Operation auf booleschen Wert getestet wurden. In 0.9 wurde der Rückgabewert von __eq__() gegen "is True" getestet, um dies zu verhindern.

    Referenzen: #3469

  • [orm] [bug]

    Regression in 1.0 behoben, bei der ein "deferred" Attribut nicht korrekt aufgefüllt wurde, wenn es innerhalb des "optimized inheritance load" geladen wurde. Dies ist ein spezielles SELECT, das im Fall von Joined-Table-Inheritance ausgegeben wird, um abgelaufene oder ungeladene Attribute gegen eine Joined-Table zu füllen, ohne die Basis-Table zu laden. Dies hängt damit zusammen, dass SQLA 1.0 nicht mehr über das Laden von Deferred-Spalten rät und explizit angewiesen werden muss.

    Referenzen: #3468

  • [orm] [bug]

    Fehler behoben in 1.0 Regression, bei der die "Elternentität" eines synonym zugeordneten Attributs auf einem aliased() Objekt auf den ursprünglichen Mapper aufgelöst wurde, nicht auf die aliased() Version davon, was zu Problemen für eine Query führte, die sich auf dieses Attribut verlässt (z. B. ist es das einzige repräsentative Attribut, das im Konstruktor übergeben wird), um die korrekte FROM-Klausel für die Abfrage zu ermitteln.

    Referenzen: #3466

orm declarative

  • [orm] [declarative] [bug]

    Fehler in der Erweiterung AbstractConcreteBase behoben, bei der eine Spaltenkonfiguration auf der ABC-Basis, die einen anderen Attributnamen als Spaltennamen hatte, nicht korrekt auf der endgültigen Basisklasse zugeordnet wurde. Das Versagen unter 0.9 war lautlos, während es unter 1.0 einen ArgumentError auslöste, sodass es möglicherweise vor 1.0 nicht bemerkt wurde.

    Referenzen: #3480

engine

  • [engine] [bug]

    Regression behoben, bei der neue Methoden auf ResultProxy, die vom ORM Query Objekt verwendet werden (Teil der Leistungsverbesserungen von #3175), nicht die Ausnahme "dieses Ergebnis gibt keine Zeilen zurück" auslösten, wenn der Treiber (typischerweise MySQL) die Cursorbeschreibung nicht korrekt generieren konnte; stattdessen wurde ein AttributeError gegen NoneType ausgelöst.

    Referenzen: #3481

  • [engine] [bug]

    Regression behoben, bei der ResultProxy.keys() unveränderte interne Symbolnamen für "anonyme" Bezeichnungen zurückgab, wie z. B. "foo_1" für SQL-Funktionen ohne Bezeichnungen und ähnliche. Dies war eine Nebenwirkung der Leistungsverbesserungen, die als Teil von #918 implementiert wurden.

    Referenzen: #3483

sql

  • [sql] [feature]

    Methode ColumnElement.cast() hinzugefügt, die denselben Zweck erfüllt wie die eigenständige Funktion cast(). Pull Request von Sebastian Bank.

    Referenzen: #3459

  • [sql] [bug]

    Fehler behoben, bei dem die Umwandlung von wörtlichen True oder False Konstanten in Verbindung mit and_() oder or_() mit einem AttributeError fehlschlug.

    Referenzen: #3490

  • [sql] [bug]

    Potentielles Problem behoben, bei dem eine benutzerdefinierte Unterklasse von FunctionElement oder ein anderes Spaltenelement, das fälschlicherweise 'None' oder ein anderes ungültiges Objekt als Attribut .type angibt, diese Ausnahme meldet anstatt eines Rekursionsüberlaufs.

    Referenzen: #3485

  • [sql] [bug]

    Fehler behoben, bei dem der Modulo-SQL-Operator aufgrund einer fehlenden Methode __rmod__ nicht umgekehrt funktionierte. Pull Request von dan-gittik.

schema

  • [schema] [feature]

    Unterstützung für die Argumente MINVALUE, MAXVALUE, NO MINVALUE, NO MAXVALUE und CYCLE für CREATE SEQUENCE hinzugefügt, wie sie von PostgreSQL und Oracle unterstützt werden. Pull Request von jakeogh.

1.0.6

Veröffentlicht: 25. Juni 2015

orm

  • [orm] [bug]

    Größere Regression in der 1.0-Serie behoben, bei der die Funktion version_id_counter den Versionszähler eines Objekts erhöhte, wenn keine Nettoänderung an der Zeile des Objekts vorgenommen wurde, sondern stattdessen ein Objekt, das über eine Beziehung (z. B. typischerweise Many-to-One) damit verbunden war, assoziiert oder de-assoziiert wurde, was zu einer UPDATE-Anweisung führte, die nur den Versionszähler des Objekts aktualisierte. Im Fall, dass die relativ neueren Funktionen "server-seitiger" und/oder "programmatischer/bedingter" Versionszähler verwendet wurden (z. B. version_id_generator auf False gesetzt), konnte der Fehler dazu führen, dass ein UPDATE ohne gültige SET-Klausel ausgegeben wurde.

    Referenzen: #3465

  • [orm] [bug]

    1.0-Regression behoben, bei der das erweiterte Verhalten von Joins mit einfacher Vererbung von #3222 unangemessen für einen JOIN mit expliziten Join-Kriterien mit einer Unterklasse einfacher Vererbung stattfand, die keinen Diskriminator verwendet, was zu einer zusätzlichen "AND NULL"-Klausel führte.

    Referenzen: #3462

  • [orm] [bug]

    Fehler in der neuen Funktion Session.bulk_update_mappings() behoben, bei der die Primärschlüsselspalten, die in der WHERE-Klausel zur Lokalisierung der Zeile verwendet wurden, auch in die SET-Klausel aufgenommen wurden, wodurch ihr Wert unnötigerweise auf sich selbst gesetzt wurde. Pull Request von Patrick Hayes.

    Referenzen: #3451

  • [orm] [bug]

    Unerwartete Verwendungsregression behoben, bei der benutzerdefinierte Comparator Objekte, die die Methode __clause_element__() verwendeten und ein Objekt zurückgaben, das ein ORM-zugeordnetes InstrumentedAttribute und nicht explizit ein ColumnElement war, nicht korrekt behandelt wurden, wenn sie als Ausdruck an Session.query() übergeben wurden. Die Logik in 0.9 war zufällig erfolgreich damit, sodass dieser Anwendungsfall jetzt unterstützt wird.

    Referenzen: #3448

sql

  • [sql] [bug]

    Fehler behoben, bei dem die Klauselanpassung, wie sie auf ein Label-Objekt angewendet wurde, die bezeichnete SQL-Ausdruck nicht in allen Fällen korrekt anpasste, sodass jede SQL-Operation, die Label.self_group() verwendete, den ursprünglichen, nicht angepassten Ausdruck verwendete. Eine Auswirkung davon war, dass ein ORM aliased()-Konstrukt Attribute, die von column_property zugeordnet wurden, nicht vollständig berücksichtigte, sodass die nicht-aliasiertete Tabelle austreten konnte, wenn die Eigenschaft in einigen Arten von SQL-Vergleichen verwendet wurde.

    Referenzen: #3445

postgresql

  • [postgresql] [feature]

    Unterstützung für Speicherparameter unter CREATE INDEX hinzugefügt, unter Verwendung eines neuen Schlüsselwortarguments postgresql_with. Unterstützung für die Reflexion hinzugefügt, um sowohl das Flag postgresql_with als auch das Flag postgresql_using zu unterstützen, die nun auf Index Objekte gesetzt werden, die reflektiert werden, sowie in einem neuen Wörterbuch "dialect_options" im Ergebnis von Inspector.get_indexes() vorhanden sind. Pull Request von Pete Hollobon.

    Referenzen: #3455

  • [postgresql] [feature]

    Neue Ausführungsoption max_row_buffer hinzugefügt, die vom psycopg2-Dialekt interpretiert wird, wenn die Option stream_results verwendet wird und die Größe des Zeilenpuffers begrenzt, der zugewiesen werden kann. Dieser Wert wird auch basierend auf dem ganzzahligen Wert bereitgestellt, der an Query.yield_per() übergeben wird. Pull Request von mcclurem.

  • [postgresql] [bug] [pypy]

    Dieses Problem wurde erneut behoben, das zuerst in 1.0.5 veröffentlicht wurde, um die JSONB-Unterstützung von psycopg2cffi erneut zu beheben, da diese in Version 2.7.1 plötzlich die bedingungslose Dekodierung von JSONB-Typen aktivierten. Die Versionserkennung gibt nun 2.7.1 als den Zeitpunkt an, ab dem erwartet wird, dass der DBAPI die JSON-Kodierung für uns durchführt.

    Referenzen: #3439

  • [postgresql] [bug]

    Das Konstrukt ExcludeConstraint wurde repariert, um gängige Funktionen zu unterstützen, die andere Objekte wie Index nun haben, nämlich dass der Spaltenausdruck als beliebiger SQL-Ausdruck angegeben werden kann, wie z. B. cast oder text.

    Referenzen: #3454

mssql

  • [mssql] [bug]

    Problem behoben bei der Verwendung des Typs VARBINARY in Verbindung mit einem INSERT von NULL + pyodbc; pyodbc benötigt ein spezielles Objekt, das übergeben wird, um NULL zu speichern. Da der Typ VARBINARY aufgrund von #3039 nun standardmäßig für LargeBinary verwendet wird, ist dieses Problem in 1.0 teilweise eine Regression. Der pymssql-Treiber scheint nicht betroffen zu sein.

    Referenzen: #3464

misc

  • [bug] [documentation]

    Interne "Memoization"-Routine für Methodentypen korrigiert, sodass kein Python-Deskriptor mehr verwendet wird; repariert die Inspektionsfähigkeit dieser Methoden, einschließlich der Unterstützung für Sphinx-Dokumentation.

    Referenzen: #2077

1.0.5

Veröffentlicht: 7. Juni 2015

orm

  • [orm] [feature]

    Neues Ereignis InstanceEvents.refresh_flush() hinzugefügt, das aufgerufen wird, wenn ein DEFAULT-Wert auf INSERT- oder UPDATE-Ebene, der über RETURNING oder einen Python-seitigen Standardwert abgerufen wurde, innerhalb des Flush-Prozesses aufgerufen wird. Dies soll einen Hook bereitstellen, der infolge von #3167 nicht mehr vorhanden ist, bei dem Attribut- und Validierungsereignisse während des Flush-Prozesses nicht mehr aufgerufen werden.

    Referenzen: #3427

  • [orm] [bug]

    Das "leichtgewichtige Named-Tuple", das verwendet wurde, wenn eine Query Zeilen zurückgab, implementierte __slots__ nicht korrekt, sodass es immer noch ein __dict__ hatte. Dies wurde behoben, aber in dem extrem unwahrscheinlichen Fall, dass jemand Werte in die zurückgegebenen Tupel zugewiesen hat, funktioniert dies nicht mehr.

    Referenzen: #3420

engine

  • [engine] [feature]

    Neues Engine-Ereignis ConnectionEvents.engine_disposed() hinzugefügt. Wird aufgerufen, nachdem die Methode Engine.dispose() aufgerufen wurde.

  • [engine] [feature]

    Anpassungen am Engine-Plugin-Hook, sodass die Methode URL.get_dialect() das endgültige Dialect-Objekt zurückgibt, wenn ein Dialekt-Plugin verwendet wird, ohne dass der Aufrufer die Methode Dialect.get_dialect_cls() kennen muss.

    Referenzen: #3379

  • [engine] [bug]

    Fehler behoben, bei dem bekannte boolesche Werte, die von engine_from_config() verwendet wurden, nicht korrekt geparst wurden; dazu gehörten pool_threadlocal und das psycopg2-Argument use_native_unicode.

    Referenzen: #3435

  • [engine] [bug]

    Unterstützung für den Fall des fehlverhaltenden DBAPI hinzugefügt, bei dem PEP-249-Ausnahmern auf Ausnahmeklassen mit einem völlig anderen Namen verweisen, was verhindert, dass die eigene Ausnahmebehandlung von SQLAlchemy den Fehler ordnungsgemäß einwickelt. Der verwendete SQLAlchemy-Dialekt muss einen neuen Akzessor DefaultDialect.dbapi_exception_translation_map implementieren, um diese Funktion zu unterstützen; dies ist jetzt für den py-postgresql-Dialekt implementiert.

    Referenzen: #3421

  • [engine] [bug]

    Fehler behoben im Fall, dass Pool-Checkout-Ereignis-Handler verwendet werden und Verbindungsversuche im Handler selbst fehlschlagen, wurde der zugehörige Verbindungseintrag erst freigegeben, wenn der Stack-Trace des Verbindungsfehlers selbst freigegeben wurde. Bei einem Testpool mit nur einer Verbindung bedeutete dies, dass der Pool vollständig ausgecheckt war, bis dieser Stack-Trace freigegeben wurde. Dies beeinträchtigt hauptsächlich sehr spezifische Debugging-Szenarien und war wahrscheinlich in keiner Produktionsanwendung auffällig. Die Korrektur führt ein explizites Check-in des Eintrags durch, bevor die abgefangene Ausnahme erneut ausgelöst wird.

    Referenzen: #3419

sql

  • [sql] [feature]

    Offizielle Unterstützung für eine CTE hinzugefügt, die von der SELECT-Anweisung innerhalb von Insert.from_select() verwendet wird. Dieses Verhalten funktionierte bis 0.9.9 versehentlich, als es aufgrund unerhebliche Änderungen im Rahmen von #3248 nicht mehr funktionierte. Beachten Sie, dass dies die Darstellung der WITH-Klausel nach dem INSERT vor dem SELECT ist; die volle Funktionalität von CTEs, die auf der obersten Ebene von INSERT, UPDATE, DELETE dargestellt werden, ist eine neue Funktion, die für eine spätere Version vorgesehen ist.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3418

postgresql

  • [postgresql] [bug] [pypy]

    Einige Typ- und Testprobleme im Zusammenhang mit dem pypy psycopg2cffi-Dialekt wurden repariert, insbesondere dass die aktuelle Version 2.7.0 keine native Unterstützung für den JSONB-Typ hat. Die Versionserkennung für psycopg2-Funktionen wurde in eine spezifische Unterversion für psycopg2cffi feinabgestimmt. Zusätzlich wurde die Testabdeckung für die gesamte Serie von psycopg2-Funktionen unter psycopg2cffi aktiviert.

    Referenzen: #3439

mssql

  • [mssql] [bug]

    Ein neues Dialektflag legacy_schema_aliasing wurde dem MSSQL-Dialekt hinzugefügt. Wenn dieses auf False gesetzt ist, wird ein sehr altes und obsoletes Verhalten deaktiviert: der Versuch des Compilers, alle schema-qualifizierten Tabellennamen in Aliasnamen umzuwandeln, um alte und nicht mehr lokalisierbare Probleme zu umgehen, bei denen SQL Server einen mehrteiligen Bezeichnernamen unter allen Umständen nicht parsen konnte. Dieses Verhalten verhinderte, dass anspruchsvollere Anweisungen korrekt funktionierten, einschließlich solcher, die Hints verwenden, sowie CRUD-Anweisungen, die korrelierte SELECT-Anweisungen einbetten. Anstatt die Funktion weiterhin zu reparieren, um mit komplexeren Anweisungen zu arbeiten, ist es besser, sie einfach zu deaktivieren, da sie für moderne SQL Server-Versionen nicht mehr benötigt werden sollte. Das Flag ist für die 1.0.x-Serie standardmäßig auf True gesetzt, sodass das aktuelle Verhalten für diese Versionsserie unverändert bleibt. In der 1.1-Serie wird es standardmäßig auf False gesetzt. Für die 1.0-Serie wird, wenn kein Wert explizit festgelegt wird, eine Warnung ausgegeben, wenn eine schema-qualifizierte Tabelle zum ersten Mal in einer Anweisung verwendet wird, was darauf hindeutet, dass das Flag für alle modernen SQL Server-Versionen auf False gesetzt werden sollte.

    Siehe auch

    Legacy Schema Mode

    Referenzen: #3424, #3430

misc

  • [feature] [ext]

    Unterstützung für die Übergabe von *args an die initiale aufrufbare Funktion der gebackenen Abfrage hinzugefügt, auf dieselbe Weise, wie *args für die Methoden BakedQuery.add_criteria() und BakedQuery.with_criteria() unterstützt werden. Anfängliche PR von Naoki INADA.

  • [feature] [ext]

    Eine neue, halb-öffentliche Methode zu MutableBase hinzugefügt: MutableBase._get_listen_keys(). Das Überschreiben dieser Methode ist erforderlich, wenn eine Unterklasse von MutableBase Ereignisse für Attributschlüssel außer dem Schlüssel, mit dem der mutable Typ verknüpft ist, weiterleiten muss, wenn die Ereignisse InstanceEvents.refresh() oder InstanceEvents.refresh_flush() abgefangen werden. Das aktuelle Beispiel hierfür sind Zusammensetzungen, die MutableComposite verwenden.

    Referenzen: #3427

  • [bug] [ext]

    Regression in der Erweiterung sqlalchemy.ext.mutable behoben, als Folge der Fehlerbehebung für #3167, bei der Attribut- und Validierungsereignisse während des Flush-Prozesses nicht mehr aufgerufen werden. Die mutable Erweiterung stützte sich auf dieses Verhalten, wenn ein Python-seitiger Standardwert auf Spaltenebene für die Generierung des neuen Werts bei INSERT oder UPDATE verantwortlich war oder wenn ein Wert aus der RETURNING-Klausel für den Modus "eager defaults" abgerufen wurde. Der neue Wert wurde beim Einfügen nicht mit Ereignissen belegt, und die mutable Erweiterung konnte keine ordnungsgemäße Umwandlung oder Historienverfolgung einrichten. Ein neues Ereignis InstanceEvents.refresh_flush() wird hinzugefügt, das die mutable Erweiterung nun für diesen Anwendungsfall verwendet.

    Referenzen: #3427

1.0.4

Veröffentlicht: 7. Mai 2015

orm

  • [orm] [bug]

    Unerwartete Verwendungsregression behoben, bei der in dem seltenen Fall, dass der PrimaryJoin einer Beziehung eine Vergleichung mit einem nicht-hashbaren Typ wie HSTORE beinhaltete, Lazy Loads aufgrund einer hash-orientierten Prüfung der Statement-Parameter fehlschlugen. Diese wurde in 1.0 infolge von #3061 geändert, um Hashing zu verwenden, und in #3368 geändert, um in häufigeren Fällen als "load on pending" aufzutreten. Die Werte werden nun vorab auf das Attribut __hash__ geprüft.

    Referenzen: #3416

  • [orm] [bug]

    Eine Assertion liberalisiert, die als Teil von #3347 hinzugefügt wurde, um gegen unbekannte Bedingungen beim Einfügen von Inner Joins in Joined Eager Loads mit innerjoin=True zu schützen. Wenn einige der Joins eine "sekundäre" Tabelle verwenden, muss die Assertion weitere Joins entpacken, um erfolgreich zu sein.

    Referenzen: #3347, #3412

  • [orm] [bug]

    Repariert / zu Tests hinzugefügt wurden noch mehr Ausdrücke, die als fehlerhaft gemeldet wurden mit dem neuen 'entity'-Schlüsselwert, der zu Query.column_descriptions hinzugefügt wurde. Die Logik zur Ermittlung der „from“-Klausel wurde erneut überarbeitet, um Spalten aus alias-Namen-Klassen zu berücksichtigen und um den korrekten Wert für das „aliased“-Flag in diesen Fällen zu melden.

    Referenzen: #3320, #3409

schema

tests

  • [tests] [bug] [pypy]

    Ein Import behoben, der verhinderte, dass "pypy setup.py test" korrekt funktionierte.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3406

misc

  • [bug] [ext]

    Fehler behoben, bei dem bei Verwendung des erweiterten Attribut-Instrumentierungsystems die korrekte Ausnahme nicht ausgelöst wurde, wenn class_mapper() mit ungültiger Eingabe aufgerufen wurde, die zufällig nicht schwach referenzierbar war, wie z.B. eine Ganzzahl.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3408

1.0.3

Veröffentlicht: 30. April 2015

orm

  • [orm] [bug] [pypy]

    Regression von 0.9.10 vor der Veröffentlichung behoben, die durch #3349 verursacht wurde, bei der der Prüfvorgang für den Query-Status bei Query.update() oder Query.delete() das leere Tupel mit sich selbst mittels is verglich, was auf PyPy zu True in diesem Fall nicht lieferte. Dies hätte fälschlicherweise eine Warnung in 0.9 und eine Ausnahme in 1.0 ausgelöst.

    Referenzen: #3405

  • [orm] [bug]

    Regression von 0.9.10 vor der Veröffentlichung behoben, bei der die neue Ergänzung von entity zum Query.column_descriptions-Accessor fehlschlug, wenn die Zielentität aus einem Core-Selectable wie einem Table- oder CTE-Objekt erzeugt wurde.

    Referenzen: #3320, #3403

  • [orm] [bug]

    Regression im Flush-Prozess behoben, wenn ein Attribut für ein UPDATE auf einen SQL-Ausdruck gesetzt wurde und der SQL-Ausdruck im Vergleich zum vorherigen Wert des Attributs einen anderen SQL-Vergleich als == oder != ergab, was die Ausnahme "Boolean value of this clause is not defined" auslöste. Die Korrektur stellt sicher, dass die Unit of Work den SQL-Ausdruck nicht auf diese Weise interpretiert.

    Referenzen: #3402

  • [orm] [bug]

    Unerwartete Nutzungsregression behoben aufgrund von #2992, bei der Textual-Elemente, die in die Query.order_by()-Klausel in Verbindung mit Joined Eager Loading eingefügt wurden, so in die Spaltenklausel der inneren Query aufgenommen wurden, dass sie als Tabellen-gebundene Spaltennamen angenommen wurden, im Falle, dass das Joined Eager Load die Query in eine Subquery verpacken muss, um einen Limit/Offset zu berücksichtigen.

    Ursprünglich war das Verhalten hier beabsichtigt, da eine Query wie query(User).order_by('name').limit(1) nach user.name sortieren würde, auch wenn die Query durch Joined Eager Loading in eine Subquery geändert wurde, da 'name' als Symbol interpretiert würde, das in den FROM-Klauseln zu finden ist, in diesem Fall User.name, das dann in die Spaltenklausel kopiert würde, um sicherzustellen, dass es für ORDER BY vorhanden ist. Jedoch antizipiert das Feature den Fall nicht, in dem order_by("name") sich auf einen bestimmten Label-Namen bezieht, der bereits in der lokalen Spaltenklausel vorhanden ist, und nicht auf einen Namen, der an ein Selectable in der FROM-Klausel gebunden ist.

    Darüber hinaus versagt das Feature auch bei veralteten Fällen wie order_by("name desc"), das zwar eine Warnung ausgibt, dass text() hier verwendet werden sollte (beachten Sie, dass das Problem keine Fälle betrifft, in denen text() explizit verwendet wird), aber dennoch eine andere Query als zuvor erzeugt, bei der der Ausdruck "name desc" unangemessen in die Spaltenklausel kopiert wird. Die Auflösung ist so, dass der "Joined Eager Loading"-Aspekt des Features diese sogenannten "Label Reference"-Ausdrücke beim Erweitern der inneren Spaltenklausel überspringt, als ob sie bereits text()-Konstrukte wären.

    Referenzen: #3392

  • [orm] [bug]

    Regression bezüglich des MapperEvents.instrument_class()-Events behoben, dessen Aufruf nach der Instrumentierung der Klasse durch den Klassenmanager verschoben wurde, was das Gegenteil dessen ist, was die Dokumentation für das Event explizit besagt. Der Grund für die Umstellung war, dass Declarative die Einrichtung des vollständigen "Instrumentierungsmanagers" für eine Klasse vornahm, bevor sie für die neuen @declared_attr-Features, die in Verbesserungen an deklarativen Mixins, @declared_attr und verwandten Features beschrieben sind, zugeordnet wurde. Die Änderung erfolgte jedoch auch gegen die klassische Verwendung von Mapper zur Konsistenz. SQLSoup verlässt sich jedoch darauf, dass das Instrumentierungsereignis vor jeglicher Instrumentierung unter klassischer Zuordnung stattfindet. Das Verhalten wurde für klassische und deklarative Zuordnungen rückgängig gemacht, wobei letztere durch die Verwendung einer einfachen Memoization ohne Klassenmanager implementiert wird.

    Referenzen: #3388

  • [orm] [bug]

    Problem im neuen QueryEvents.before_compile()-Event behoben, bei dem Änderungen an der Entitätensammlung des Query-Objekts, die innerhalb des Events geladen werden sollten, in der SQL-Ausgabe gerendert wurden, aber während des Ladevorgangs nicht widergespiegelt wurden.

    Referenzen: #3387

engine

  • [engine] [feature]

    Neue Features zur Unterstützung von Engine/Pool-Plugins mit erweiterten Funktionalitäten hinzugefügt. Ein neues "Soft Invalidate"-Feature wurde dem Connection Pool auf der Ebene des ausgecheckten Connection Wrappers sowie des _ConnectionRecord hinzugefügt. Dies funktioniert ähnlich wie eine moderne Pool-Invalidierung, bei der Verbindungen nicht aktiv geschlossen werden, sondern erst beim nächsten Auschecken recycelt werden. Dies ist im Wesentlichen eine pro-Verbindungs-Version dieser Funktion. Ein neues Event PoolEvents.soft_invalidate() wurde hinzugefügt, um es zu ergänzen.

    Außerdem wurde ein neues Flag hinzugefügt: ExceptionContext.invalidate_pool_on_disconnect. Dies ermöglicht es einem Fehlerhandler innerhalb von ConnectionEvents.handle_error(), einen "Disconnect"-Zustand beizubehalten, aber das Aufrufen von Invalidate für einzelne Verbindungen in einer spezifischen Weise innerhalb des Events zu handhaben.

    Referenzen: #3379

  • [engine] [feature]

    Neues Event do_connect hinzugefügt, das das Abfangen/Ersetzen des Aufrufs des Dialect.connect()-Hooks zum Erstellen einer DBAPI-Verbindung ermöglicht. Ebenfalls hinzugefügt wurden Dialekt-Plugin-Hooks Dialect.get_dialect_cls() und Dialect.engine_created(), die es externen Plugins ermöglichen, Events zu bestehenden Dialekten über Entry Points hinzuzufügen.

    Referenzen: #3355

sql

  • [sql] [feature]

    Platzhalter-Methode TypeEngine.compare_against_backend() hinzugefügt, die nun von Alembic-Migrationen ab Version 0.7.6 verwendet wird. Benutzerdefinierte Typen können diese Methode implementieren, um den Vergleich eines Typs mit einem aus der Datenbank reflektierten Typ zu unterstützen.

  • [sql] [bug]

    Fehler behoben, bei dem die Kürzung langer Labels in SQL ein Label erzeugen konnte, das ein anderes, nicht gekürztes Label überlappte; dies lag daran, dass der Längenschwellenwert für die Kürzung größer war als der Teil des Labels, der nach der Kürzung übrig bleibt. Diese beiden Werte wurden nun gleichgesetzt; label_length - 6. Dies hat zur Folge, dass kürzere Spaltenlabels "gekürzt" werden, wo sie vorher nicht gekürzt worden wären.

    Referenzen: #3396

  • [sql] [bug]

    Regression behoben aufgrund von #3282, bei der die tables-Sammlung, die als Keyword-Argument an die DDLEvents.before_create(), DDLEvents.after_create(), DDLEvents.before_drop() und DDLEvents.after_drop() Events übergeben wurde, nicht mehr eine Liste von Tabellen war, sondern stattdessen eine Liste von Tupeln, die einen zweiten Eintrag mit hinzuzufügenden oder zu entfernenden Fremdschlüsseln enthielt. Da die tables-Sammlung, obwohl dokumentiert als nicht unbedingt stabil, immer mehr genutzt wurde, wird diese Änderung als Regression betrachtet. Zusätzlich war diese Sammlung in einigen Fällen für "drop" ein Iterator, der zum Fehler der Operation führen würde, wenn er vorzeitig iteriert wurde. Die Sammlung ist nun in allen Fällen eine Liste von Tabellenobjekten und eine Testabdeckung für das Format dieser Sammlung wurde hinzugefügt.

    Referenzen: #3391

misc

  • [bug] [ext]

    Fehler in Association Proxy behoben, bei dem ein any()/has() auf einen Beziehung->Skalar-Nicht-Objekt-Attributvergleich fehlschlug, z.B. filter(Parent.some_collection_to_attribute.any(Child.attr == 'foo'))

    Referenzen: #3397

1.0.2

Veröffentlicht: 24. April 2015

orm declarative

  • [orm] [declarative] [bug]

    Unerwartete Nutzungsregression bezüglich der deklarativen __declare_first__ und __declare_last__ Accessoren behoben, bei denen diese nicht mehr auf der Superklasse der deklarativen Basis aufgerufen wurden.

    Referenzen: #3383

sql

  • [sql] [bug]

    Regression behoben, die in 1.0.0b4 falsch korrigiert wurde (wodurch sie zu zwei Regressionen wurde); Berichte, dass SELECT-Statements mit GROUP BY auf einen Labelnamen gruppiert wurden und fehlschlugen, wurden missverstanden, dass bestimmte Backends wie SQL Server überhaupt keine ORDER BY- oder GROUP BY-Klauseln für einen einfachen Labelnamen ausgeben sollten; tatsächlich hatten wir vergessen, dass 0.9 bereits ORDER BY auf einen einfachen Labelnamen für alle Backends ausgab, wie in Label-Konstrukte können nun ihren Namen allein in einem ORDER BY rendern beschrieben, obwohl 1.0 eine Überarbeitung dieser Logik im Rahmen von #2992 enthält. Was die Ausgabe von GROUP BY für ein einfaches Label betrifft, so gibt es selbst bei PostgreSQL Fälle, in denen eine Fehlermeldung ausgegeben wird, obwohl das zu gruppierende Label ersichtlich sein sollte, sodass es klar ist, dass GROUP BY niemals automatisch auf diese Weise gerendert werden sollte.

    In 1.0.2 geben SQL Server, Firebird und andere wieder ORDER BY auf einen einfachen Labelnamen aus, wenn ihnen ein Label-Konstrukt übergeben wird, das sich auch in der Spaltenklausel befindet. Zusätzlich gibt kein Backend GROUP BY gegen den einfachen Labelnamen aus, wenn ihm nur ein Label-Konstrukt übergeben wird.

    Referenzen: #3338, #3385

1.0.1

Veröffentlicht: 23. April 2015

orm

  • [orm] [bug]

    Problem behoben, bei dem eine Query der Form query(B).filter(B.a != A(id=7)) das Symbol NEVER_SET rendern würde, wenn ein transienter Objekt übergeben wurde. Für ein persistentes Objekt würde immer der persistierte Datenbankwert und nicht der aktuell gesetzte Wert verwendet. Bei eingeschaltetem Autofflush wäre dies für persistente Werte normalerweise nicht erkennbar, da alle ausstehenden Änderungen ohnehin zuerst geflusht würden. Dies ist jedoch inkonsistent gegenüber der Logik für den nicht-negativen Vergleich query(B).filter(B.a == A(id=7)), der den aktuellen Wert verwendet und zusätzlich Vergleiche mit transienten Objekten zulässt. Der Vergleich verwendet nun den aktuellen Wert und nicht den datenbankseitig gespeicherten Wert.

    Im Gegensatz zu den anderen NEVER_SET-Problemen, die in dieser Version als Regressionen aufgrund von #3061 behoben wurden, ist dieses spezielle Problem mindestens seit 0.8 und möglicherweise früher vorhanden, wurde aber aufgrund der Behebung verwandter NEVER_SET-Probleme entdeckt.

    Referenzen: #3374

  • [orm] [bug]

    Unerwartete Nutzungsregression behoben, verursacht durch #3061, bei der das NEVER_SET-Symbol in beziehungsbezogenen Queries, einschließlich filter() und with_parent() Queries, lecken konnte. In allen Fällen wird das Symbol None zurückgegeben. Allerdings wurden viele dieser Queries sowieso nie korrekt unterstützt und führen zu Vergleichen mit NULL ohne Verwendung des IS-Operators. Aus diesem Grund wird auch eine Warnung zu diesem Teil der Beziehungs-Queries hinzugefügt, die derzeit nicht für IS NULL vorgesehen sind.

    Referenzen: #3371

  • [orm] [bug]

    Regression behoben, verursacht durch #3061, bei der das NEVER_SET-Symbol in eine Lazy-Load-Query lecken konnte, nach dem Flush eines ausstehenden Objekts. Dies trat typischerweise für eine Many-to-One-Beziehung auf, die keine einfache "get"-Strategie verwendet. Die gute Nachricht ist, dass die Korrektur die Effizienz gegenüber 0.9 verbessert, da wir jetzt die SELECT-Anweisung überspringen können, wenn wir NEVER_SET-Symbole in den Parametern erkennen; vor #3061 konnten wir nicht unterscheiden, ob das None hier gesetzt war oder nicht.

    Referenzen: #3368

engine

  • [engine] [bug]

    Der String-Wert "none" wurde zu den vom Parameter Pool.reset_on_return akzeptierten Werten hinzugefügt, als Synonym für None, sodass Zeichenkettenwerte für alle Einstellungen verwendet werden können, was Utilities wie engine_from_config() ohne Probleme nutzbar macht.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3375

sql

  • [sql] [bug]

    Problem behoben, bei dem eine reine SELECT EXISTS-Query den korrekten Ergebnistyp Boolean nicht dem Ergebnis-Mapping zuordnete, sondern stattdessen Spaltentypen aus der Query in das Ergebnis-Mapping überlaufen ließ. Dieses Problem besteht auch in 0.9 und früheren Versionen, hat aber in diesen Versionen weniger Auswirkungen. In 1.0 wird es aufgrund von #918 zu einer Regression, da wir nun darauf angewiesen sind, dass das Ergebnis-Mapping sehr genau ist, andernfalls können wir Ergebnis-Typ-Prozessoren der falschen Spalte zuweisen. In allen Versionen führt dieses Problem auch dazu, dass ein einfaches EXISTS den Boolean-Typ-Handler nicht anwendet, was bei Backends ohne native Booleans zu einfachen 1/0-Werten anstelle von True/False führt. Die Korrektur beinhaltet, dass ein EXISTS-Spaltenargument nicht-gelabelt wird, wie andere Spaltenausdrücke; eine ähnliche Korrektur wurde für reine Boolesche Ausdrücke wie not_(True()) implementiert.

    Referenzen: #3372

sqlite

  • [sqlite] [bug]

    Regression behoben aufgrund von #3282, bei der aufgrund der Tatsache, dass wir versuchen, die Verfügbarkeit von ALTER bei der Erstellung/Löschung von Schemata anzunehmen, bei SQLite einfach gesagt wurde, dass Fremdschlüssel bei der Erstellung und Löschung von Tabellen überhaupt keine Rolle spielen, da ALTER nicht verfügbar ist. Dies bedeutete, dass die Sortierung von Tabellen bei SQLite im Grunde übersprungen wurde, und für die überwiegende Mehrheit der SQLite-Anwendungsfälle ist dies kein Problem.

    Benutzer, die DROPs auf SQLite mit Tabellen durchführten, die Daten enthielten und bei denen die referenzielle Integrität eingeschaltet war, erhielten dann Fehler, da die Abhängigkeitssortierung bei DROP mit erzwungenen Constraints (wenn diese Tabellen Daten enthalten) *doch* wichtig ist. (SQLite erlaubt Ihnen immer noch, Fremdschlüssel zu nicht vorhandenen Tabellen zu erstellen und Tabellen zu löschen, die sich auf bestehende beziehen und Constraints aktiviert haben, solange keine Daten referenziert werden).

    Um das neue Feature von #3282 beizubehalten und gleichzeitig einen SQLite DROP-Vorgang zu ermöglichen, der die Reihenfolge beibehält, sortieren wir nun mit voller Berücksichtigung von FKs. Wenn wir einen unauflösbaren Zyklus antreffen, *erst dann* verzichten wir darauf, die Tabellen zu sortieren; stattdessen geben wir eine Warnung aus und gehen mit der unsortierten Liste weiter. Wenn eine Umgebung sowohl geordnete DROPs benötigt *als auch* Fremdschlüsselzyklen hat, dann weisen die Warnungen darauf hin, dass sie das Flag use_alter auf ihre ForeignKey- und ForeignKeyConstraint-Objekte wiederherstellen müssen, damit nur diese Objekte aus der Abhängigkeitssortierung weggelassen werden.

    Siehe auch

    Das use_alter-Flag auf ForeignKeyConstraint ist (normalerweise) nicht mehr erforderlich - Enthält eine aktualisierte Notiz zu SQLite.

    Referenzen: #3378

misc

  • [bug] [firebird]

    Regression behoben aufgrund von #3034, bei der LIMIT/OFFSET-Klauseln vom Firebird-Dialekt nicht richtig interpretiert wurden. Pull Request mit freundlicher Genehmigung von effem-git.

    Referenzen: #3380

  • [bug] [firebird]

    Unterstützung für den "literal_binds"-Modus bei Verwendung von LIMIT/OFFSET mit Firebird behoben, sodass die Werte bei Auswahl wieder inline gerendert werden. Bezogen auf #3034.

    Referenzen: #3381

1.0.0

Veröffentlicht: 16. April 2015

orm

  • [orm] [feature]

    Neues Argument Query.update.update_args hinzugefügt, das kw-Argumente wie mysql_limit an das zugrundeliegende Update-Konstrukt übergeben kann. Pull Request mit freundlicher Genehmigung von Amir Sadoughi.

  • [orm] [bug]

    Eine Inkonsistenz bei der Handhabung von Query.join() zum selben Ziel mehr als einmal identifiziert; es wird implizit nur im Falle eines Beziehungs-Joins dedupliziert, und aufgrund von #3233 verhält sich ein Join zur selben Tabelle zweimal in 1.0 anders als in 0.9, da er nicht mehr fälschlicherweise alias-Namen vergibt. Um diese Änderung zu dokumentieren, wurde die Formulierung bezüglich #3233 in den Migrationshinweisen verallgemeinert und eine Warnung hinzugefügt, wenn Query.join() mehr als einmal auf dasselbe Ziel-Relationship angewendet wird.

    Referenzen: #3367

  • [orm] [bug]

    Kleine Verbesserung der Heuristik von Beziehungen bei der Bestimmung der Remote-Seite bei halb-selbstreferenziellen (z.B. zwei joined inh Unterklassen, die aufeinander verweisen) und nicht-einfachen Join-Bedingungen vorgenommen, sodass die übergeordnete Entität berücksichtigt wird und die Notwendigkeit der Verwendung der remote()-Annotation reduziert werden kann; dies kann einige Fälle wiederherstellen, die vor 0.9.4 über #2948 ohne die Annotation funktioniert haben.

    Referenzen: #3364

sql

  • [sql] [feature]

    Die topologische Sortierung zur Sortierung von Table-Objekten und verfügbar über die MetaData.sorted_tables-Sammlung erzeugt nun eine **deterministische** Reihenfolge; d.h., die gleiche Reihenfolge jedes Mal, gegeben eine Menge von Tabellen mit bestimmten Namen und Abhängigkeiten. Dies soll beim Vergleich von DDL-Skripten und anderen Anwendungsfällen helfen. Die Tabellen werden zur topologischen Sortierung nach Namen sortiert, und die topologische Sortierung selbst verarbeitet die eingehenden Daten in geordneter Weise. Pull Request mit freundlicher Genehmigung von Sebastian Bank.

    Referenzen: #3084

  • [sql] [bug]

    Problem behoben, bei dem ein MetaData-Objekt, das eine Namenskonvention verwendete, nicht korrekt mit Pickle funktionierte. Das Attribut wurde übersprungen, was zu Inkonsistenzen und Fehlern führte, wenn das entpickelte MetaData-Objekt als Basis für zusätzliche Tabellen verwendet wurde.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3362

postgresql

  • [postgresql] [bug]

    Behob einen langjährigen Fehler, bei dem der Enum-Typ, wie er mit dem psycopg2-Dialekt in Verbindung mit Nicht-ASCII-Werten und native_enum=False verwendet wurde, die Rückergebnisse nicht richtig dekodieren konnte. Dies rührte daher, dass der PG ENUM-Typ früher ein eigenständiger Typ ohne „nicht native“-Option war.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3354

mssql

  • [mssql] [bug]

    Behob eine Regression, bei der die Mechanik „zuletzt eingefügte ID“ den korrekten Wert für MSSQL bei einem INSERT, bei dem der Primärschlüsselwert vor der Ausführung in den INSERT-Parametern vorhanden war, nicht speichern konnte, sowie in dem Fall, in dem ein INSERT aus SELECT die Zielspalten als Spaltenobjekte anstatt als Zeichenschlüssel angab.

    Referenzen: #3360

  • [mssql] [bug]

    Verwendet nun den im pymssql vorhandenen Binary-Konstruktor anstelle des Patchens. Pull-Request von Ramiro Morales.

tests

  • [tests] [bug]

    Behob die Pfadangabe bei der Ausführung von Tests; für sqla_nose.py und py.test wird das Präfix „./lib“ wieder an den Anfang von sys.path eingefügt, aber nur, wenn sys.flags.no_user_site nicht gesetzt ist; dies bewirkt, dass es sich genau so verhält, wie Python standardmäßig „.“ in den aktuellen Pfad einfügt. Für tox setzen wir nun das Flag PYTHONNOUSERSITE.

    Referenzen: #3356

1.0.0b5

Veröffentlicht: 3. April 2015

orm

  • [orm] [bug]

    Behob einen Fehler, bei dem das Zustands-Tracking innerhalb mehrerer, verschachtelter Session.begin_nested()-Operationen das „dirty“-Flag für ein Objekt, das innerhalb des inneren Savepoints aktualisiert wurde, nicht weitergab, sodass, wenn der umschließende Savepoint zurückgerollt wurde, das Objekt nicht Teil des Zustands war, der abgelaufen und somit auf seinen Datenbankzustand zurückgesetzt wurde.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3352

  • [orm] [bug]

    Query unterstützt keine Joins, Subselects oder spezielle FROM-Klauseln bei Verwendung der Methoden Query.update() oder Query.delete(); anstatt diese Felder stillschweigend zu ignorieren, wenn Methoden wie Query.join() oder Query.select_from() aufgerufen wurden, wird ein Fehler ausgelöst. In 0.9.10 wird hierfür nur eine Warnung ausgegeben.

    Referenzen: #3349

  • [orm] [bug]

    Eine Liste() wurde um ein schwaches Wörterbuch gelegt, das während der Commit-Phase der Sitzung verwendet wird. Ohne diese Liste könnte dies bei einer Interaktion der automatischen Speicherbereinigung während des Prozesses zu einem Fehler „dictionary changed size during iter“ führen. Änderung wurde durch #3139 eingeführt.

  • [orm] [bug]

    Behob einen Fehler im Zusammenhang mit dem „verschachtelten“ inner join Eager Loading, der auch in 0.9 vorhanden ist, aber eine Regression in 1.0 darstellt aufgrund von #3008, das „verschachtelt“ standardmäßig aktiviert, sodass ein per Join geladenes Eager Loading, das über Geschwisterpfade von einem gemeinsamen Vorfahren mit innerjoin=True verläuft, jeden „innerjoin“-Geschwister korrekt in den entsprechenden Teil des Joins einfügt, wenn eine Reihe von inneren/äußeren Joins gemischt werden.

    Referenzen: #3347

sql

  • [sql] [bug]

    Die vom Unicode-Typ für einen Nicht-Unicode-Typ ausgegebene Warnung wurde liberalisiert, um Werte zu warnen, die nicht einmal Zeichenkettenwerte sind, wie z.B. Ganzzahlen; zuvor nutzte das aktualisierte Warnsystem von 1.0 Zeichenkettenformatierungsoperationen, die einen internen TypeError auslösen würden. Während diese Fälle idealerweise vollständig ausgelöst werden sollten, akzeptieren einige Backends wie SQLite und MySQL sie und werden potenziell von Altsystemen verwendet, ganz zu schweigen davon, dass sie immer durchlaufen, wenn die Unicode-Konvertierung für den Zielbackend deaktiviert ist.

    Referenzen: #3346

postgresql

  • [postgresql] [bug]

    Behob einen Fehler, bei dem die aktualisierte PG-Indexreflexion als Ergebnis von #3184 dazu führte, dass Indexoperationen auf PostgreSQL-Versionen 8.4 und früher fehlschlugen. Die Verbesserungen sind nun deaktiviert, wenn eine ältere Version von PostgreSQL verwendet wird.

    Referenzen: #3343

1.0.0b4

Veröffentlicht: 29. März 2015

sql

  • [sql] [bug]

    Behob einen Fehler in der neuen Funktion „label resolution“ von #2992, bei der ein anonymes Label, das dann erneut mit einem Namen versehen wurde, nicht über ein textuelles Label gefunden werden konnte. Diese Situation tritt natürlich auf, wenn eine gemappte column_property() in einer Abfrage eine explizite Bezeichnung erhält.

    Referenzen: #3340

  • [sql] [bug]

    Behob einen Fehler in der neuen Funktion „label resolution“ von #2992, bei der das Textlabel, das in order_by() oder group_by() einer Anweisung platziert wurde, dem Namen innerhalb der FROM-Klausel eine höhere Priorität einräumte als einem lokaleren Namen innerhalb der Spaltenklausel.

    Referenzen: #3335

schema

mysql

  • [mysql] [bug] [pymysql]

    Behob die Unicode-Unterstützung für PyMySQL bei der Verwendung einer „executemany“-Operation mit Unicode-Parametern. SQLAlchemy übergibt nun sowohl die Anweisung als auch die gebundenen Parameter als Unicode-Objekte, da PyMySQL im Allgemeinen eine Zeichenketteninterpolation intern verwendet, um die endgültige Anweisung zu erzeugen, und im Fall von executemany den „encode“-Schritt nur bei der endgültigen Anweisung durchführt.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3337

mssql

  • [mssql] [bug] [firebird] [oracle] [sybase]

    Das Flag „simple order by“ wurde bei den MSSQL- und Oracle-Dialekten deaktiviert; dies ist das Flag, das gemäß #2992 eine order by oder group by einer Expression, die sich auch in der Spaltenklausel befindet, durch eine Bezeichnung kopiert, auch wenn sie als Expression-Objekt referenziert wird. Das Verhalten für MSSQL ist nun das alte Verhalten, das standardmäßig die gesamte Expression kopiert, da MSSQL bei diesen insbesondere in GROUP BY-Expressionen wählerisch sein kann. Das Flag ist auch defensiv für die Firebird- und Sybase-Dialekte deaktiviert.

    Hinweis

    Diese Lösung war falsch, siehe Version 1.0.2 für eine Überarbeitung dieser Lösung.

    Referenzen: #3338

1.0.0b3

Veröffentlicht: 20. März 2015

mysql

  • [mysql] [bug]

    Reparierte den Commit für Issue #2771, der versehentlich auskommentiert wurde.

    Referenzen: #2771

1.0.0b2

Veröffentlicht: 20. März 2015

orm

  • [orm] [bug]

    Behob eine unerwartete Regressionsverwendung aus Pull-Request github:137, bei der Py2K-Unicode-Literale (z. B. u"") von der Option relationship.cascade nicht akzeptiert wurden. Pull-Request von Julien Castets.

    Referenzen: #3327

orm declarative

  • [orm] [declarative] [change]

    Einige Einschränkungen, die bei @declared_attr-Objekten hinzugefügt wurden, wurden gelockert, sodass sie nicht außerhalb des deklarativen Prozesses aufgerufen werden konnten. Dies bezieht sich auf die Verbesserungen von #3150, die es @declared_attr ermöglichen, einen Wert zurückzugeben, der basierend auf der aktuellen Klasse, während sie konfiguriert wird, zwischengespeichert wird. Der Ausnahmeruf wurde entfernt, und das Verhalten wurde geändert, sodass außerhalb des deklarativen Prozesses die vom @declared_attr dekorierte Funktion jedes Mal aufgerufen wird, wie bei einem regulären @property, ohne zwischengespeicherte Werte zu verwenden, da zu diesem Zeitpunkt keine verfügbar sind.

    Referenzen: #3331

engine

  • [engine] [bug]

    Das „automatische Schließen“ für ResultProxy ist nun ein „weiches“ Schließen. Das bedeutet, nach dem Erschöpfen aller Zeilen mithilfe der Fetch-Methoden wird der DBAPI-Cursor wie zuvor freigegeben und das Objekt kann sicher verworfen werden, aber die Fetch-Methoden können weiterhin aufgerufen werden, wobei sie ein Ende-des-Ergebnis-Objekt zurückgeben (None für fetchone, leere Liste für fetchmany und fetchall). Nur wenn ResultProxy.close() explizit aufgerufen wird, lösen diese Methoden den Fehler „result is closed“ aus.

    Referenzen: #3329, #3330

mysql

  • [mysql] [bug] [py3k]

    Behob den BIT-Typ unter Py3K, der die ord()-Funktion nicht korrekt verwendete. Pull-Request von David Marin.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3333

  • [mysql] [bug]

    Korrekturen zur vollständigen Unterstützung der Verwendung des MySQL-spezifischen Zeichensatzes 'utf8mb4' mit MySQL-Dialekten, insbesondere MySQL-Python und PyMySQL. Darüber hinaus funktionieren auch MySQL-Datenbanken, die ungewöhnlichere Zeichensätze wie ‚koi8u‘ oder ‚eucjpms‘ melden, korrekt. Pull-Request von Thomas Grainger.

    Referenzen: #2771

1.0.0b1

Veröffentlicht: 13. März 2015

Version 1.0.0b1 ist die erste Veröffentlichung der 1.0-Serie. Viele der hier beschriebenen Änderungen sind auch in der 0.9- und manchmal auch in der 0.8-Serie vorhanden. Für Änderungen, die spezifisch für 1.0 sind und sich auf Kompatibilitätsprobleme konzentrieren, siehe Was ist neu in SQLAlchemy 1.0?.

general

  • [general] [feature]

    Die strukturelle Speichernutzung wurde durch die deutlich stärkere Nutzung von __slots__ für viele interne Objekte verbessert. Diese Optimierung ist besonders auf die Basis-Speichergröße von großen Anwendungen mit vielen Tabellen und Spalten ausgerichtet und reduziert die Speichergröße für eine Vielzahl von Hochvolumen-Objekten, einschließlich der internen Event-Listener, Comparator-Objekte und Teilen des ORM-Attributs und des Loader-Strategie-Systems erheblich.

  • [general] [bug]

    Das Attribut __module__ wird nun für alle SQL- und ORM-Funktionen gesetzt, die als „public factory“-Symbole abgeleitet werden, was Dokumentationswerkzeugen helfen sollte, das Zielmodul zu melden.

    Referenzen: #3218

orm

  • [orm] [feature]

    Ein neuer Eintrag "entity" wurde zu den von Query.column_descriptions zurückgegebenen Dictionaries hinzugefügt. Dieser bezieht sich auf die primäre ORM-zugeordnete Klasse oder aliasierte Klasse, auf die der Ausdruck verweist. Im Vergleich zum bestehenden Eintrag für "type" wird es immer eine zugeordnete Entität sein, auch wenn sie aus einem Spaltenausdruck extrahiert wurde, oder None, wenn der gegebene Ausdruck ein reiner Core-Ausdruck ist. Siehe auch #3403, der eine Regression in dieser Funktion behoben hat, die in 0.9.10 nicht veröffentlicht, aber in der 1.0-Version veröffentlicht wurde.

    Diese Änderung wird auch zurückportiert auf: 0.9.10

    Referenzen: #3320

  • [orm] [feature]

    Neuer Parameter Session.connection.execution_options hinzugefügt, der verwendet werden kann, um Ausführungsoptionen auf einer Connection einzurichten, wenn sie zum ersten Mal ausgecheckt wird, bevor die Transaktion begonnen hat. Dies wird verwendet, um Optionen wie den Isolationsgrad der Verbindung einzurichten, bevor die Transaktion beginnt.

    Siehe auch

    Festlegen von Transaktionsisolationsgraden / DBAPI AUTOCOMMIT – neuer Dokumentationsabschnitt, der bewährte Verfahren für die Festlegung der Transaktionsisolation mit Sitzungen beschreibt.

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

    Referenzen: #3296

  • [orm] [feature]

    Neue Methode Session.invalidate() hinzugefügt, die ähnlich wie Session.close() funktioniert, jedoch auch Connection.invalidate() auf allen Verbindungen aufruft und garantiert, dass diese nicht an den Connection-Pool zurückgegeben werden. Dies ist nützlich in Situationen, z.B. bei Gevent-Timeouts, in denen die Verbindung nicht mehr sicher verwendet werden kann, auch nicht für Rollbacks.

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

  • [orm] [feature]

    Das Modell „primaryjoin“ wurde etwas erweitert, um eine Join-Bedingung zuzulassen, die strikt von einer einzelnen Spalte zu sich selbst reicht und durch eine SQL-Funktion oder einen Ausdruck übersetzt wird. Dies ist eher experimentell, aber das erste Proof-of-Concept ist eine „materialized path“-Join-Bedingung, bei der eine Pfadzeichenkette mit „like“ mit sich selbst verglichen wird. Der Operator ColumnOperators.like() wurde ebenfalls zur Liste der gültigen Operatoren für die Verwendung in einer primaryjoin-Bedingung hinzugefügt.

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

    Referenzen: #3029

  • [orm] [feature]

    Neue Hilfsfunktion make_transient_to_detached() hinzugefügt, die verwendet werden kann, um Objekte zu erzeugen, die sich so verhalten, als wären sie aus einer Sitzung geladen und dann getrennt worden. Nicht vorhandene Attribute werden als abgelaufen markiert, und das Objekt kann einer Sitzung hinzugefügt werden, wo es sich wie ein persistentes verhält.

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

    Referenzen: #3017

  • [orm] [feature]

    Neues Event-Suite QueryEvents hinzugefügt. Das Event QueryEvents.before_compile() ermöglicht die Erstellung von Funktionen, die zusätzliche Modifikationen an Query-Objekten vornehmen können, bevor die SELECT-Anweisung konstruiert wird. Es wird gehofft, dass dieses Event durch die Einführung eines neuen Inspektionssystems, das detaillierte Modifikationen an Query-Objekten in automatisierter Weise ermöglicht, viel nützlicher wird.

    Siehe auch

    QueryEvents

    Referenzen: #3317

  • [orm] [feature]

    Das Subquery-Wrapping, das auftritt, wenn Joined Eager Loading mit einer One-to-Many-Abfrage verwendet wird, die auch LIMIT, OFFSET oder DISTINCT enthält, wurde im Fall einer One-to-One-Beziehung deaktiviert, d.h. einer One-to-Many mit relationship.uselist auf False gesetzt. Dies erzeugt in diesen Fällen effizientere Abfragen.

    Referenzen: #3249

  • [orm] [feature]

    Die internen Zustandsverwaltung von Mappings wurde überarbeitet, um eine 50%ige Reduzierung der Aufrufe zu ermöglichen, die spezifisch für das „Ablaufen“ von Objekten sind, wie z. B. die „Auto-Ablauf“-Funktion von Session.commit() und für Session.expire_all(), sowie im „Cleanup“-Schritt, der auftritt, wenn Objektzustände vom Garbage Collector bereinigt werden.

    Referenzen: #3307

  • [orm] [feature]

    Eine Warnung wird ausgegeben, wenn derselbe polymorphe Bezeichner zwei verschiedenen Mappern in derselben Hierarchie zugewiesen wird. Dies ist in der Regel ein Benutzerfehler und bedeutet, dass die beiden verschiedenen Mapping-Typen zur Ladezeit nicht korrekt unterschieden werden können. Pull-Request von Sebastian Bank.

    Referenzen: #3262

  • [orm] [feature]

    Eine neue Reihe von Session-Methoden, die Hooks direkt in die Unit-of-Work-Funktionalität zur Ausgabe von INSERT- und UPDATE-Anweisungen bereitstellen, wurde erstellt. Bei korrekter Verwendung kann dieses expertenorientierte System ORM-Mappings verwenden, um Bulk-INSERT- und UPDATE-Anweisungen zu generieren, die in executemany-Gruppen gebündelt werden, sodass die Anweisungen mit Geschwindigkeiten ausgeführt werden, die mit der direkten Verwendung von Core konkurrieren.

    Siehe auch

    Massenoperationen

    Referenzen: #3100

  • [orm] [feature]

    Ein Parameter Query.join.isouter wurde hinzugefügt, der synonym mit dem Aufruf von Query.outerjoin() ist; dieses Flag dient dazu, eine konsistentere Schnittstelle im Vergleich zu Core FromClause.join() bereitzustellen. Pull-Request von Jonathan Vanasco.

    Referenzen: #3217

  • [orm] [feature]

    Neue Event-Handler AttributeEvents.init_collection() und AttributeEvents.dispose_collection() hinzugefügt, die verfolgen, wann eine Sammlung zum ersten Mal einer Instanz zugeordnet wird und wann sie ersetzt wird. Diese Handler ersetzen die Annotation collection.linker(). Der alte Hook bleibt durch einen Event-Adapter unterstützt.

  • [orm] [feature]

    Die Query löst eine Ausnahme aus, wenn Query.yield_per() mit Mappings oder Optionen verwendet wird, bei denen entweder Subquery Eager Loading oder Joined Eager Loading mit Collections stattfinden würde. Diese Lade-Strategien sind derzeit nicht mit yield_per kompatibel, daher ist die Methode durch Auslösen dieses Fehlers sicherer zu verwenden. Eager Loads können mit der Option lazyload('*') oder Query.enable_eagerloads() deaktiviert werden.

  • [orm] [feature]

    Eine neue Implementierung für KeyedTuple, die von dem Query-Objekt verwendet wird, bietet dramatische Geschwindigkeitsverbesserungen beim Abrufen großer Mengen von spaltenorientierten Zeilen.

    Referenzen: #3176

  • [orm] [feature]

    Das Verhalten von joinedload.innerjoin sowie relationship.innerjoin ist nun die Verwendung von „verschachtelten“ inner joins, d.h. rechts-verschachtelt, als Standardverhalten, wenn ein inner join joined eager load an einen outer join eager load angehängt wird.

    Referenzen: #3008

  • [orm] [feature]

    UPDATE-Anweisungen können nun innerhalb eines ORM-Flushs zu einem performanteren executemany()-Aufruf gebündelt werden, ähnlich wie INSERT-Anweisungen gebündelt werden können; dies wird im Flush in dem Maße aufgerufen, in dem nachfolgende UPDATE-Anweisungen für dasselbe Mapping und dieselbe Tabelle dieselben Spalten in der VALUES-Klausel betreffen, keine SET-Level SQL-Ausdrücke eingebettet sind und die Versionsanforderungen für das Mapping mit der Fähigkeit des Backend-Dialekts, eine korrekte Zeilenanzahl für einen executemany-Vorgang zurückzugeben, kompatibel sind.

  • [orm] [feature]

    Der Parameter info wurde zum Konstruktor für SynonymProperty und ComparableProperty hinzugefügt.

    Referenzen: #2963

  • [orm] [feature]

    Die Sammlung InspectionAttr.info wurde nun auf InspectionAttr verschoben, wo sie nicht nur auf allen MapperProperty-Objekten verfügbar ist, sondern auch auf Hybrid-Properties und Association Proxies, wenn sie über Mapper.all_orm_descriptors zugegriffen wird.

    Referenzen: #2971

  • [orm] [change]

    Als verzögert markierte Attribute, die ohne explizites Aufheben der Verzögerung gesetzt wurden, bleiben nun auch dann „verzögert“, wenn ihre Spalte auf andere Weise im Ergebnis-Set vorhanden ist. Dies ist eine Leistungssteigerung, da eine ORM-Ladeoperation keine Zeit mehr mit der Suche nach jeder verzögerten Spalte verbringt, wenn das Ergebnis-Set erhalten wird. Für eine Anwendung, die sich bisher darauf verlassen hat, sollte nun jedoch ein explizites undefer() oder eine ähnliche Option verwendet werden.

  • [orm] [changed]

    Der an die Methode create_row_processor() von benutzerdefinierten Bundle-Klassen übergebene aufrufbare proc() akzeptiert nun nur noch ein einziges „row“-Argument.

  • [orm] [changed]

    Veraltete Ereignis-Hooks entfernt: populate_instance, create_instance, translate_row, append_result

  • [orm] [bug]

    Fehler in der Subquery-Eager-Ladung behoben, bei der eine lange Kette von Eager-Ladungen über eine polymorphe Klassengrenze in Verbindung mit polymorpher Ladung die Unterklasse-Verknüpfung in der Kette nicht finden konnte und mit einem fehlenden Eigenschaftsnamen bei einer AliasedClass fehlschlug.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3055

  • [orm] [bug]

    ORM-Fehler behoben, bei dem die Funktion class_mapper() AttributeErrors oder KeyErrors maskierte, die aufgrund von Benutzerfehlern während der Mapper-Konfiguration ausgelöst werden sollten. Die Behandlung von Attribut-/Schlüssel-Fehlern wurde spezifischer gemacht, um den Konfigurationsschritt nicht einzuschließen.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3047

  • [orm] [bug]

    Fehler in ORM-Objektvergleichen behoben, bei denen der Vergleich von Many-to-One != None fehlschlagen würde, wenn die Quelle eine aliased Klasse war oder wenn die Abfrage aufgrund von aliased Joins oder polymorpher Abfragen spezielle Aliasing auf den Ausdruck anwenden musste; außerdem wurde ein Fehler behoben, bei dem der Vergleich eines Many-to-One mit einem Objektzustand fehlschlagen würde, wenn die Abfrage aufgrund von aliased Joins oder polymorpher Abfragen spezielles Aliasing auf den Ausdruck anwenden musste.

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

    Referenzen: #3310

  • [orm] [bug]

    Fehler behoben, bei dem eine interne Assertion fehlschlagen würde, wenn ein after_rollback() Handler für eine Session innerhalb des Handlers ungültigerweise Zustand zu dieser Session hinzufügt und die Aufgabe, diesen Zustand zu warnen und zu entfernen (etabliert durch #2389) versucht fortzufahren.

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

    Referenzen: #3309

  • [orm] [bug]

    Fehler behoben, bei dem ein TypeError ausgelöst wurde, wenn Query.join() mit unbekannten Schlüsselwortargumenten aufgerufen wurde und aufgrund falscher Formatierung einen eigenen TypeError auslöste. Pull-Request von Malthe Borch.

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

  • [orm] [bug]

    Fehler bei der Konstruktion von SQL für Lazy Loading behoben, bei der ein komplexes PrimaryJoin, das dieselbe „lokale“ Spalte mehrmals im Stil der „sich selbst referenzierenden Spalte“ eines Self-Referential Join referenzierte, nicht in allen Fällen substituiert wurde. Die Logik zur Bestimmung von Substitutionen wurde überarbeitet, um offener zu sein.

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

    Referenzen: #3300

  • [orm] [bug]

    Die „Wildcard“-Loader-Optionen, insbesondere diejenige, die von der load_only()-Option zum Abdecken aller nicht explizit genannten Attribute eingerichtet wird, berücksichtigen nun die Oberklassen einer gegebenen Entität, wenn diese Entität mit Vererbungsmassierung abgebildet ist, sodass Attributnamen innerhalb der Oberklassen ebenfalls vom Laden ausgenommen werden. Zusätzlich wird die polymorphe Diskriminatorspalte bedingungslos in die Liste aufgenommen, genauso wie Primärschlüsselspalten, sodass auch bei eingerichteter load_only() das polymorphe Laden von Untertypen weiterhin korrekt funktioniert.

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

    Referenzen: #3287

  • [orm] [bug] [pypy]

    Fehler behoben, bei dem, wenn eine Ausnahme zu Beginn einer Query ausgelöst wurde, bevor Ergebnisse abgerufen wurden, insbesondere wenn Zeilenprozessoren nicht gebildet werden konnten, der Cursor geöffnet bliebe mit ausstehenden Ergebnissen und nicht tatsächlich geschlossen würde. Dies ist typischerweise nur auf einem Interpreter wie PyPy ein Problem, bei dem der Cursor nicht sofort von der Garbage Collection erfasst wird, und kann unter Umständen dazu führen, dass Transaktionen/Sperren länger offen bleiben als erwünscht.

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

    Referenzen: #3285

  • [orm] [bug]

    Speicherleck behoben, das in der nicht unterstützten und höchst nicht empfohlenen Verwendung des mehrfachen Ersetzens einer Beziehung auf einer festen abgebildeten Klasse auftreten konnte, die auf eine beliebig wachsende Anzahl von Ziel-Mapper verweist. Eine Warnung wird ausgegeben, wenn die alte Beziehung ersetzt wird, aber wenn die Abbildung bereits für Abfragen verwendet wurde, wurde die alte Beziehung immer noch innerhalb einiger Registrierungen referenziert.

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

    Referenzen: #3251

  • [orm] [bug] [sqlite]

    Fehler bezüglich Ausdrucksmutationen behoben, der sich als „Could not locate column“-Fehler äußern konnte, wenn Query verwendet wurde, um aus mehreren, anonymen Spaltenentitäten auszuwählen, wenn gegen SQLite abgefragt wurde, als Nebeneffekt des „Join Rewriting“-Features, das vom SQLite-Dialekt verwendet wird.

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

    Referenzen: #3241

  • [orm] [bug]

    Fehler behoben, bei dem die ON-Klausel für Query.join() und Query.outerjoin() zu einer Single-Inheritance-Unterklasse unter Verwendung von of_type() die „Single Table Criteria“ nicht in der ON-Klausel gerendert hätte, wenn das Flag from_joinpoint=True gesetzt war.

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

    Referenzen: #3232

  • [orm] [bug] [engine]

    Fehler behoben, der generell die gleichen Klassen von Ereignissen wie bei #3199 betraf, wenn der Parameter named=True verwendet wurde. Einige Ereignisse konnten nicht registriert werden, und andere lösten die Ereignisargumente nicht korrekt aus, generell im Fall, dass ein Ereignis für eine Anpassung auf andere Weise „verpackt“ wurde. Die „named“-Mechanismen wurden neu arrangiert, um die von internen Wrapper-Funktionen erwartete Argumentsignatur nicht zu stören.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3197

  • [orm] [bug]

    Fehler behoben, der viele Ereignisklassen betraf, insbesondere ORM-Ereignisse, aber auch Engine-Ereignisse, bei denen die übliche Logik des „Entfernens von Duplikaten“ eines redundanten Aufrufs von listen() mit denselben Argumenten fehlschlug, für Ereignisse, bei denen die Listener-Funktion verpackt ist. Eine Assertion in registry.py wurde getroffen. Diese Assertion wurde nun in die Deduplizierungsprüfung integriert, mit dem zusätzlichen Vorteil einer einfacheren Mittel zur Überprüfung der Deduplizierung übergreifend.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3199

  • [orm] [bug]

    Warnung behoben, die ausgegeben wurde, wenn ein komplexes Self-Referential PrimaryJoin Funktionen enthielt und gleichzeitig remote_side angegeben war; die Warnung schlug vor, „remote side“ festzulegen. Sie wird nun nur noch ausgegeben, wenn remote_side nicht vorhanden ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3194

  • [orm] [bug] [eagerloading]

    Rückschritt behoben, der durch #2976 in Version 0.9.4 verursacht wurde, bei dem die „outer join“-Propagation entlang einer Kette von joined eager loads einen „inner join“ entlang eines Geschwister-Join-Pfads fälschlicherweise ebenfalls in einen outer join umwandelte, während nur Nachfahrts-Pfade die „outer join“-Propagation erhalten sollten; zusätzlich wurde ein verwandtes Problem behoben, bei dem eine „verschachtelte“ Join-Propagation unangemessen zwischen zwei Geschwister-Join-Pfaden stattfand.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3131

  • [orm] [bug]

    Rückschritt von 0.9.0 aufgrund von #2736 behoben, bei dem die Methode Query.select_from() die „from entity“ des Query-Objekts nicht mehr korrekt einrichtete, sodass nachfolgende Aufrufe von Query.filter_by() oder Query.join() die entsprechende „from“-Entität bei der Suche nach Attributen anhand des Stringnamens nicht mehr prüften.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #2736, #3083

  • [orm] [bug]

    Fehler behoben, bei dem Elemente, die in einem Savepoint-Block persistent, gelöscht oder mit einer Primärschlüsseländerung versehen wurden, nach dem Zurückrollen der äußeren Transaktion nicht wieder in ihren früheren Zustand (nicht in der Session, in der Session, vorheriger PK) zurückgesetzt wurden.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3108

  • [orm] [bug]

    Fehler bei Subquery Eager Loading in Verbindung mit with_polymorphic() behoben, die Zielsetzung von Entitäten und Spalten in der Subquery-Ladung wurde für diese Art von Entität und andere genauer.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3106

  • [orm] [bug]

    Zusätzliche Prüfungen wurden für den Fall hinzugefügt, dass ein vererbender Mapper implizit eines seiner spaltenbasierten Attribute mit dem eines Elternteils kombiniert, wo diese Spalten normalerweise nicht notwendigerweise denselben Wert teilen. Dies ist eine Erweiterung einer bestehenden Prüfung, die über #1892 hinzugefügt wurde; diese neue Prüfung gibt jedoch nur eine Warnung anstelle einer Ausnahme aus, um Anwendungen zu ermöglichen, die sich auf das bestehende Verhalten verlassen.

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

    Referenzen: #3042

  • [orm] [bug]

    Das Verhalten von load_only() wurde so geändert, dass Primärschlüsselspalten immer zur Liste der zu „undefer“nden Spalten hinzugefügt werden; andernfalls kann die ORM die Identität der Zeile nicht laden. Offensichtlich kann man die abgebildeten Primärschlüssel verzögern und die ORM wird fehlschlagen, das wurde nicht geändert. Aber da load_only() im Wesentlichen sagt „verzögere alles außer X“, ist es kritischer, dass PK-Spalten nicht Teil dieser Verzögerung sind.

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

    Referenzen: #3080

  • [orm] [bug]

    Einige Randfälle im sogenannten „Row Switch“-Szenario behoben, in dem ein INSERT/DELETE in ein UPDATE umgewandelt werden kann. In dieser Situation wird eine auf None gesetzte Many-to-One-Beziehung oder in einigen Fällen ein auf None gesetztes Skalarattribut möglicherweise nicht als Nettoänderung des Werts erkannt, und daher würde das UPDATE die vorherige Zeile nicht zurücksetzen. Dies liegt an einigen noch ungelösten Nebeneffekten der Attributhistorie, die implizit davon ausgeht, dass None für ein zuvor nicht gesetztes Attribut keine „Änderung“ darstellt. Siehe auch #3061.

    Hinweis

    Diese Änderung wurde in 0.9.6 **RÜCKGÄNGIG GEMACHT**. Die vollständige Korrektur erfolgt in Version 1.0 von SQLAlchemy.

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

    Referenzen: #3060

  • [orm] [bug]

    In Verbindung mit #3060 wurde eine Anpassung an der Unit of Work vorgenommen, sodass das Laden von zugehörigen Many-to-One-Objekten im Falle eines Graphen von sich selbst referenzierenden Objekten, die gelöscht werden sollen, etwas aggressiver erfolgt; das Laden von zugehörigen Objekten dient dazu, die richtige Reihenfolge für die Löschung zu bestimmen, wenn passive_deletes nicht gesetzt ist.

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

  • [orm] [bug]

    Fehler bei der SQLite Join Rewriting behoben, bei dem anonymisierte Spaltennamen aufgrund von Wiederholungen in Subqueries nicht korrekt neu geschrieben wurden. Dies würde SELECT-Abfragen mit beliebiger Art von Subquery + Join betreffen.

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

    Referenzen: #3057

  • [orm] [bug] [sql]

    Korrekturen an der neu erweiterten Booleschen Umwandlung in #2804, bei der die neuen Regeln für „where“ und „having“ nicht für die Schlüsselwortargumente „whereclause“ und „having“ des select()-Konstrukts wirksam wurden, was auch das ist, was Query verwendet, sodass es auch im ORM nicht funktionierte.

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

    Referenzen: #3013

  • [orm] [bug]

    Fehler behoben, bei dem die Sitzungsanhängefehler „object is already attached to session X“ die Anheftung des Objekts an die neue Sitzung nicht verhindert hätte, falls die Ausführung nach dem Auslösen des Fehlers fortgesetzt wurde.

    Referenzen: #3301

  • [orm] [bug]

    Der primäre Mapper einer Query wird nun an die Methode Session.get_bind() übergeben, wenn Query.count(), Query.update(), Query.delete() sowie Abfragen auf abgebildete Spalten, column_property-Objekte und aus abgebildeten Spalten abgeleitete SQL-Funktionen und Ausdrücke aufgerufen werden. Dies ermöglicht Sitzungen, die auf entweder angepasste Session.get_bind()-Schemata oder „gebundene“ Metadaten angewiesen sind, in allen relevanten Fällen zu funktionieren.

    Referenzen: #1326, #3227, #3242

  • [orm] [bug]

    Der Modifikator PropComparator.of_type() wurde in Verbindung mit Loader-Direktiven wie joinedload() und contains_eager() verbessert, sodass, wenn zwei PropComparator.of_type()-Modifikatoren desselben Basistyps/-pfads angetroffen werden, diese zu einer einzigen „polymorphen“ Entität verbunden werden, anstatt die Entität des Typs A durch die des Typs B zu ersetzen. Beispiel: Ein joinedload von A.b.of_type(BSub1)->BSub1.c, kombiniert mit einem joinedload von A.b.of_type(BSub2)->BSub2.c, erstellt einen einzigen joinedload von A.b.of_type((BSub1, BSub2)) -> BSub1.c, BSub2.c, ohne dass with_polymorphic explizit in der Abfrage sein muss.

    Siehe auch

    Eager Loading von polymorphen Untertypen – enthält ein aktualisiertes Beispiel, das das neue Format illustriert.

    Referenzen: #3256

  • [orm] [bug]

    Unterstützung für den Aufruf von copy.deepcopy() repariert, wenn dieser von der CascadeOptions-Argument verwendet wird, was auftritt, wenn copy.deepcopy() mit relationship() verwendet wird (kein offiziell unterstützter Anwendungsfall). Pull-Request von duesenfranz.

  • [orm] [bug]

    Fehler behoben, bei dem Session.expunge() das gegebene Objekt nicht vollständig abtrennte, wenn das Objekt einer Löschoperation unterworfen wurde, die geleert, aber nicht committet wurde. Dies würde auch verwandte Operationen wie make_transient() betreffen.

    Referenzen: #3139

  • [orm] [bug]

    Eine Warnung wird ausgegeben, wenn mehrere Beziehungen, die letztendlich eine Fremdschlüsselspalte in Konflikt mit einer anderen füllen, wobei die Beziehungen versuchen, Werte aus verschiedenen Quellspalten zu kopieren. Dies tritt auf, wenn zusammengesetzte Fremdschlüssel mit überlappenden Spalten mit Beziehungen abgebildet werden, die jeweils auf eine andere referenzierte Spalte verweisen. Ein neuer Dokumentationsabschnitt veranschaulicht das Beispiel sowie wie das Problem durch die Angabe von „foreign“-Spalten speziell auf pro-Beziehungsbasis überwunden werden kann.

    Referenzen: #3230

  • [orm] [bug]

    Die Methode Query.update() konvertiert nun Zeichenketten-Schlüsselnamen im gegebenen Wörterbuch von Werten in abgebildete Attributnamen gegen die abgebildete Klasse, die aktualisiert wird. Zuvor wurden Zeichenkettennamen direkt übernommen und ohne Mittel zur Auflösung gegen die abgebildete Entität an die Kern-Update-Anweisung übergeben. Unterstützung für Synonyme und hybride Attribute als Gegenstandattribute von Query.update() wird ebenfalls unterstützt.

    Referenzen: #3228

  • [orm] [bug]

    Verbesserungen am Mechanismus, den die Session zur Lokalisierung von „Binds“ (z. B. zu verwendende Engines) verwendet. Solche Engines können mit Mixin-Klassen, konkreten Unterklassen sowie einer breiteren Palette von Tabellenmetadaten wie Joined-Inheritance-Tabellen assoziiert werden.

    Referenzen: #3035

  • [orm] [bug]

    Fehler bei Single Table Inheritance behoben, bei dem eine Kette von Joins, die dieselbe Single-Inh-Entität mehr als einmal enthielt (normalerweise sollte dies einen Fehler auslösen), in einigen Fällen, abhängig davon, „von wo“ gejoint wurde, implizit den zweiten Fall der Single-Inh-Entität aliased hat, was eine funktionierende Abfrage erzeugte. Da dieses implizite Aliasing jedoch bei Single Table Inheritance nicht beabsichtigt ist, hat es nicht wirklich vollständig „funktioniert“ und war sehr irreführend, da es nicht immer sichtbar wurde.

    Referenzen: #3233

  • [orm] [bug]

    Die ON-Klausel, die beim Verwenden von Query.join(), Query.outerjoin() oder den eigenständigen Funktionen join() / outerjoin() zu einer Single-Inheritance-Unterklasse gerendert wird, enthält nun die „Single Table Criteria“ in der ON-Klausel, auch wenn die ON-Klausel ansonsten von Hand erstellt wurde; sie wird nun mittels AND zu den Kriterien hinzugefügt, auf die gleiche Weise, als wenn zu einem Single-Table-Ziel mittels Beziehung oder Ähnlichem gejoint würde.

    Dies ist gewissermaßen eine Mischung aus Funktion und Fehler.

    Referenzen: #3222

  • [orm] [bug]

    Eine umfangreiche Überarbeitung des Verhaltens von Ausdrucks-Labels, insbesondere bei Verwendung mit ColumnProperty-Konstrukten mit benutzerdefinierten SQL-Ausdrücken und in Verbindung mit der „order by labels“-Logik, die erstmals in 0.9 eingeführt wurde. Korrekturen beinhalten, dass ein order_by(Entity.some_col_prop) nun „order by label“-Regeln nutzt, selbst wenn die Entity durch Aliasing (entweder durch Vererbungsrendering oder durch die Verwendung des aliased()-Konstrukts) aliased wurde; das Rendern derselben Spalteneigenschaft mehrmals mit Aliasing (z. B. query(Entity.some_prop, entity_alias.some_prop)) wird jedes Vorkommen der Entität mit einem unterschiedlichen Label versehen, und zusätzlich funktionieren „order by label“-Regeln für beide (z. B. order_by(Entity.some_prop, entity_alias.some_prop)). Zusätzliche Probleme, die die „order by label“-Logik in 0.9 verhindert haben könnten, insbesondere dass der Zustand eines Labels sich ändern konnte, sodass „order by label“ je nach Aufrufweise nicht mehr funktionierte, wurden behoben.

    Referenzen: #3148, #3188

  • [orm] [bug]

    Die Art und Weise, wie das „Single Inheritance Criterion“ angewendet wird, wurde geändert, wenn Query.from_self() oder dessen gängiger Nutzer Query.count() verwendet wird. Das Kriterium zur Beschränkung der Zeilen auf die mit einem bestimmten Typ wird nun im inneren Subquery angewendet, nicht im äußeren, sodass, selbst wenn die „Typ“-Spalte nicht in der Spaltenklausel verfügbar ist, wir sie im „inneren“ Query filtern können.

    Referenzen: #3177

  • [orm] [bug]

    Eine kleine Anpassung der Mechanik des Lazy Loading wurde vorgenommen, sodass es unter der äußerst seltenen Bedingung, dass ein Objekt auf sich selbst verweist, geringere Chancen gibt, mit einem `joinload()` zu interferieren. In diesem Szenario verweist das Objekt beim Laden seiner Attribute auf sich selbst, was zu einem Durcheinander zwischen Loadern führen kann. Der Anwendungsfall „Objekt verweist auf sich selbst“ wird nicht vollständig unterstützt, aber die Korrektur entfernt auch einen Teil des Overheads, sodass sie vorerst Teil des Testens ist.

    Referenzen: #3145

  • [orm] [bug]

    Das ORM-Event „resurrect“ wurde entfernt. Dieser Event-Hook hatte keinen Zweck mehr, da das alte System für „mutable attributes“ in Version 0.8 entfernt wurde.

    Referenzen: #3171

  • [orm] [bug]

    Fehler behoben, bei dem Attribut-„set“-Events oder Spalten mit `@validates` während des Flush-Prozesses ausgelöst wurden, wenn diese Spalten Ziele einer „fetch and populate“-Operation waren, wie z. B. ein automatisch inkrementierter Primärschlüssel, ein Standardwert auf Python-Seite oder ein serverseitiger Standardwert, der über RETURNING „eagerly“ abgerufen wurde.

    Referenzen: #3167

  • [orm] [bug] [py3k]

    Die von `Session.identity_map` exponierte `IdentityMap` gibt in Py3K nun Listen für `items()` und `values()` zurück. Frühe Portierungen zu Py3K ließen diese Iteratoren zurückgeben, obwohl sie technisch gesehen „iterierbare Ansichten“ sein sollten. Vorerst sind Listen in Ordnung.

  • [orm] [bug]

    Der „Evaluator“ für `query.update()`/`delete()` funktioniert nicht mit Multi-Table-Updates und muss auf `synchronize_session=False` oder `synchronize_session='fetch'` gesetzt werden. Dies löst nun eine Ausnahme aus mit einer Meldung, die Einstellung für `synchronize` zu ändern. Dies wurde von einer Warnung, die seit 0.9.7 ausgegeben wurde, auf eine Ausnahme hochgestuft.

    Referenzen: #3117

  • [orm] [enhancement]

    Anpassung der Attributmechanik bezüglich des Zeitpunkts, zu dem ein Wert beim ersten Zugriff implizit auf None initialisiert wird. Diese Aktion, die immer zu einer Population des Attributs führte, tut dies nicht mehr. Der Wert None wird zurückgegeben, aber das zugrunde liegende Attribut erhält kein Set-Event. Dies ist konsistent damit, wie Sammlungen funktionieren, und ermöglicht eine konsistentere Verhaltensweise der Attributmechanik. Insbesondere das Abrufen eines Attributs ohne Wert unterdrückt nicht das Event, das erfolgen sollte, wenn der Wert tatsächlich auf None gesetzt wird.

    wo gebundene Parameter basierend auf einer Compiler-Option als Strings inline gerendert werden. Die Arbeit an dieser Funktion wurde von Dobes Vandermeer freundlicherweise bereitgestellt.

    Referenzen: #3061

orm declarative

  • [orm] [declarative] [feature]

    Das `declared_attr`-Konstrukt hat in Verbindung mit der Deklarativität neu verbesserte Verhaltensweisen und Funktionen. Die dekorierte Funktion hat nun Zugriff auf die endgültigen Spaltenkopien, die sich auf dem lokalen Mixin befinden, wenn sie aufgerufen wird, und wird auch genau einmal für jede zugeordnete Klasse aufgerufen, wobei das zurückgegebene Ergebnis zwischengespeichert wird. Ein neuer Modifikator `declared_attr.cascading` wird ebenfalls hinzugefügt.

    Referenzen: #3150

  • [orm] [declarative] [bug]

    Fehler „‘NoneType’ object has no attribute ‘concrete’” behoben, wenn `AbstractConcreteBase` in Verbindung mit einer Unterklasse verwendet wurde, die `__abstract__` deklariert.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3185

  • [orm] [declarative] [bug]

    Fehler behoben, bei dem die Verwendung eines `__abstract__`-Mixins in der Mitte einer deklarativen Vererbungshierarchie die Weitergabe von Attributen und Konfigurationen von der Basisklasse an die erbende Klasse verhinderte.

    Referenzen: #3219, #3240

  • [orm] [declarative] [bug]

    Eine Beziehung, die mit `declared_attr` auf einer `AbstractConcreteBase`-Basisklasse eingerichtet wurde, wird nun automatisch auf der abstrakten Basiszuordnung konfiguriert, zusätzlich zur üblichen Einrichtung für absteigende konkrete Klassen.

    Referenzen: #2670

examples

  • [examples] [feature]

    Ein neues Beispiel wurde hinzugefügt, das materialisierte Pfade unter Verwendung der neuesten Beziehungsfunktionen veranschaulicht. Beispiel mit freundlicher Genehmigung von Jack Zhou.

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

  • [examples] [feature]

    Eine neue Suite von Beispielen, die einer detaillierten Untersuchung der Leistung von SQLAlchemy ORM und Core sowie der DBAPI aus mehreren Perspektiven gewidmet ist. Die Suite läuft in einem Container, der integrierte Profilierungsanzeigen sowohl über die Konsolenausgabe als auch grafisch über das RunSnake-Tool bietet.

    Siehe auch

    Performance

  • [examples] [bug]

    Das Beispiel „Versioning with a History Table“ wurde aktualisiert, sodass zugeordnete Spalten neu zugeordnet werden, um Spaltennamen sowie Spaltengruppierungen abzugleichen. Insbesondere ermöglicht dies, dass Spalten, die in einem Szenario mit einfacher Vererbung mit demselben Spaltennamen explizit gruppiert sind, in den historischen Zuordnungen auf die gleiche Weise zugeordnet werden. Dies vermeidet Warnungen, die in der 0.9er-Serie zu diesem Muster hinzugefügt wurden, und ermöglicht die gleiche Ansicht von Attributschlüsseln.

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

  • [examples] [bug]

    Ein Fehler im Beispiel `examples/generic_associations/discriminator_on_association.py` wurde behoben. Dort wurden die Unterklassen von `AddressAssociation` nicht als „Single Table Inheritance“ zugeordnet, was zu Problemen bei der weiteren Verwendung der Zuordnungen führte.

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

engine

  • [engine] [feature]

    Neue Accessoren für den Benutzerbereich zur Anzeige von Transaktionsisolationsstufen wurden hinzugefügt: `Connection.get_isolation_level()`, `Connection.default_isolation_level`.

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

  • [engine] [feature]

    Neues Event `ConnectionEvents.handle_error()`, eine umfassendere und vollständigere Ersetzung für `ConnectionEvents.dbapi_error()` wurde hinzugefügt.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3076

  • [engine] [feature]

    Ein neuer Warnungsstil kann ausgegeben werden, der bis zu N Vorkommen eines parametrisierten Strings „filtert“. Dies ermöglicht parametrisierte Warnungen, die auf ihre Argumente verweisen können, eine feste Anzahl von Malen ausgegeben zu werden, bevor sie von Python-Warnungsfiltern unterdrückt werden, und verhindert, dass der Speicher in Python-Warnungsregistern unbegrenzt wächst.

    Referenzen: #3178

  • [engine] [bug]

    Fehler in `Connection` und Pool behoben, bei dem die Methode `Connection.invalidate()`, oder eine Invalidierung aufgrund einer Datenbanktrennung, fehlschlug, wenn der Parameter `isolation_level` mit `Connection.execution_options()` verwendet wurde. Der „Finalizer“, der die Isolationsebene zurücksetzt, wurde auf der nicht mehr geöffneten Verbindung aufgerufen.

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

    Referenzen: #3302

  • [engine] [bug]

    Eine Warnung wird ausgegeben, wenn der Parameter `isolation_level` mit `Connection.execution_options()` verwendet wird, wenn eine `Transaction` im Spiel ist. DBAPIs und/oder SQLAlchemy-Dialekte wie psycopg2, MySQLdb können die Transaktion implizit zurückrollen oder committen, oder die Einstellung erst bei der nächsten Transaktion ändern, sodass dies niemals sicher ist.

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

    Referenzen: #3296

  • [engine] [bug]

    Die an eine `Engine` übergebenen Ausführungsoptionen, entweder über `create_engine.execution_options` oder `Engine.update_execution_options()`, werden nicht an die spezielle `Connection` weitergegeben, die zur Initialisierung des Dialekts innerhalb des „First Connect“-Events verwendet wird. Dialekte führen in dieser Phase normalerweise ihre eigenen Abfragen durch, und keine der derzeit verfügbaren Optionen sollte hier angewendet werden. Insbesondere die Option „autocommit“ führte zu einem Versuch, innerhalb dieser anfänglichen Verbindung automatisch zu committen, was mit einem `AttributeError` aufgrund des nicht standardmäßigen Zustands der `Connection` fehlschlug.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3200

  • [engine] [bug]

    Die String-Schlüssel, die zur Bestimmung der betroffenen Spalten für ein INSERT oder UPDATE verwendet werden, werden nun sortiert, wenn sie zum Cache-Schlüssel des „compiled cache“ beitragen. Diese Schlüssel waren zuvor nicht deterministisch geordnet, was bedeutete, dass dieselbe Anweisung mehrmals mit äquivalenten Schlüsseln gecached werden konnte, was sowohl Speicher als auch Leistung kostete.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3165

  • [engine] [bug]

    Fehler behoben, der auftrat, wenn eine DBAPI-Ausnahme beim ersten Verbindungsaufbau der Engine auftrat und diese ihre anfänglichen Prüfungen durchführte, und die Ausnahme keine Trennungsausnahme war, aber der Cursor beim Versuch, ihn zu schließen, einen Fehler auslöste. In diesem Fall wäre die eigentliche Ausnahme unterdrückt worden, da wir versucht haben, die Ausnahme beim Schließen des Cursors über den Connection-Pool zu protokollieren und dabei fehlgeschlagen sind, da wir auf den Logger des Pools auf eine Weise zugegriffen haben, die in diesem sehr spezifischen Szenario unangemessen ist.

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

    Referenzen: #3063

  • [engine] [bug]

    Einige „doppelte Invalidierungs“-Situationen wurden behoben, bei denen eine Verbindungsinvalidierung innerhalb eines bereits kritischen Abschnitts wie `connection.close()` auftreten konnte. Letztendlich werden diese Bedingungen durch die Änderung in #2907 verursacht, da das „Reset on Return“-Feature die Connection/Transaction zur Handhabung aufruft, wobei die „Disconnect Detection“ erfasst werden könnte. Es ist jedoch möglich, dass die neuere Änderung in #2985 es wahrscheinlicher machte, dies als „Connection Invalidate“-Operation zu sehen, da die Verbindungsinvalidierung viel schneller erfolgt und das Problem bei 0.9.4 reproduzierbarer ist als bei 0.9.3.

    Prüfungen wurden nun in jedem Abschnitt hinzugefügt, in dem eine Invalidierung auftreten könnte, um weitere nicht zulässige Operationen auf der invalidierten Verbindung zu verhindern. Dies beinhaltet zwei Korrekturen sowohl auf Engine- als auch auf Pool-Ebene. Obwohl das Problem bei stark gleichzeitigen Gevent-Fällen beobachtet wurde, könnte es theoretisch in jeder Art von Szenario auftreten, in dem eine Trennung während des Schließvorgangs der Verbindung auftritt.

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

    Referenzen: #3043

  • [engine] [bug]

    Die Fehlerbehandlungs- und Wrapper-Routinen auf Engine-Ebene werden nun in allen Anwendungsfällen der Engine-Verbindung wirksam, einschließlich der Verwendung benutzerdefinierter Verbindungsroutinen über den Parameter `create_engine.creator` sowie wenn die `Connection` bei der Revalidierung auf einen Verbindungsfehler stößt.

    Referenzen: #3266

  • [engine] [bug]

    Das Hinzufügen oder Entfernen eines Event-Listeners während des Laufs des Events selbst, sei es aus dem Listener heraus oder von einem konkurrierenden Thread, löst nun eine `RuntimeError` aus, da die verwendete Sammlung eine Instanz von `collections.deque()` ist und Änderungen während der Iteration nicht unterstützt. Zuvor wurde eine einfache Python-Liste verwendet, bei der die Entfernung innerhalb des Events zu stillen Fehlern führte.

    Referenzen: #3163

sql

  • [sql] [feature]

    Der Vertrag für `Index` wurde etwas gelockert, indem nun ein `text()`-Ausdruck als Ziel angegeben werden kann. Der Index muss keine tabellengebundene Spalte mehr haben, wenn der Index manuell zur Tabelle hinzugefügt werden soll, sei es über eine Inline-Deklaration oder über `Table.append_constraint()`.

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

    Referenzen: #3028

  • [sql] [feature]

    Neues Flag `between.symmetric`, das, wenn es auf True gesetzt ist, „BETWEEN SYMMETRIC“ rendert. Ebenfalls hinzugefügt wurde ein neuer Negationsoperator „notbetween_op“, der nun einen Ausdruck wie `~col.between(x, y)` ermöglicht, um als „col NOT BETWEEN x AND y“ gerendert zu werden, anstatt als eine geklammerte NOT-Zeichenkette.

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

    Referenzen: #2990

  • [sql] [feature]

    Der SQL-Compiler generiert nun die Zuordnung der erwarteten Spalten so, dass sie positionsabhängig mit dem empfangenen Ergebnis-Set übereinstimmen, anstatt nach Namen. Ursprünglich wurde dies als eine Möglichkeit gesehen, Fälle zu behandeln, in denen Spalten mit schwer vorhersehbaren Namen zurückgegeben wurden, obwohl dieses Problem in der modernen Nutzung durch anonyme Labeling behoben wurde. In dieser Version reduziert der Ansatz im Wesentlichen die Anzahl der Funktionsaufrufe pro Ergebnis um einige Dutzend, oder mehr für größere Ergebnisspaltenmengen. Der Ansatz degeneriert immer noch in eine moderne Version des alten Ansatzes, wenn eine Diskrepanz in der Größe zwischen der kompilierten Menge von Spalten und dem Empfangenen besteht, sodass es keine Probleme für teilweise oder vollständig textuelle Kompilierungsszenarien gibt, bei denen diese Listen möglicherweise nicht übereinstimmen.

    Referenzen: #918

  • [sql] [feature]

    Literale Werte innerhalb einer `DefaultClause`, die beim Verwenden des Parameters `Column.server_default` aufgerufen wird, werden nun mit dem „Inline“-Compiler gerendert, sodass sie als-is gerendert werden und nicht als gebundene Parameter.

    Referenzen: #3087

  • [sql] [feature]

    Der Typ des Ausdrucks wird gemeldet, wenn ein Objekt, das an eine SQL-Ausdruckseinheit übergeben wird, nicht als SQL-Fragment interpretiert werden kann. Pull-Request mit freundlicher Genehmigung von Ryan P. Kelly.

  • [sql] [feature]

    Neuer Parameter `Table.tometadata.name` wurde der `Table.tometadata()`-Methode hinzugefügt. Ähnlich wie `Table.tometadata.schema` bewirkt dieses Argument, dass die neu kopierte `Table` den neuen Namen anstelle des vorhandenen annimmt. Eine interessante Fähigkeit, die dies hinzufügt, ist die Möglichkeit, ein `Table`-Objekt auf dasselbe `MetaData`-Ziel mit einem neuen Namen zu kopieren. Pull-Request mit freundlicher Genehmigung von n.d. parker.

  • [sql] [feature]

    Die Fehlermeldungen wurden etwas aufpoliert. Die SQL-Anweisung und die Parameter werden nicht angezeigt, wenn sie `None` sind, was die Verwirrung bei Fehlermeldungen reduziert, die nicht mit einer Anweisung zusammenhängen. Der vollständige Modul- und Klassenname der DBAPI-Level-Ausnahme wird angezeigt, sodass klar ist, dass es sich um eine gekapselte DBAPI-Ausnahme handelt. Die Anweisung und die Parameter selbst sind in eckige Klammern gesetzt, um sie besser von der Fehlermeldung und voneinander zu trennen.

    Referenzen: #3172

  • [sql] [feature]

    `Insert.from_select()` enthält nun Python- und SQL-Ausdrucksstandardwerte, wenn diese anderweitig nicht spezifiziert sind. Die Einschränkung, dass Nicht-Server-Spaltenstandards nicht in einen INSERT FROM SELECT aufgenommen werden, wurde aufgehoben, und diese Ausdrücke werden als Konstanten in die SELECT-Anweisung gerendert.

  • [sql] [feature]

    Das `UniqueConstraint`-Konstrukt wird nun beim Reflektieren eines `Table`-Objekts für Datenbanken, bei denen dies zutrifft, einbezogen. Um dies mit ausreichender Genauigkeit zu erreichen, enthalten MySQL und PostgreSQL nun Funktionen, die Duplikate von Indizes und eindeutigen Einschränkungen bei der Reflexion von Tabellen, Indizes und Einschränkungen korrigieren. Im Fall von MySQL gibt es tatsächlich kein unabhängiges Konzept für eine „eindeutige Einschränkung“ neben einem „eindeutigen Index“, sodass für dieses Backend `UniqueConstraint` für eine reflektierte `Table` weiterhin nicht vorhanden ist. Für PostgreSQL wurde die Abfrage zur Erkennung von Indizes gegen `pg_index` verbessert, um dasselbe Konstrukt in `pg_constraint` zu überprüfen, und der implizit konstruierte eindeutige Index wird nicht mit einer reflektierten `Table` aufgenommen.

    In beiden Fällen geben die Methoden `Inspector.get_indexes()` und `Inspector.get_unique_constraints()` beide Konstrukte einzeln zurück, enthalten aber ein neues Token `duplicates_constraint` im Fall von PostgreSQL oder `duplicates_index` im Fall von MySQL, um anzuzeigen, wann diese Bedingung erkannt wird. Pull-Request mit freundlicher Genehmigung von Johannes Erdfelt.

    Referenzen: #3184

  • [sql] [feature]

    Neue Methode `Select.with_statement_hint()` und ORM-Methode `Query.with_statement_hint()` wurden hinzugefügt, um statement-bezogene Hints zu unterstützen, die nicht spezifisch für eine Tabelle sind.

    Referenzen: #3206

  • [sql] [feature]

    Der Parameter `info` wurde als Konstruktorargument zu allen Schema-Konstrukten hinzugefügt, einschließlich `MetaData`, `Index`, `ForeignKey`, `ForeignKeyConstraint`, `UniqueConstraint`, `PrimaryKeyConstraint`, `CheckConstraint`.

    Referenzen: #2963

  • [sql] [feature]

    Das Flag `Table.autoload_with` impliziert nun, dass `Table.autoload` auf `True` gesetzt sein sollte. Pull-Request mit freundlicher Genehmigung von Malik Diarra.

    Referenzen: #3027

  • [sql] [feature]

    Die Methoden `Select.limit()` und `Select.offset()` akzeptieren nun zusätzlich zu Ganzzahlwerten beliebige SQL-Ausdrücke als Argumente. Typischerweise wird dies verwendet, um die Übergabe eines gebundenen Parameters zu ermöglichen, der später durch einen Wert ersetzt werden kann, wodurch das Caching der SQL-Abfrage auf Python-Seite ermöglicht wird. Die Implementierung hier ist vollständig abwärtskompatibel mit bestehenden Drittanbieter-Dialekten. Diese Dialekte, die spezielle LIMIT/OFFSET-Systeme implementieren, müssen jedoch modifiziert werden, um die neuen Funktionen nutzen zu können. Limit und Offset unterstützen auch den Modus „literal_binds“.

    Referenzen: #3034

  • [sql] [changed]

    Die Konstrukte column() und table() sind jetzt aus dem Namensraum „from sqlalchemy“ importierbar, genau wie alle anderen Core-Konstrukte.

  • [sql] [changed]

    Die implizite Umwandlung von Strings in text()-Konstrukte, wenn sie an die meisten Builder-Methoden von select() sowie Query übergeben werden, gibt jetzt eine Warnung aus, wobei nur der reine String gesendet wird. Die textuelle Umwandlung erfolgt jedoch weiterhin normal. Die einzigen Methoden, die einen String ohne Warnung akzeptieren, sind die „Label-Referenz“-Methoden wie order_by(), group_by(); diese Funktionen versuchen nun zur Kompilierungszeit, ein einzelnes String-Argument in eine Spalten- oder Label-Expression aufzulösen, die in der wählbaren vorhanden ist; wenn keine gefunden wird, wird die Expression immer noch gerendert, aber Sie erhalten erneut die Warnung. Die Begründung hierfür ist, dass die implizite Umwandlung von String zu Text heutzutage eher unerwartet ist, als nicht, und es ist besser, wenn der Benutzer dem Core / ORM mehr Anweisungen gibt, wenn er einen rohen String übergibt, in welche Richtung er gehen soll. Core/ORM-Tutorials wurden aktualisiert, um tiefer darauf einzugehen, wie Text behandelt wird.

    Referenzen: #2992

  • [sql] [bug]

    Fehler bei Enum und anderen SchemaType-Unterklassen behoben, bei denen die direkte Zuordnung des Typs zu einem MetaData zu einem Hängenbleiben führte, wenn Ereignisse (wie Erstellungsereignisse) auf dem MetaData ausgelöst wurden.

    Diese Änderung wurde auch **zurückportiert** nach: 0.9.7, 0.8.7

    Referenzen: #3124

  • [sql] [bug]

    Fehler im benutzerdefinierten Operator Plus TypeEngine.with_variant() behoben, bei dem die Verwendung eines TypeDecorator in Verbindung mit Varianten mit einem MRO-Fehler fehlschlug, wenn ein Vergleichsoperator verwendet wurde.

    Diese Änderung wurde auch **zurückportiert** nach: 0.9.7, 0.8.7

    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.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3044

  • [sql] [bug]

    Behobener Fehler, bei dem Table.update() und Table.delete() eine leere WHERE-Klausel erzeugten, wenn ein leeres and_() oder or_() oder ein anderer leerer Ausdruck angewendet wurde. Dies ist nun konsistent mit dem von select().

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3045

  • [sql] [bug]

    Das Flag native_enum wurde der Ausgabe von __repr__() von Enum hinzugefügt, was hauptsächlich wichtig ist, wenn es mit Alembic autogenerate verwendet wird. Pull-Request von Dimitris Theodorou.

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

  • [sql] [bug]

    Fehler behoben, bei dem die Verwendung eines TypeDecorator, der einen Typ implementierte, der ebenfalls ein TypeDecorator war, mit dem Python-Fehler „Cannot create a consistent method resolution order (MRO)“ fehlschlug, wenn beliebige SQL-Vergleichsausdrücke gegen ein Objekt verwendet wurden, das diesen Typ verwendete.

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

    Referenzen: #3278

  • [sql] [bug]

    Problem behoben, bei dem die Spalten aus einem in einem INSERT eingebetteten SELECT, entweder über die VALUES-Klausel oder als „from select“, die Spaltentypen verunreinigten, die im Ergebnis der RETURNING-Klausel verwendet wurden, wenn Spalten aus beiden Anweisungen denselben Namen hatten, was zu potenziellen Fehlern oder Fehlanpassungen beim Abrufen der zurückgegebenen Zeilen führte.

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

    Referenzen: #3248

  • [sql] [bug]

    Fehler behoben, bei dem eine beträchtliche Anzahl von SQL-Elementen innerhalb des sql-Pakets nicht erfolgreich __repr__() konnte, aufgrund eines fehlenden description-Attributs, das dann einen Rekursionsüberlauf auslöste, wenn ein interner AttributeError erneut __repr__() aufrief.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3195

  • [sql] [bug]

    Eine Anpassung der Tabellen-/Index-Reflexion, so dass, wenn ein Index eine Spalte meldet, die nicht in der Tabelle gefunden wird, eine Warnung ausgegeben und die Spalte übersprungen wird. Dies kann bei einigen speziellen Systemspaltensituationen auftreten, wie sie bei Oracle beobachtet wurden.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3180

  • [sql] [bug]

    Fehler in CTE behoben, bei dem das Compiler-Argument literal_binds nicht immer korrekt weitergegeben wurde, wenn eine CTE auf eine andere aliasierte CTE in einer Anweisung verwies.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3154

  • [sql] [bug]

    0.9.7-Regression behoben, verursacht durch #3067 in Verbindung mit einem falsch benannten Unit-Test, sodass sogenannte „Schema“-Typen wie Boolean und Enum nicht mehr gepickelt werden konnten.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3067, #3144

  • [sql] [bug]

    Fehler in der Naming-Convention-Funktion behoben, bei der die Verwendung einer CHECK-Constraint-Konvention, die constraint_name enthielt, dazu führte, dass alle Boolean- und Enum-Typen ebenfalls Namen benötigten, da diese implizit einen Constraint erstellen, auch wenn das ultimative Ziel-Backend eines ist, das die Erzeugung des Constraints nicht erfordert, wie z. B. PostgreSQL. Die Mechanik von Naming Conventions für diese spezifischen Constraints wurde neu organisiert, sodass die Namensbestimmung zur DDL-Kompilierungszeit und nicht zur Constraint-/Tabellenkonstruktionszeit erfolgt.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3067

  • [sql] [bug]

    Fehler bei Common Table Expressions behoben, bei denen positionelle gebundene Parameter in der falschen endgültigen Reihenfolge ausgedrückt werden konnten, wenn CTEs auf bestimmte Weise verschachtelt waren.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3090

  • [sql] [bug]

    Fehler behoben, bei dem mehrwertige Insert-Konstrukte nachfolgende Werteinträge über den ersten hinaus, der für literale SQL-Ausdrücke angegeben wurde, nicht mehr überprüften.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3069

  • [sql] [bug]

    Ein „str()“-Schritt wurde zur Iteration der dialect_kwargs für Python-Versionen < 2.6.5 hinzugefügt, um den „no unicode keyword arg“-Fehler zu umgehen, da diese Argumente bei einigen Reflektionsprozessen als Keyword-Argumente weitergegeben werden.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3123

  • [sql] [bug]

    Die Methode TypeEngine.with_variant() akzeptiert jetzt eine Typklasse als Argument, die intern in eine Instanz umgewandelt wird, unter Verwendung desselben Konventionsprinzips, das lange von anderen Konstrukten wie Column etabliert wurde.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3122

  • [sql] [bug]

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

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

    Referenzen: #3023

  • [sql] [bug]

    Behobener Fehler, bei dem die Methodenüberladungen für die Operatoren Operators.__and__(), Operators.__or__() und Operators.__invert__() innerhalb einer benutzerdefinierten Comparator-Implementierung nicht überschrieben werden konnten.

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

    Referenzen: #3012

  • [sql] [bug]

    Fehler in der neuen Methode DialectKWArgs.argument_for() behoben, bei der das Hinzufügen eines Arguments für ein Konstrukt, das bisher keine speziellen Argumente enthielt, fehlschlug.

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

    Referenzen: #3024

  • [sql] [bug]

    Regression, die in 0.9 eingeführt wurde, behoben, bei der das neue Feature „ORDER BY <labelname>“ aus #1068 keine Quoting-Regeln auf den Labelnamen anwendete, wie er in der ORDER BY-Klausel gerendert wurde.

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

    Referenzen: #1068, #3020

  • [sql] [bug]

    Der Import für Function in den Namensraum sqlalchemy.sql.expression wurde wiederhergestellt, der zu Beginn von 0.9 entfernt wurde.

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

  • [sql] [bug]

    Die Multi-Value-Version von Insert.values() wurde repariert, um besser mit Tabellen zu funktionieren, die Python-seitige Standardwerte und/oder Funktionen sowie serverseitige Standardwerte haben. Das Feature funktioniert jetzt auch mit einem Dialekt, der „positionelle“ Parameter verwendet; ein Python-Callable wird für jede Zeile individuell aufgerufen, genau wie bei einer „executemany“-artigen Ausführung; eine serverseitige Standardspalte erhält nicht mehr implizit den für die erste Zeile explizit angegebenen Wert, sondern verweigert stattdessen die Ausführung ohne expliziten Wert.

    Referenzen: #3288

  • [sql] [bug]

    Fehler in der Methode Table.tometadata() behoben, bei der der mit einem Boolean- oder Enum-Typobjekt verbundene CheckConstraint-Konstrukt in der Ziel-Tabelle verdoppelt wurde. Der Kopierprozess verfolgt nun die Erzeugung dieses Constraint-Objekts als lokal für ein Typobjekt.

    Referenzen: #3260

  • [sql] [bug]

    Der Verhaltensvertrag der ForeignKeyConstraint.columns-Sammlung wurde konsistent gemacht; dieses Attribut ist nun eine ColumnCollection, wie sie bei allen anderen Constraints vorhanden ist, und wird zu dem Zeitpunkt initialisiert, an dem der Constraint mit einer Table verknüpft wird.

    Referenzen: #3243

  • [sql] [bug]

    Das Attribut Column.key wird nun als Quelle für anonyme gebundene Parameternamen innerhalb von Ausdrücken verwendet, um der bestehenden Verwendung dieses Werts als Schlüssel bei der Darstellung in einer INSERT- oder UPDATE-Anweisung zu entsprechen. Dies ermöglicht die Verwendung von Column.key als „Ersatz“-String, um einen schwierigen Spaltennamen zu umgehen, der sich nicht gut in einen gebundenen Parameternamen übersetzen lässt. Beachten Sie, dass der Parametertyp (paramstyle) auf create_engine() konfigurierbar ist, und die meisten DBAPIs unterstützen heute einen benannten und einen positionellen Stil.

    Referenzen: #3245

  • [sql] [bug]

    Der Name des Parameters PoolEvents.reset.dbapi_connection, wie er an dieses Ereignis übergeben wird, wurde korrigiert; dies betrifft insbesondere die Verwendung des „benannten“ Argumentstils für dieses Ereignis. Pull-Request von Jason Goldberger.

  • [sql] [bug]

    Eine in 0.9 vorgenommene Änderung wurde rückgängig gemacht: Die „Singleton“-Natur der „Konstanten“-Funktionen null(), true() und false() wurde zurückgenommen. Diese Funktionen, die ein „Singleton“-Objekt zurückgeben, hatten zur Folge, dass unterschiedliche Instanzen unabhängig von der lexikalischen Verwendung als gleich behandelt wurden, was insbesondere die Darstellung der Spaltenklausel einer SELECT-Anweisung beeinträchtigte.

    Referenzen: #3170

  • [sql] [bug] [engine]

    Fehler behoben, bei dem eine „verzweigte“ Verbindung, d. h. die Art, die man erhält, wenn man Connection.connect() aufruft, den Invalidierungsstatus nicht mit der übergeordneten Verbindung teilte. Die Architektur der Verzweigung wurde leicht angepasst, sodass die verzweigte Verbindung für alle Invalidierungsstatus und Operationen auf die übergeordnete Verbindung verweist.

    Referenzen: #3215

  • [sql] [bug] [engine]

    Fehler behoben, bei dem eine „verzweigte“ Verbindung, d. h. die Art, die man erhält, wenn man Connection.connect() aufruft, den Transaktionsstatus nicht mit der übergeordneten Verbindung teilte. Die Architektur der Verzweigung wurde leicht angepasst, sodass die verzweigte Verbindung für alle Transaktionsstatus und Operationen auf die übergeordnete Verbindung verweist.

    Referenzen: #3190

  • [sql] [bug]

    Die Verwendung von Insert.from_select() impliziert nun inline=True bei insert(). Dies hilft, einen Fehler zu beheben, bei dem ein INSERT…FROM SELECT-Konstrukt unbeabsichtigt als „implizites RETURNING“ auf unterstützenden Backends kompiliert wurde, was im Fall eines INSERTs, der null Zeilen einfügt (da implizites RETURNING eine Zeile erwartet), zu Fehlern führte, sowie zu willkürlichen Rückgabedaten im Fall eines INSERTs, der mehrere Zeilen einfügt (z. B. nur die erste von vielen). Eine ähnliche Änderung wurde auch für einen INSERT..VALUES mit mehreren Parametersätzen vorgenommen; implizites RETURNING wird für diese Anweisung ebenfalls nicht mehr ausgegeben. Da beide Konstrukte mit variablen Zeilenanzahlen umgehen, ist der Zugriff ResultProxy.inserted_primary_key nicht anwendbar. Zuvor gab es einen Dokumentationshinweis, dass man inline=True mit INSERT..FROM SELECT bevorzugen könnte, da einige Datenbanken kein RETURNING unterstützen und daher kein „implizites“ RETURNING durchführen können, aber es gibt keinen Grund, warum ein INSERT…FROM SELECT überhaupt implizites RETURNING benötigt. Reguläres explizites Insert.returning() sollte verwendet werden, um variable Mengen von Ergebniszeilen zurückzugeben, wenn eingefügte Daten benötigt werden.

    Referenzen: #3169

  • [sql] [enhancement]

    Benutzerdefinierte Dialekte, die GenericTypeCompiler implementieren, können nun so konstruiert werden, dass die Visit-Methoden eine Angabe des besitzenden Ausdrucksobjekts erhalten, falls vorhanden. Jede Visit-Methode, die Schlüsselwortargumente akzeptiert (z. B. **kw), erhält in den meisten Fällen ein Schlüsselwortargument type_expression, das sich auf das Ausdrucksobjekt bezieht, in dem der Typ enthalten ist. Für Spalten in DDL muss die Compiler-Klasse des Dialekts möglicherweise seine Methode get_column_specification() anpassen, um dies ebenfalls zu unterstützen. Die Methode UserDefinedType.get_col_spec() erhält ebenfalls type_expression, wenn sie **kw in ihrer Argumentsignatur bereitstellt.

    Referenzen: #3074

schema

postgresql

  • [postgresql] [feature]

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

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

  • [postgresql] [feature] [pg8000]

    Unterstützung für „sane multi row count“ mit dem pg8000-Treiber wird hinzugefügt, was hauptsächlich für die Verwendung der Versionierung mit dem ORM gilt. Die Funktion wird versionstechnisch auf pg8000 1.9.14 oder höher erkannt. Pull-Request von Tony Locke.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

  • [postgresql] [feature]

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

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3078

  • [postgresql] [feature]

    Unterstützung für PostgreSQL JSONB über JSONB hinzugefügt. Pull-Request von Damian Dimmich.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

  • [postgresql] [feature]

    Unterstützung für das AUTOCOMMIT-Isolationslevel bei Verwendung des pg8000 DBAPI hinzugefügt. Pull-Request von Tony Locke.

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

  • [postgresql] [feature]

    Hinzugefügt wurde ein neuer Flag ARRAY.zero_indexes zum PostgreSQL ARRAY-Typ. Wenn auf True gesetzt, wird ein Wert von eins zu allen Array-Indexwerten hinzugefügt, bevor diese an die Datenbank übergeben werden, was eine bessere Interoperabilität zwischen Python-basierten Null-basierten Indizes und PostgreSQL-basierten Ein-basierten Indizes ermöglicht. Pull-Request von Alexey Terentev.

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

    Referenzen: #2785

  • [postgresql] [feature]

    Das PG8000-Dialekt unterstützt nun den Parameter create_engine.encoding, indem die Client-Kodierung in der Verbindung eingerichtet wird, die dann von pg8000 abgefangen wird. Pull-Request von Tony Locke.

  • [postgresql] [feature]

    Unterstützung für die native JSONB-Funktion von PG8000 hinzugefügt. Pull-Request von Tony Locke.

  • [postgresql] [feature] [pypy]

    Unterstützung für den psycopg2cffi DBAPI auf pypy hinzugefügt. Pull-Request von shauns.

    Referenzen: #3052

  • [postgresql] [feature]

    Unterstützung für das FILTER-Schlüsselwort bei Aggregatfunktionen hinzugefügt, unterstützt von PostgreSQL 9.4. Pull-Request von Ilja Everilä.

  • [postgresql] [feature]

    Unterstützung für die Reflexion von Materialized Views und Foreign Tables wurde hinzugefügt, sowie Unterstützung für Materialized Views innerhalb von Inspector.get_view_names() und eine neue Methode PGInspector.get_foreign_table_names(), die für die PostgreSQL-Version von Inspector verfügbar ist. Pull-Request von Rodrigo Menezes.

    Referenzen: #2891

  • [postgresql] [feature]

    Unterstützung für PG-Tabellenoptionen TABLESPACE, ON COMMIT, WITH(OUT) OIDS und INHERITS wurde hinzugefügt, wenn DDL über das Table-Konstrukt gerendert wird. Pull-Request von malikdiarra.

    Referenzen: #2051

  • [postgresql] [feature]

    Neue Methode PGInspector.get_enums() hinzugefügt, die bei Verwendung des Inspektors für PostgreSQL eine Liste von ENUM-Typen liefert. Pull-Request von Ilya Pekelny.

  • [postgresql] [bug]

    Das Flag hashable=False wurde dem PG HSTORE-Typ hinzugefügt, was erforderlich ist, damit der ORM versucht, eine ORM-gemappte HSTORE-Spalte beim Anfordern in einer gemischten Spalten-/Entitätsliste nicht zu "hashen". Patch von Gunnlaugur Þór Briem.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3053

  • [postgresql] [bug]

    Eine neue "disconnect"-Nachricht "connection has been closed unexpectedly" wurde hinzugefügt. Dies scheint mit neueren SSL-Versionen zusammenzuhängen. Pull-Request von Antti Haapala.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

  • [postgresql] [bug]

    Reparierte Unterstützung für PostgreSQL UUID-Typen in Verbindung mit dem ARRAY-Typ bei Verwendung von psycopg2. Der psycopg2-Dialekt verwendet nun den Hook psycopg2.extras.register_uuid(), so dass UUID-Werte immer als UUID()-Objekte an/von DBAPI übergeben werden. Das Flag UUID.as_uuid wird weiterhin beachtet, außer bei psycopg2, wo zurückgegebene UUID-Objekte wieder in Strings umgewandelt werden müssen, wenn dies deaktiviert ist.

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

    Referenzen: #2940

  • [postgresql] [bug]

    Unterstützung für den postgresql.JSONB-Datentyp wurde hinzugefügt, wenn psycopg2 2.5.4 oder höher verwendet wird, der eine native Konvertierung von JSONB-Daten bietet, so dass die Konverter von SQLAlchemy deaktiviert werden müssen; zusätzlich wird die neu hinzugefügte psycopg2-Erweiterung extras.register_default_jsonb verwendet, um einen JSON-Deserialisierer einzurichten, der über das Argument json_deserializer an den Dialekt übergeben wird. Auch die PostgreSQL-Integrationstests, die den JSONB-Typ nicht wirklich hin und her gerundet haben, im Gegensatz zum JSON-Typ, wurden repariert. Pull-Request von Mateusz Susik.

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

  • [postgresql] [bug]

    Die Verwendung des Flags "array_oid" beim Registrieren des HSTORE-Typs mit älteren psycopg2-Versionen < 2.4.3, die dieses Flag nicht unterstützen, sowie die Verwendung des nativen JSON-Serializer-Hooks "register_default_json" mit benutzerdefinierten json_deserializer bei psycopg2-Versionen < 2.5, die kein natives JSON enthalten, wurden repariert.

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

  • [postgresql] [bug]

    Fehler behoben, bei dem der PostgreSQL-Dialekt einen Ausdruck in einem Index, der nicht direkt einer tabellengebundenen Spalte entsprach, nicht rendern konnte; typischerweise, wenn ein text()-Konstrukt eines der Ausdrücke innerhalb des Index war; oder die Liste der Ausdrücke falsch interpretieren konnte, wenn einer oder mehrere davon ein solches Konstrukt waren.

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

    Referenzen: #3174

  • [postgresql] [bug]

    Eine Überarbeitung dieser in 0.9.5 erstmals gepatchten Problematik: Anscheinend ist der `.closed`-Accessor von psycopg2 nicht so zuverlässig, wie wir angenommen hatten. Daher haben wir eine explizite Prüfung auf die Fehlermeldungen „SSL SYSCALL error: Bad file descriptor“ und „SSL SYSCALL error: EOF detected“ hinzugefügt, um einen Trennungsfall zu erkennen. Wir werden weiterhin `connection.closed` von psycopg2 als erste Prüfung heranziehen.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3021

  • [postgresql] [bug]

    Fehler behoben, bei dem der PostgreSQL JSON-Typ keinen SQL NULL-Spaltenwert speichern oder anderweitig rendern konnte, sondern stattdessen einen JSON-kodierten 'null'. Um diesen Fall zu unterstützen, sind die Änderungen wie folgt:

    • Der Wert null() kann nun angegeben werden, was immer zu einem NULL-Wert in der Anweisung führt.

    • Ein neuer Parameter JSON.none_as_null wird hinzugefügt. Wenn dieser auf True gesetzt ist, bedeutet dies, dass der Python None-Wert als SQL NULL gespeichert werden soll, anstatt als JSON-kodierter 'null'.

    Die Abholung von NULL als None ist auch für andere DBAPIs als psycopg2, nämlich pg8000, repariert.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3159

  • [postgresql] [bug]

    Das Exception-Wrapping-System für DBAPI-Fehler kann nun nicht standardmäßige DBAPI-Exceptions, wie die psycopg2 TransactionRollbackError, aufnehmen. Diese Exceptions werden nun über die nächstgelegene verfügbare Unterklasse in sqlalchemy.exc ausgelöst, im Falle von TransactionRollbackError sqlalchemy.exc.OperationalError.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3075

  • [postgresql] [bug]

    Fehler im array-Objekt behoben, bei dem der Vergleich mit einer einfachen Python-Liste fehlschlug, den richtigen Array-Konstruktor zu verwenden. Pull-Request von Andrew.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3141

  • [postgresql] [bug]

    Eine unterstützte Methode FunctionElement.alias() wurde zu Funktionen hinzugefügt, z. B. dem func-Konstrukt. Zuvor war das Verhalten dieser Methode undefiniert. Das aktuelle Verhalten imitiert das von vor 0.9.4, bei dem die Funktion in eine FROM-Klausel mit einer Spalte und dem angegebenen Aliasnamen umgewandelt wird, wobei die Spalte selbst anonym benannt ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3137

  • [postgresql] [bug] [pg8000]

    Fehler behoben, der in 0.9.5 durch das neue pg8000-Isolationslevel-Feature eingeführt wurde, bei dem der Parameter für das Isolationslevel auf Engine-Ebene beim Verbinden einen Fehler auslöste.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3134

  • [postgresql] [bug]

    Der `closed`-Accessor von psycopg2 wird nun konsultiert, wenn bestimmt wird, ob eine Exception ein "Disconnect"-Fehler ist. Idealerweise sollte dies die Notwendigkeit weiterer Prüfungen der Exception-Nachricht zur Erkennung einer Trennung beseitigen. Wir werden die bestehenden Nachrichten jedoch als Fallback beibehalten. Dies sollte neuere Fälle wie "SSL EOF"-Bedingungen behandeln können. Pull-Request von Dirk Mueller.

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

    Referenzen: #3021

  • [postgresql] [bug]

    Der PostgreSQL ENUM-Typ gibt eine DROP TYPE-Anweisung aus, wenn ein einfaches table.drop() aufgerufen wird, vorausgesetzt, das Objekt ist nicht direkt mit einem MetaData-Objekt verbunden. Um den Anwendungsfall eines Enumerationstyps, der zwischen mehreren Tabellen geteilt wird, zu unterstützen, sollte der Typ direkt mit dem MetaData-Objekt verbunden werden. In diesem Fall wird der Typ nur auf Metadatenebene oder wenn er direkt erstellt wird, erstellt. Die Regeln für das Erstellen/Löschen von PostgreSQL-Enumerationstypen wurden im Allgemeinen stark überarbeitet.

    Referenzen: #3319

  • [postgresql] [bug]

    Die Methode PGDialect.has_table() fragt nun gegen pg_catalog.pg_table_is_visible(c.oid) ab, anstatt auf eine exakte Schemaprofilübereinstimmung zu prüfen, wenn der Schemaname None ist. Dies dient dazu, auch temporäre Tabellen anzuzeigen. Dies ist eine Verhaltensänderung, da PostgreSQL erlaubt, dass eine nicht-temporäre Tabelle eine vorhandene temporäre Tabelle gleichen Namens stillschweigend überschreibt. Daher ändert dies das Verhalten von checkfirst in diesem ungewöhnlichen Szenario.

    Referenzen: #3264

  • [postgresql] [enhancement]

    Neuer Typ OID für den PostgreSQL-Dialekt hinzugefügt. Obwohl "oid" im Allgemeinen ein privater Typ in PG ist, der in modernen Versionen nicht freigelegt wird, gibt es einige PG-Anwendungsfälle, wie z. B. die Unterstützung von großen Objekten, bei denen diese Typen freigelegt werden könnten, sowie innerhalb einiger vom Benutzer gemeldeter Schemareflexions-Anwendungsfälle.

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

    Referenzen: #3002

mysql

  • [mysql] [feature]

    Der MySQL-Dialekt rendert nun TIMESTAMP mit NULL / NOT NULL in allen Fällen, so dass MySQL 5.6.6 mit dem Flag explicit_defaults_for_timestamp, das aktiviert ist, TIMESTAMP weiterhin wie erwartet zulässt, wenn nullable=False ist. Bestehende Anwendungen sind nicht betroffen, da SQLAlchemy für eine TIMESTAMP-Spalte, die nullable=True ist, schon immer NULL ausgegeben hat.

    Referenzen: #3155

  • [mysql] [feature]

    Das Flag "supports_unicode_statements" wurde für MySQLdb und Pymysql unter Python 2 auf True gesetzt. Dies bezieht sich auf die SQL-Anweisungen selbst, nicht auf die Parameter, und betrifft Probleme wie Tabellen- und Spaltennamen, die Nicht-ASCII-Zeichen verwenden. Diese Treiber scheinen moderne Versionen von Python 2 Unicode-Objekten problemlos zu unterstützen.

    Referenzen: #3121

  • [mysql] [change]

    Der gaerdbms-Dialekt ist nicht mehr notwendig und gibt eine Deprecation-Warnung aus. Google empfiehlt nun die direkte Verwendung des MySQLdb-Dialekts.

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

    Referenzen: #3275

  • [mysql] [bug]

    MySQL-Fehler 2014 "commands out of sync" wird in modernen MySQL-Python-Versionen als ProgrammingError und nicht als OperationalError ausgelöst; alle MySQL-Fehlercodes, die auf "disconnect" geprüft werden, werden nun unabhängig voneinander innerhalb von OperationalError und ProgrammingError geprüft.

    Diese Änderung wurde auch **zurückportiert** nach: 0.9.7, 0.8.7

    Referenzen: #3101

  • [mysql] [bug]

    Fehler behoben, bei dem Spaltennamen, die dem Parameter mysql_length auf einem Index hinzugefügt wurden, die gleiche Anführungszeichen für Anführungszeichennamen benötigten, um erkannt zu werden. Die Korrektur macht die Anführungszeichen optional, bietet aber auch das alte Verhalten für Abwärtskompatibilität mit denen, die den Workaround verwenden.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3085

  • [mysql] [bug]

    Unterstützung für das Reflektieren von Tabellen hinzugefügt, bei denen ein Index KEY_BLOCK_SIZE mit einem Gleichheitszeichen enthält. Pull-Request von Sean McGivern.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

  • [mysql] [bug]

    Eine Versionsprüfung wurde dem MySQLdb-Dialekt hinzugefügt, die die Prüfung auf die Kollation „utf8_bin“ umgibt, da diese auf MySQL-Servern < 5.0 fehlschlägt.

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

    Referenzen: #3274

  • [mysql] [bug] [mysqlconnector]

    Mysqlconnector erwartet ab Version 2.0, wahrscheinlich als Nebeneffekt des Python 3-Merges, nicht mehr, dass Prozentzeichen (z. B. wie beim Modulo-Operator und anderen verwendet) verdoppelt werden, selbst bei Verwendung des "pyformat"-Format für gebundene Parameter (diese Änderung ist von Mysqlconnector nicht dokumentiert). Der Dialekt prüft nun auf py2k und auf mysqlconnector vor Version 2.0, wenn er erkennt, ob der Modulo-Operator als %% oder % gerendert werden soll.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

  • [mysql] [bug] [mysqlconnector]

    Unicode-SQL wird nun für MySQLconnector Version 2.0 und höher übergeben; für Py2k und MySQL < 2.0 werden Strings kodiert.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

  • [mysql] [bug]

    Der MySQL-Dialekt unterstützt nun CAST auf Typen, die als TypeDecorator-Objekte konstruiert werden.

  • [mysql] [bug]

    Eine Warnung wird ausgegeben, wenn cast() mit dem MySQL-Dialekt auf einem Typ verwendet wird, für den MySQL kein CAST unterstützt; MySQL unterstützt CAST nur für eine Teilmenge von Datentypen. SQLAlchemy hat in diesem Fall für MySQL CAST schon lange einfach weggelassen. Obwohl wir dies jetzt nicht ändern möchten, geben wir eine Warnung aus, um zu zeigen, dass dies geschehen ist. Eine Warnung wird auch ausgegeben, wenn ein CAST mit einer älteren MySQL-Version (< 4) verwendet wird, die CAST gar nicht unterstützt; in diesem Fall wird es ebenfalls übersprungen.

    Referenzen: #3237

  • [mysql] [bug]

    Der SET-Typ wurde überarbeitet, sodass er nicht mehr davon ausgeht, dass ein leerer String oder ein Set mit einem einzelnen leeren String tatsächlich ein Set mit einem einzelnen leeren String ist; stattdessen wird dies standardmäßig als leeres Set behandelt. Um die Speicherung eines SET zu ermöglichen, das tatsächlich den leeren Wert '' als legitimen Wert enthalten soll, wird ein neuer bitweiser Betriebsmodus hinzugefügt, der durch das Flag SET.retrieve_as_bitwise aktiviert wird. Dieser speichert und ruft Werte eindeutig über ihre Bitflag-Position ab. Die Speicherung und Abfrage von Unicode-Werten für Treiberkonfigurationen, die Unicode nicht nativ konvertieren, wurde ebenfalls repariert.

    Referenzen: #3283

  • [mysql] [bug]

    Der Operator ColumnOperators.match() wird nun so behandelt, dass der Rückgabetyp nicht mehr strikt als boolesch angenommen wird; er gibt nun eine Boolean-Unterklasse namens MatchType zurück. Der Typ verhält sich in Python-Ausdrücken weiterhin boolesch, jedoch kann der Dialekt sein Verhalten zur Zeit der Ergebnisverarbeitung überschreiben. Im Falle von MySQL, obwohl der MATCH-Operator typischerweise in einem booleschen Kontext innerhalb eines Ausdrucks verwendet wird, wird bei tatsächlicher Abfrage des Wertes eines Match-Ausdrucks ein Gleitkommawert zurückgegeben. Dieser Wert ist nicht mit dem C-basierten booleschen Prozessor von SQLAlchemy kompatibel, sodass das Ergebnisverhalten von MySQL nun dem des Float-Typs folgt. Ein neues Operatorobjekt notmatch_op wird ebenfalls hinzugefügt, um es Dialekten besser zu ermöglichen, die Negation einer Match-Operation zu definieren.

    Referenzen: #3263

  • [mysql] [bug]

    MySQL-Boolesche Symbole "true", "false" funktionieren wieder. Die Änderung in 0.9 in #2682 verhinderte, dass der MySQL-Dialekt die Symbole "true" und "false" im Kontext von "IS" / "IS NOT" verwendete, aber MySQL unterstützt diese Syntax, obwohl es keinen booleschen Typ hat. MySQL bleibt "nicht nativer boolescher", aber die Symbole true() und false() erzeugen wieder die Schlüsselwörter "true" und "false", so dass ein Ausdruck wie column.is_(true()) auf MySQL wieder funktioniert.

    Referenzen: #3186

  • [mysql] [bug]

    Der MySQL-Dialekt deaktiviert nun die Auslösung von ConnectionEvents.handle_error()-Events für die Anweisungen, die er intern verwendet, um zu erkennen, ob eine Tabelle existiert oder nicht. Dies geschieht durch eine Ausführungsoption skip_user_error_events, die das handle_error-Event für den Geltungsbereich dieser Ausführung deaktiviert. Auf diese Weise müssen benutzerdefinierte Codes, die Exceptions umschreiben, sich keine Sorgen um den MySQL-Dialekt oder andere Dialekte machen, die gelegentlich SQLAlchemy-spezifische Exceptions abfangen müssen.

  • [mysql] [bug]

    Der Standardwert von "raise_on_warnings" wurde für MySQLconnector auf False geändert. Dieser war aus irgendeinem Grund auf True gesetzt. Das "buffered"-Flag muss leider auf True bleiben, da MySQLconnector einen Cursor nicht schließen lässt, bevor nicht alle Ergebnisse vollständig abgerufen wurden.

    Referenzen: #2515

sqlite

  • [sqlite] [feature]

    Unterstützung für partielle Indizes (z. B. mit einer WHERE-Klausel) auf SQLite hinzugefügt. Pull-Request von Kai Groner.

    Siehe auch

    Partielle Indizes

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

  • [sqlite] [feature]

    Neues SQLite-Backend für das SQLCipher-Backend hinzugefügt. Dieses Backend bietet verschlüsselte SQLite-Datenbanken mit dem pysqlcipher Python-Treiber, der dem pysqlite-Treiber sehr ähnlich ist.

    Siehe auch

    pysqlcipher

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

  • [sqlite] [bug]

    Beim Auswählen aus einem UNION mit einer angehängten Datenbankdatei meldet der pysqlite-Treiber die Spaltennamen in cursor.description als ‘dbname.tablename.colname’ anstelle von ‘tablename.colname’, wie er es sonst für ein UNION tut (beachten Sie, dass es für beides nur ‘colname’ sein sollte, aber wir umgehen dies). Die Spaltenübersetzungslogik wurde hier angepasst, um das rechteste Token abzurufen, anstatt das zweite Token, damit sie in beiden Fällen funktioniert. Workaround von Tony Roberts.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3211

  • [sqlite] [bug]

    Ein SQLite-Join-Rewriting-Problem behoben, bei dem eine Unterabfrage, die als Skalar-Unterabfrage eingebettet ist, wie z. B. in einem IN-Konstrukt, unangemessene Ersetzungen von der umgebenden Abfrage erhalten würde, wenn dieselbe Tabelle innerhalb der Unterabfrage vorhanden wäre wie in der umgebenden Abfrage, z. B. in einem verbundenen Vererbungsszenario.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3130

  • [sqlite] [bug]

    UNIQUE- und FOREIGN KEY-Constraints werden nun vollständig auf SQLite sowohl mit als auch ohne Namen reflektiert. Zuvor wurden Fremdschlüsselnamen ignoriert und unbenannte eindeutige Constraints übersprungen. Danke an Jon Nelson für die Unterstützung dabei.

    Referenzen: #3244, #3261

  • [sqlite] [bug]

    Der SQLite-Dialekt rendert die Typen in DDL als DATE_CHAR, TIME_CHAR und DATETIME_CHAR, wenn die Typen DATE, TIME oder DATETIME verwendet werden und ein storage_format gegeben ist, das nur Zahlen rendert, damit die Spalte trotz fehlender Alpha-Zeichen in den Werten die "Text-Affinität" liefert. Normalerweise ist dies nicht notwendig, da die textuellen Werte in den Standard-Speicherformaten bereits Text implizieren.

    Referenzen: #3257

  • [sqlite] [bug]

    SQLite unterstützt nun die Reflexion von eindeutigen Constraints von temporären Tabellen. Zuvor schlug dies mit einem TypeError fehl. Pull-Request von Johannes Erdfelt.

    Siehe auch

    SQLite/Oracle haben unterschiedliche Methoden für die Berichterstattung über temporäre Tabellen/Ansichtsnamen - Änderungen bezüglich der Reflexion von temporären Tabellen und Ansichten in SQLite.

    Referenzen: #3203

  • [sqlite] [bug]

    Die Methoden Inspector.get_temp_table_names() und Inspector.get_temp_view_names() wurden hinzugefügt; derzeit unterstützen nur die SQLite- und Oracle-Dialekte diese Methoden. Die Rückgabe von Namen temporärer Tabellen und Ansichten wurde aus der SQLite- und Oracle-Version von Inspector.get_table_names() und Inspector.get_view_names() **entfernt**; andere Datenbank-Backends können diese Informationen nicht unterstützen (wie MySQL), und der Betriebsumfang ist anders, da die Tabellen sitzungsbezogen sein können und typischerweise nicht in Remote-Schemas unterstützt werden.

    Referenzen: #3204

mssql

  • [mssql] [feature]

    "Multivalues Insert" für SQL Server 2008 aktiviert. Pull-Request von Albert Cervin. Die Prüfungen für den "IDENTITY INSERT"-Modus wurden erweitert, um auch Fälle einzuschließen, in denen der Identitätsschlüssel in der VALUEs-Klausel der Anweisung enthalten ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

  • [mssql] [feature]

    SQL Server 2012 empfiehlt nun VARCHAR(max), NVARCHAR(max), VARBINARY(max) für große Text-/Binärtypen. Der MSSQL-Dialekt berücksichtigt dies nun basierend auf der Versionserkennung sowie dem neuen Flag deprecate_large_types.

    Referenzen: #3039

  • [mssql] [changed]

    Das Hostnamen-basierte Verbindungsformat für SQL Server bei Verwendung von pyodbc gibt nun keinen Standard-"Treibername" mehr an, und es wird eine Warnung ausgegeben, wenn dieser fehlt. Der optimale Treibernamen für SQL Server ändert sich häufig und ist plattformabhängig, daher müssen Hostnamen-basierte Verbindungen diesen angeben. DSN-basierte Verbindungen werden bevorzugt.

    Referenzen: #3182

  • [mssql] [bug]

    Die Anweisungskodierung wurde zu den Anweisungen "SET IDENTITY_INSERT" hinzugefügt, die ausgeführt werden, wenn ein expliziter INSERT in eine IDENTITY-Spalte eingefügt wird, um Nicht-ASCII-Tabellenbezeichner auf Treibern wie pyodbc + unix + py2k zu unterstützen, die keine Unicode-Anweisungen unterstützen.

    Diese Änderung wurde auch **zurückportiert** nach: 0.9.7, 0.8.7

  • [mssql] [bug]

    Im SQL Server pyodbc-Dialekt wurde die Implementierung des Dialektparameters description_encoding repariert, die, wenn sie nicht explizit gesetzt war, die Analyse von cursor.description verhinderte, wenn Ergebnismengen Namen in alternativen Kodierungen enthielten. Dieser Parameter sollte zukünftig nicht mehr benötigt werden.

    Diese Änderung wurde auch **zurückportiert** nach: 0.9.7, 0.8.7

    Referenzen: #3091

  • [mssql] [bug]

    Die Erkennung der Versionszeichenfolge im pymssql-Dialekt wurde korrigiert, um mit Microsoft SQL Azure zu funktionieren, das "SQL Server" durch "SQL Azure" ersetzt.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3151

  • [mssql] [bug]

    Die Abfrage zur Ermittlung des aktuellen Standard-Schemanamens wurde überarbeitet, um die Funktion database_principal_id() in Verbindung mit der Sicht sys.database_principals zu verwenden, damit das Standard-Schema unabhängig vom Typ des angemeldeten Benutzers (z. B. SQL Server, Windows usw.) ermittelt werden kann.

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

    Referenzen: #3025

oracle

  • [oracle] [feature]

    Unterstützung für cx_oracle-Verbindungen zu einem bestimmten Servicenamen hinzugefügt, im Gegensatz zu einem TNS-Namen, indem ?service_name=<name> an die URL übergeben wird. Pull-Request von Sławomir Ehlert.

  • [oracle] [feature]

    Neue Oracle DDL-Funktionen für Tabellen, Indizes: COMPRESS, BITMAP. Patch von Gabor Gombas.

  • [oracle] [feature]

    Unterstützung für CTEs unter Oracle hinzugefügt. Dies beinhaltet einige Anpassungen der Alias-Syntax sowie eine neue CTE-Funktion CTE.suffix_with(), die nützlich ist, um spezielle Oracle-spezifische Direktiven an die CTE anzuhängen.

    Referenzen: #3220

  • [oracle] [feature]

    Unterstützung für die Oracle-Tabellenoption ON COMMIT hinzugefügt.

  • [oracle] [bug]

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

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #2138

  • [oracle] [bug] [tests]

    Fehler in der Oracle-Dialekt-Testsuite behoben, bei der in einem Test angenommen wurde, dass 'username' in der Datenbank-URL vorhanden ist, obwohl dies möglicherweise nicht der Fall ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3128

  • [oracle] [bug]

    Ein Alias-Name wird ordnungsgemäß in Anführungszeichen gesetzt, wenn er mit dem Token %(name)s innerhalb der Methode Select.with_hint() referenziert wird. Zuvor hatte das Oracle-Backend diese Anführungszeichen nicht implementiert.

tests

  • [tests] [bug]

    Fehler behoben, bei dem "python setup.py test" nicht ordnungsgemäß auf distutils zugegriffen hat und am Ende der Testsuite Fehler ausgegeben wurden.

    Diese Änderung wird auch zurückportiert zu: 0.9.7

  • [tests] [bug] [py3k]

    Korrektur einiger Deprecation-Warnungen im Zusammenhang mit dem Modul imp und Python 3.3 oder höher beim Ausführen von Tests. Pull-Request von Matt Chisholm.

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

    Referenzen: #2830

misc

  • [feature] [ext]

    Eine neue Erweiterungssuite sqlalchemy.ext.baked wurde hinzugefügt. Dieses einfache, aber ungewöhnliche System ermöglicht eine drastische Einsparung des Python-Overheads für die Konstruktion und Verarbeitung von ORM Query-Objekten, von der Konstruktion der Abfrage bis zur Generierung einer String-SQL-Anweisung.

    Siehe auch

    Baked Queries

    Referenzen: #3054

  • [feature] [ext]

    Die Erweiterung sqlalchemy.ext.automap setzt nun automatisch cascade="all, delete-orphan" für eine One-to-Many-Beziehung/Backref, wenn der Fremdschlüssel erkannt wird, der ein oder mehrere nicht-nullable Spalten enthält. Dieses Argument ist in den an generate_relationship() übergebenen Schlüsselwörtern enthalten und kann immer noch überschrieben werden. Zusätzlich, wenn die ForeignKeyConstraint ondelete="CASCADE" für eine nicht-nullable oder ondelete="SET NULL" für eine nullable Menge von Spalten angibt, wird auch das Argument passive_deletes=True zur Beziehung hinzugefügt. Beachten Sie, dass nicht alle Backends die Reflexion von ondelete unterstützen, aber Backends, die dies tun, umfassen PostgreSQL und MySQL.

    Referenzen: #3210

  • [bug] [declarative]

    Das Wörterbuch __mapper_args__ wird von einer deklarativen Mixin- oder abstrakten Klasse kopiert, wenn darauf zugegriffen wird, sodass Modifikationen, die von der Deklaration selbst an diesem Wörterbuch vorgenommen werden, nicht mit denen anderer Mappings kollidieren. Das Wörterbuch wird in Bezug auf die Argumente version_id_col und polymorphic_on modifiziert und ersetzt die Spalte darin durch die, die offiziell der lokalen Klasse/Tabelle zugeordnet ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3062

  • [bug] [ext]

    Fehler in der Erweitungsfunktion für mutable Typen behoben, bei der MutableDict keine Änderungsereignisse für die Wörterbuchoperation setdefault() meldete.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3051, #3093

  • [bug] [ext]

    Fehler behoben, bei dem MutableDict.setdefault() nicht den vorhandenen oder neuen Wert zurückgab (dieser Fehler wurde in keiner 0.8-Version veröffentlicht). Pull-Request von Thomas Hervé.

    Diese Änderung wird auch zurückportiert zu: 0.9.5, 0.8.7

    Referenzen: #3051, #3093

  • [bug] [ext] [py3k]

    Fehler behoben, bei dem die Assoziationsproxy-Listenklasse Slices unter Py3K nicht korrekt interpretierte. Pull-Request von Gilles Dartiguelongue.

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

  • [bug] [declarative]

    Eine unwahrscheinliche Race Condition, die in einigen exotischen Endbenutzer-Setups beobachtet wurde, wurde behoben. Dabei traf der Versuch, auf doppelte Klassennamen im deklarativen Modus zu prüfen, auf eine nicht vollständig bereinigte schwache Referenz, die sich auf eine andere entfernte Klasse bezog. Die Prüfung stellt nun sicher, dass die schwache Referenz ein Objekt referenziert, bevor sie weiter darauf zugreift.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3208

  • [bug] [ext]

    Fehler behoben, bei dem die Reihenfolge der Elemente in einer Sortierliste während eines Collection-Replace-Ereignisses verloren ging, wenn das Flag `reorder_on_append` auf `True` gesetzt war. Die Korrektur stellt sicher, dass die Sortierliste nur die Liste beeinflusst, die explizit mit dem Objekt verknüpft ist.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3191

  • [bug] [ext]

    Fehler behoben, bei dem MutableDict die Dictionary-Methode update() nicht implementierte und somit Änderungen nicht erfasste. Pull-Request von Matt Chisholm.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

  • [bug] [ext]

    Fehler behoben, bei dem eine benutzerdefinierte Unterklasse von MutableDict bei einer "coerce"-Operation nicht angezeigt wurde und stattdessen ein normales MutableDict zurückgab. Pull-Request von Matt Chisholm.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

  • [bug] [pool]

    Fehler in der Protokollierung des Connection-Pools behoben, bei dem die Debug-Protokollmeldung "connection checked out" nicht ausgegeben wurde, wenn die Protokollierung über logging.setLevel() eingerichtet wurde, anstatt über das Flag echo_pool. Es wurden Tests hinzugefügt, um diese Protokollierung zu bestätigen. Dies ist eine Regression, die in Version 0.9.0 eingeführt wurde.

    Diese Änderung wird auch zurückportiert zu: 0.9.8

    Referenzen: #3168

  • [bug] [declarative]

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

    Diese Änderung wird auch zurückportiert zu: 0.9.7

    Referenzen: #3097

  • [bug] [testsuite]

    In der öffentlichen Testsuite wurde String(40) anstelle von Text, das weniger unterstützt wird, in StringTest.test_literal_backslashes verwendet. Pull-Request von Jan.

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

  • [removed]

    Der Drizzle-Dialekt wurde aus Core entfernt; er ist jetzt als sqlalchemy-drizzle, ein unabhängiger, Drittanbieter-Dialekt, verfügbar. Der Dialekt basiert immer noch fast vollständig auf dem MySQL-Dialekt von SQLAlchemy.