1.3 Changelog

1.3.25

kein Veröffentlichungsdatum

orm

  • [orm] [bug]

    Problem in Session.bulk_save_objects() behoben, wenn es mit persistenten Objekten verwendet wurde, die den Primärschlüssel von Mappings nicht korrekt verfolgen konnten, bei denen der Spaltenname des Primärschlüssels sich vom Attributnamen unterschied.

    Referenzen: #6392

schema

  • [schema] [bug]

    Das Objekt Table löst nun eine aussagekräftige Fehlermeldung aus, wenn es instanziiert wird, ohne mindestens die Argumente Table.name und Table.metadata positionell zu übergeben. Zuvor, wenn diese als Schlüsselwortargumente übergeben wurden, schlug die Objektinitialisierung stillschweigend fehl.

    Referenzen: #6135

postgresql

  • [postgresql] [bug] [regression]

    Behebung einer Regression, die durch #6023 verursacht wurde, bei der der PostgreSQL-Cast-Operator auf Elemente innerhalb eines ARRAY bei Verwendung von psycopg2 fehlschlug, das korrekte Typ in dem Fall zu verwenden, dass der Datentyp auch innerhalb einer Instanz des Variant-Adapters eingebettet war.

    Zusätzlich werden Reparaturen für die Unterstützung des korrekten CREATE TYPE vorgenommen, wenn Variant(ARRAY(some_schema_type)) verwendet wird.

    Referenzen: #6182

mysql

  • [mysql] [bug] [mariadb]

    Korrekturen zur Berücksichtigung der MariaDB 10.6-Serie, einschließlich abwärtskompatibler Änderungen sowohl im mariadb-connector Python-Treiber (nur für SQLAlchemy 1.4 unterstützt) als auch in den nativen 10.6-Clientbibliotheken, die automatisch vom mysqlclient DBAPI verwendet werden (gilt für 1.3 und 1.4). Die Kodierung "utf8mb3" wird von diesen Clientbibliotheken nun gemeldet, wenn die Kodierung als "utf8" angegeben ist, was zu Such- und Kodierungsfehlern im MySQL-Dialekt führt, der dieses Symbol nicht erwartet. Aktualisierungen sowohl der MySQL-Basisbibliothek zur Berücksichtigung dieses gemeldeten utf8mb3-Symbols als auch der Testsuite. Dank an Georg Richter für die Unterstützung.

    Referenzen: #7115, #7136

sqlite

  • [sqlite] [bug]

    Hinweis bezüglich verschlüsselungsbezogener Pragmas für pysqlcipher, die in der URL übergeben werden, hinzugefügt.

    Referenzen: #6589

1.3.24

Veröffentlicht: 30. März 2021

orm

  • [orm] [bug]

    Sehr alte Warnung entfernt, die besagte, dass passive_deletes nicht für viele-zu-eins-Beziehungen vorgesehen ist. Obwohl es wahrscheinlich ist, dass die Platzierung dieses Parameters bei einer viele-zu-eins-Beziehung in vielen Fällen nicht beabsichtigt war, gibt es Anwendungsfälle, in denen der Lösch-Cascade von solchen Beziehungen aus verhindert werden soll.

    Referenzen: #5983

  • [orm] [bug]

    Problem behoben, bei dem der Prozess des Verknüpfens zweier Tabellen fehlschlagen konnte, wenn eine der Tabellen eine nicht verwandte, unauflösliche Fremdschlüsselbeschränkung hatte, die NoReferenceError während des Verknüpfungsprozesses auslöste, was dennoch umgangen werden konnte, um die Verknüpfung abzuschließen. Die Logik, die die Ausnahme auf ihre Bedeutung im Prozess prüfte, traf Annahmen über die Konstruktion, die fehlschlugen.

    Referenzen: #5952

  • [orm] [bug]

    Problem behoben, bei dem die MutableComposite-Konstruktion in einen ungültigen Zustand geraten konnte, wenn das Elternobjekt bereits geladen war und dann durch eine nachfolgende Abfrage überschrieben wurde, da der Refresh-Handler der Composite-Eigenschaften das Objekt durch ein neues ersetzte, das nicht von der mutable-Erweiterung behandelt wurde.

    Referenzen: #6001

engine

  • [engine] [bug]

    Fehler behoben, bei dem die Funktion "schema_translate_map" für den Anwendungsfall der direkten Ausführung von DefaultGenerator-Objekten wie Sequenzen nicht berücksichtigt wurde, einschließlich des Falls, dass sie "pre-executed" wurden, um Primärschlüsselwerte zu generieren, wenn implicit_returning deaktiviert war.

    Referenzen: #5929

schema

  • [schema] [bug]

    Fehler behoben, der zuerst in einer Kombination von #2892, #2919 und #3832 eingeführt wurde, bei dem die Anfügungsereignisse für einen TypeDecorator doppelt gegen die "impl"-Klasse aufgerufen wurden, wenn die "impl" ebenfalls ein SchemaType war. Der reale Fall ist jeder TypeDecorator gegen Enum oder Boolean würde einen doppelten CheckConstraint erhalten, wenn das Flag create_constraint=True gesetzt ist.

    Referenzen: #6152

  • [schema] [bug] [sqlite]

    Fehler behoben, bei dem die von Boolean oder Enum generierte CHECK-Beschränkung die Benennungskonvention nach der ersten Kompilierung nicht korrekt rendern würde, aufgrund einer unbeabsichtigten Zustandsänderung innerhalb des Namens der Beschränkung. Dieses Problem wurde erstmals in 0.9 in der Behebung für Ticket #3067 eingeführt, und die Behebung überarbeitet den damals verfolgten Ansatz, der offenbar mehr Aufwand erforderte, als nötig war.

    Referenzen: #6007

  • [schema] [bug]

    Reparierte / implementierte Unterstützung für Primärschlüssel-Beschränkungsnamenskonventionen, die Spaltennamen/Schlüssel/usw. als Teil der Konvention verwenden. Insbesondere wird das Objekt PrimaryKeyConstraint, das automatisch mit einer Table verknüpft ist, seinen Namen aktualisieren, wenn neue Primärschlüssel- Column-Objekte zur Tabelle und dann zur Beschränkung hinzugefügt werden. Interne Fehler bei der Konstruktion dieser Beschränkung, einschließlich fehlender Spalten, fehlenden Namens oder leerer Namensangaben, werden nun berücksichtigt.

    Referenzen: #5919

  • [schema] [bug]

    Angepasste Logik, die DROP-Anweisungen für Sequence-Objekte beim Löschen mehrerer Tabellen ausgibt, so dass alle Sequence-Objekte nach allen Tabellen gelöscht werden, auch wenn die gegebene Sequence nur mit einem Table-Objekt und nicht direkt mit dem gesamten MetaData-Objekt verknüpft ist. Der Anwendungsfall unterstützt die gleiche Sequence, die gleichzeitig mit mehr als einer Table verknüpft ist.

    Referenzen: #6071

postgresql

  • [postgresql] [bug]

    Problem behoben, bei dem die Verwendung von aggregate_order_by unter bestimmten Bedingungen ARRAY(NullType) zurückgab, was die korrekte Rückgabe von Daten durch das Ergebnisobjekt beeinträchtigte.

    Referenzen: #5989

  • [postgresql] [bug] [reflection]

    Problem bei der PostgreSQL-Reflexion behoben, bei dem eine Spalte, die "NOT NULL" ausdrückt, die Nullbarkeit einer entsprechenden Domäne überschrieb.

    Referenzen: #6161

  • [postgresql] [bug] [types]

    Der psycopg2-Dialekt wurde angepasst, um einen expliziten PostgreSQL-Cast für gebundene Parameter auszugeben, die ARRAY-Elemente enthalten. Dies ermöglicht die korrekte Funktion des gesamten Datentypspektrums innerhalb von Arrays. Der asyncpg-Dialekt generierte diese internen Casts bereits in der endgültigen Anweisung. Dies beinhaltet auch die Unterstützung für Array-Slice-Updates sowie die PostgreSQL-spezifische Methode ARRAY.contains().

    Referenzen: #6023

mssql

  • [mssql] [bug] [reflection]

    Problem bei der SQL Server-Reflexion für ältere SQL Server 2005-Versionen behoben. Ein Aufruf von sp_columns würde ohne das Präfix EXEC nicht korrekt fortgesetzt werden. Diese Methode wird in der aktuellen 1.4-Serie nicht verwendet.

    Referenzen: #5921

1.3.23

Veröffentlicht: 1. Februar 2021

sql

postgresql

  • [postgresql] [bug]

    Nur für SQLAlchemy 1.3 wird pg8000 in setup.py auf eine Version kleiner als 1.16.6 pinned. Version 1.16.6 und höher wird von SQLAlchemy 1.4 unterstützt. Pull-Request von Giuseppe Lumia.

    Referenzen: #5645

  • [postgresql] [bug]

    Problem behoben, bei dem die Verwendung von Table.to_metadata() (in 1.3 Table.tometadata() genannt) in Verbindung mit einer PostgreSQL ExcludeConstraint, die Ad-hoc-Spaltenausdrücke verwendete, nicht korrekt kopiert wurde.

    Referenzen: #5850

mysql

  • [mysql] [usecase]

    Das Casting zu FLOAT wird nun in MySQL >= (8, 0, 17) und MariaDb >= (10, 4, 5) unterstützt.

    Referenzen: #5808

  • [mysql] [bug] [reflection]

    Fehler behoben, bei dem die Standard-Reflexion des MySQL-Servers für numerische Werte mit einem Negationssymbol fehlschlug.

    Referenzen: #5860

  • [mysql] [bug]

    Langjähriger Fehler im MySQL-Dialekt behoben, bei dem die maximale Bezeichnerlänge von 255 für Namen aller Arten von Beschränkungen zu lang war, nicht nur für Indizes, die alle eine Größenbeschränkung von 64 haben. Da Metadaten-Namenskonventionen zu lange Namen in diesem Bereich erzeugen können, wird das Limit auf den Bezeichnergenerator innerhalb des DDL-Kompilierers angewendet.

    Referenzen: #5898

  • [mysql] [bug]

    Deprecations-Warnungen behoben, die infolge der Veröffentlichung von PyMySQL 1.0 aufgetreten waren, einschließlich Deprecations-Warnungen für die Parameter "db" und "passwd", die nun durch "database" und "password" ersetzt wurden.

    Referenzen: #5821

  • [mysql] [bug]

    Behebung einer Regression von SQLAlchemy 1.3.20, die durch die Behebung von #5462 verursacht wurde, welche doppelte Klammern für MySQL-Funktionsausdrücke in Indizes hinzufügt, wie es das Backend erfordert. Dies erstreckte sich unbeabsichtigt auf beliebige text()-Ausdrücke sowie auf Alembics interne Textkomponenten, die von Alembic für beliebige Indexausdrücke benötigt werden, die keine doppelten Klammern implizieren. Die Prüfung wurde auf die direkte Einbeziehung von binären/unären/funktionalen Ausdrücken beschränkt.

    Referenzen: #5800

oracle

  • [oracle] [bug]

    Regression im Oracle-Dialekt, die durch #4894 in SQLAlchemy 1.3.11 eingeführt wurde, behoben, bei der die Verwendung eines SQL-Ausdrucks in RETURNING für ein UPDATE nicht kompiliert wurde, aufgrund einer Prüfung auf "server_default", wenn ein beliebiger SQL-Ausdruck keine Spalte ist.

    Referenzen: #5813

  • [oracle] [bug]

    Fehler im Oracle-Dialekt behoben, bei dem der Abruf einer CLOB/BLOB-Spalte über Insert.returning() fehlschlug, da der LOB-Wert beim Zurückgeben gelesen werden musste; zusätzlich wurde die Unterstützung für den Abruf von Unicode-Werten über RETURNING unter Python 2 repariert.

    Referenzen: #5812

misc

  • [bug] [ext]

    Problem behoben, bei dem die Stringifizierung, die manchmal beim Versuch aufgerufen wird, den "key" für die .c-Sammlung eines wählbaren Elements zu generieren, fehlschlug, wenn die Spalte ein unbeschriftetes benutzerdefiniertes SQL-Konstrukt war, das die sqlalchemy.ext.compiler-Erweiterung verwendete und keine Standardkompilierungsform bot. Während dies ein ungewöhnlicher Fall zu sein scheint, kann er in einigen ORM-Szenarien aufgerufen werden, z. B. wenn der Ausdruck in einem "order by" in Kombination mit joined eager loading verwendet wird. Das Problem ist, dass das Fehlen einer Standard-Compilerfunktion CompileError und nicht UnsupportedCompilationError auslöste.

    Referenzen: #5836

1.3.22

Veröffentlicht: 18. Dezember 2020

oracle

  • [oracle] [bug]

    Regression behoben, die aufgrund von #5755 aufgetreten war, welche die Unterstützung für Isolationsebenen für Oracle implementierte. Es wurde berichtet, dass viele Oracle-Konten tatsächlich keine Berechtigung haben, die Ansicht v$transaction abzufragen, daher wurde diese Funktion so geändert, dass sie beim Verbindungsaufbau mit der Datenbank zurückfällt, wobei der Dialekt "READ COMMITTED" als Standard-Isolationsebene annimmt, wie es vor SQLAlchemy 1.3.21 der Fall war. Die explizite Verwendung der Methode Connection.get_isolation_level() muss nun notwendigerweise eine Ausnahme auslösen, da Oracle-Datenbanken mit dieser Einschränkung dem Benutzer die Lesung der aktuellen Isolationsebene ausdrücklich untersagen.

    Referenzen: #5784

1.3.21

Veröffentlicht: 17. Dezember 2020

orm

  • [orm] [bug]

    Umfassende Prüfung und aussagekräftige Fehlermeldung hinzugefügt für den Fall, dass eine zugeordnete Klasse oder ein zugeordneter Klassenname als String an relationship.secondary übergeben wird. Dies ist ein äußerst häufiger Fehler, der eine klare Meldung verdient.

    Zusätzlich wurde eine neue Regel zur Klassenregistrierungsauflösung hinzugefügt, so dass in Bezug auf den Parameter relationship.secondary, wenn eine zugeordnete Klasse und ihre Tabelle den identischen Stringnamen haben, die Table bei der Auflösung dieses Parameters bevorzugt wird. In allen anderen Fällen wird die Klasse weiterhin bevorzugt, wenn Klasse und Tabelle denselben Namen teilen.

    Referenzen: #5774

  • [orm] [bug]

    Fehler in Query.update() behoben, bei dem Objekte in der _ormsession.Session, die bereits abgelaufen waren, unnötigerweise einzeln ausgewählt wurden, wenn sie durch die "evaluate" synchronisierungsstrategie aufgefrischt wurden.

    Referenzen: #5664

  • [orm] [bug]

    Problem mit der Option restore_load_context von ORM-Events wie InstanceEvents.load() behoben, sodass das Flag nicht an Unterklassen weitergegeben wurde, die nach der ersten Einrichtung des Event-Handlers zugeordnet wurden.

    Referenzen: #5737

sql

  • [sql] [bug]

    Eine Warnung wird ausgegeben, wenn eine returning()-Methode wie Insert.returning() mehrmals aufgerufen wird, da dies noch keine additive Operation unterstützt. Version 1.4 wird dies unterstützen. Außerdem löst jede Kombination der Methoden Insert.returning() und ValuesBase.return_defaults() nun einen Fehler aus, da diese Methoden sich gegenseitig ausschließen; zuvor schlug die Operation stillschweigend fehl.

    Referenzen: #5691

  • [sql] [bug]

    Strukturelles Compiler-Problem behoben, bei dem einige Konstrukte wie MySQL / PostgreSQL "on conflict / on duplicate key" vom Zustand des Compiler-Objekts abhingen, das gegen ihre Anweisung als oberste Anweisung fixiert war, was in Fällen fehlschlug, in denen diese Anweisungen aus einem anderen Kontext verzweigt wurden, wie z. B. einer DDL-Konstruktion, die mit einer SQL-Anweisung verknüpft war.

    Referenzen: #5656

postgresql

  • [postgresql] [usecase]

    Neuer Parameter ExcludeConstraint.ops zum Objekt ExcludeConstraint hinzugefügt, zur Unterstützung der Operator-Klassen-Spezifikation mit dieser Einschränkung. Pull-Request von Alon Menczer.

    Referenzen: #5604

  • [postgresql] [bug] [mysql]

    Regression in Version 1.3.2 für das PostgreSQL-Dialekt behoben, die auch in Version 1.3.18 auf das MySQL-Dialekt kopiert wurde. Zuvor schlug die Verwendung eines Nicht-Table-Konstrukts wie text() als Argument für Select.with_for_update.of fehl, um korrekt in den PostgreSQL- oder MySQL-Compilern verarbeitet zu werden.

    Referenzen: #5729

mysql

  • [mysql] [bug] [reflection]

    Problem behoben, bei dem die Spiegelung eines Server-Defaults auf MariaDB mit einem Dezimalpunkt im Wert fehlschlug, was zu einer gespiegelten Tabelle ohne Server-Default führte.

    Referenzen: #5744

  • [mysql] [sql]

    Fehlende Schlüsselwörter zur Liste RESERVED_WORDS für das MySQL-Dialekt hinzugefügt: action, level, mode, status, text, time. Pull-Request von Oscar Batori.

    Referenzen: #5696

sqlite

  • [sqlite] [usecase]

    Dialekt-Schlüsselwort sqlite_with_rowid=False hinzugefügt, um Tabellen als CREATE TABLE WITHOUT ROWID erstellen zu können. Patch von Sean Anderson.

    Referenzen: #5685

mssql

  • [mssql] [bug]

    Fehler behoben, bei dem eine CREATE INDEX-Anweisung falsch gerendert wurde, wenn sowohl mssql-include als auch mssql_where angegeben wurden. Pull-Request von @Adiorz.

    Referenzen: #5751

  • [mssql] [bug]

    SQL Server-Code "01000" zur Liste der Trennungscodes hinzugefügt.

    Referenzen: #5646

  • [mssql] [reflection] [sqlite]

    Problem behoben, bei dem zusammengesetzte Primärschlüsselspalten nicht in der richtigen Reihenfolge gemeldet wurden. Patch von @fulpm.

    Referenzen: #5661

oracle

1.3.20

Veröffentlicht: 12. Oktober 2020

orm

  • [orm] [bug]

    Ein ArgumentError mit mehr Details wird nun ausgelöst, wenn der Zielparameter für Query.join() auf ein nicht zugeordnetes Objekt gesetzt ist. Vor dieser Änderung wurde ein weniger detaillierter AttributeError ausgelöst. Pull-Request von Ramon Williams.

    Referenzen: #4428

  • [orm] [bug]

    Problem behoben, bei dem die Verwendung einer Ladeoption gegen einen Zeichenkettenattributnamen, der nicht tatsächlich ein zugeordnetes Attribut ist, wie z. B. ein reiner Python-Deskriptor, einen nicht informativen AttributeError auslöste; jetzt wird eine aussagekräftige Fehlermeldung ausgegeben.

    Referenzen: #4589

engine

  • [engine] [bug]

    Problem behoben, bei dem ein nicht-Zeichenketten-Objekt, das an SQLAlchemyError oder eine Unterklasse gesendet wurde, wie es bei einigen Drittanbieter-Dialekten vorkommt, nicht korrekt in eine Zeichenkette umgewandelt werden konnte. Pull-Request von Andrzej Bartosiński.

    Referenzen: #5599

  • [engine] [bug]

    Ein Funktionsimport, der das standardmäßige späte Importsystem von SQLAlchemy im Modul sqlalchemy.exc nicht verwendete, wurde repariert.

    Referenzen: #5632

sql

  • [sql] [bug]

    Problem behoben, bei dem die pickle.dumps() Operation gegen die Over-Konstruktion zu einem Rekursionsfehler führte.

    Referenzen: #5644

  • [sql] [bug]

    Problem behoben, bei dem kein Fehler ausgelöst wurde, wenn eine column() zu mehr als einer table() gleichzeitig hinzugefügt wurde. Dies wurde für die Objekte Column und Table korrekt gemeldet. Wenn dies auftritt, wird jetzt ein ArgumentError ausgelöst.

    Referenzen: #5618

postgresql

  • [postgresql] [usecase]

    Das psycopg2-Dialekt unterstützt nun Mehrfachverbindungen zu PostgreSQL-Hosts, indem Host-/Port-Kombinationen an die Abfragezeichenkette übergeben werden. Pull-Request von Ramon Williams.

    Referenzen: #4392

  • [postgresql] [bug]

    Die Methoden Comparator.any() und Comparator.all() wurden angepasst, um eine direkte "NOT"-Operation zur Negation zu implementieren, anstatt den Vergleichsoperator zu negieren.

    Referenzen: #5518

  • [postgresql] [bug]

    Problem behoben, bei dem der Typ ENUM die Schematranslationszuordnung nicht konsultierte, wenn CREATE TYPE oder DROP TYPE ausgegeben wurde, um zu prüfen, ob der Typ existiert oder nicht. Zusätzlich wurde ein Problem behoben, bei dem, wenn dasselbe Enum mehrmals in einer einzigen DDL-Sequenz auftrat, die "Prüfungs"-Abfrage wiederholt ausgeführt wurde, anstatt sich auf einen gecachten Wert zu verlassen.

    Referenzen: #5520

mysql

  • [mysql] [usecase]

    Das MySQL-Dialekt wurde angepasst, um funktionale Indexausdrücke korrekt zu klammern, wie sie von MySQL 8 akzeptiert werden. Pull-Request von Ramon Williams.

    Referenzen: #5462

  • [mysql] [change]

    Neue MySQL-reservierte Wörter hinzugefügt: cube, lateral, die in MySQL 8.0.1 bzw. 8.0.14 hinzugefügt wurden; dies bedeutet, dass diese Begriffe zitiert werden, wenn sie als Tabellen- oder Spaltenbezeichner verwendet werden.

    Referenzen: #5539

  • [mysql] [bug]

    Das Schlüsselwort "skip_locked", das mit with_for_update() verwendet wird, gibt eine Warnung aus, wenn es auf MariaDB-Backends verwendet wird, und wird dann ignoriert. Dies ist ein veraltetes Verhalten, das in SQLAlchemy 1.4 zu einem Fehler führt, da eine Anwendung, die "skip locked" anfordert, eine nicht-blockierende Operation sucht, die auf diesen Backends nicht verfügbar ist.

    Referenzen: #5568

  • [mysql] [bug]

    Problem behoben, bei dem eine UPDATE-Anweisung für einen JOIN im MySQL-Multi-Table-Format die Tabellenpräfix für die Zieltabelle nicht enthielt, wenn die Anweisung keine WHERE-Klausel hatte, da nur die WHERE-Klausel gescannt wurde, um zu diesem Zeitpunkt einen "Multi-Table-Update" zu erkennen. Das Ziel wird nun auch gescannt, wenn es sich um einen JOIN handelt, um die linkeste Tabelle als Haupttabelle und die zusätzlichen Einträge als zusätzliche FROM-Einträge zu erhalten.

    Referenzen: #5617

mssql

  • [mssql] [bug]

    Problem behoben, bei dem eine SQLAlchemy-Verbindungs-URI für Azure DW mit authentication=ActiveDirectoryIntegrated (und ohne Benutzername/Passwort) die ODBC-Verbindungszeichenkette nicht so konstruierte, dass sie vom Azure DW-Instanz akzeptiert wurde.

    Referenzen: #5592

tests

  • [tests] [bug]

    Inkompatibilitäten in der Testsuite bei der Ausführung mit Pytest 6.x behoben.

    Referenzen: #5635

misc

  • [bug] [pool]

    Problem behoben, bei dem die folgenden Pool-Parameter nicht an den neuen Pool übergeben wurden, der beim Aufruf von Engine.dispose() erstellt wurde: pre_ping, use_lifo. Zusätzlich werden die Parameter recycle und reset_on_return nun für die Klasse AssertionPool weitergegeben.

    Referenzen: #5582

  • [bug] [associationproxy] [ext]

    Eine aussagekräftige Fehlermeldung wird nun ausgegeben, wenn versucht wird, ein Assoziations-Proxy-Element als einfache Spaltenexpression zu verwenden, die ausgewählt oder in einer SQL-Funktion verwendet werden soll; dieser Anwendungsfall wird derzeit nicht unterstützt.

    Referenzen: #5541, #5542

1.3.19

Veröffentlicht: 17. August 2020

orm

  • [orm] [usecase]

    Das Verhalten des Zugriffs Mapper.all_orm_descriptors() wurde angepasst, um die Attribute in der Reihenfolge darzustellen, in der sie deterministisch angeordnet sind, unter der Annahme der Verwendung von Python 3.6 oder höher, das die Sortierreihenfolge von Klassenattributen basierend auf ihrer Deklaration beibehält. Diese Sortierung ist jedoch nicht garantiert, dass sie in allen Fällen der deklarierten Reihenfolge der Attribute entspricht; siehe die Methodendokumentation für das genaue Schema.

    Referenzen: #5494

orm declarative

  • [orm] [declarative] [usecase]

    Der Name der virtuellen Spalte, die bei der Verwendung der Klassen AbstractConcreteBase und ConcreteBase verwendet wird, kann nun angepasst werden, um Modelle zu ermöglichen, die eine Spalte mit dem Namen type haben. Pull-Request von Jesse-Bakker.

    Referenzen: #5513

sql

  • [sql] [bug]

    Ein Problem wurde behoben, bei dem die Klausel "ORDER BY", die einen Labelnamen anstelle eines vollständigen Ausdrucks rendert, was besonders für SQL Server wichtig ist, in einigen Fällen nicht funktionierte, wenn der Ausdruck in einer geklammerten Gruppierung eingeschlossen war. Dieser Fall wurde in die Testunterstützung aufgenommen. Die Änderung passt zusätzlich das Verhalten der ORM-Abfrage "automatisch ORDER BY-Spalten hinzufügen, wenn DISTINCT vorhanden ist", das in 1.4 veraltet ist, an, um Spaltenausdrücke, die bereits vorhanden sind, genauer zu erkennen.

    Referenzen: #5470

  • [sql] [bug] [datatypes]

    Die Fehlermeldung LookupError liefert dem Benutzer nun bis zu vier mögliche Werte, auf die eine Spalte über Enum beschränkt ist. Werte, die länger als 11 Zeichen sind, werden abgeschnitten und durch Ellipsen ersetzt. Pull-Request von Ramon Williams.

    Referenzen: #4733

  • [sql] [bug]

    Problem behoben, bei dem die Funktion Connection.execution_options.schema_translate_map nicht wirkte, wenn die Funktion Sequence.next_value() für eine Sequence im Parameter Column.server_default verwendet und die CREATE TABLE DDL ausgegeben wurde.

    Referenzen: #5500

postgresql

  • [postgresql] [bug]

    Problem behoben, bei dem der Rückgabetyp für die verschiedenen RANGE-Vergleichsoperatoren selbst der gleiche RANGE-Typ war und nicht BOOLEAN, was zu einem unerwünschten Ergebnis führte, wenn ein TypeDecorator, der ergebnisverarbeitendes Verhalten definierte, verwendet wurde. Pull-Request von Jim Bosch.

    Referenzen: #5476

mysql

  • [mysql] [usecase]

    Das MySQL-Dialekt rendert FROM DUAL für eine SELECT-Anweisung, die keine FROM-Klausel hat, aber eine WHERE-Klausel. Dies ermöglicht die Verwendung von Abfragen wie "SELECT 1 WHERE EXISTS (subquery)" sowie anderer Anwendungsfälle.

    Referenzen: #5481

  • [mysql] [bug]

    Problem behoben, bei dem CREATE TABLE-Anweisungen das COLLATE-Schlüsselwort nicht korrekt angaben.

    Referenzen: #5411

  • [mysql] [bug]

    MariaDB-Code 1927 wurde zu den "Disconnect"-Codes hinzugefügt, da neuere MariaDB-Versionen anscheinend diesen Code verwenden, wenn der Datenbankserver gestoppt wurde.

    Referenzen: #5493

sqlite

  • [sqlite] [bug] [mssql] [reflection]

    Eine Überprüfung aller enthaltenen Dialekte wurde durchgeführt, um sicherzustellen, dass Namen, die einfache oder doppelte Anführungszeichen enthalten, beim Abfragen von Systemtabellen ordnungsgemäß escaped werden, für alle Inspector-Methoden, die Objektnamen als Argument akzeptieren (z. B. Tabellennamen, View-Namen usw.). SQLite und MSSQL enthielten zwei Quoting-Probleme, die behoben wurden.

    Referenzen: #5456

mssql

  • [mssql] [bug] [sql]

    Problem behoben, bei dem das mssql-Dialekt Objekt명을, die das Zeichen ']' enthielten, falsch escaped hat.

    Referenzen: #5467

misc

  • [usecase] [py3k]

    Ein Argument **kw wurde der Methode DeclarativeMeta.__init__() hinzugefügt. Dies ermöglicht einer Klasse die Unterstützung des PEP 487 Metaklassen-Hooks __init_subclass__. Pull-Request von Ewen Gillies.

    Referenzen: ##5357

1.3.18

Veröffentlicht: 25. Juni 2020

orm

examples

  • [examples] [change]

    Neue Option --raw zur Performance-Suite der Beispiele hinzugefügt, die das rohe Profil-Testergebnis für die Verwendung durch beliebige Profiling-Visualisierungswerkzeuge ausgibt. Die Option "runsnake" wurde entfernt, da runsnake derzeit schwer zu erstellen ist.

engine

  • [engine] [bug]

    Weitere Verfeinerungen der Korrekturen für den "reset"-Agenten, der in #5326 behoben wurde, der nun eine Warnung ausgibt, wenn er nicht korrekt aufgerufen wird, und das Verhalten korrigiert. Zusätzliche Szenarien, in denen diese Warnung ausgegeben wurde, wurden identifiziert und behoben.

    Referenzen: #5326

  • [engine] [bug]

    Problem mit dem Objekt URL behoben, bei dem die Stringifizierung des Objekts spezielle Zeichen nicht URL-codierte, was verhinderte, dass die URL wieder als echte URL konsumiert werden konnte. Pull-Request von Miguel Grinberg.

    Referenzen: #5341

sql

  • [sql] [usecase]

    Der Konstruktion table() wurde ein Parameter ".schema" hinzugefügt, der es Ad-hoc-Tabellenausdrücken ermöglicht, auch einen Schemanamen zu enthalten. Pull-Request von Dylan Modesitt.

    Referenzen: #5309

  • [sql] [change] [sybase]

    Unterstützung für .offset für das Sybase-Dialekt hinzugefügt. Pull-Request von Alan D. Snow.

    Referenzen: #5294

  • [sql] [bug]

    Selbstgruppierung in Elementen von type_coerce korrekt angewendet.

    Das type_coerce-Element wendete keine Gruppierungsregeln korrekt an, wenn es in einem Ausdruck verwendet wurde.

    Referenzen: #5344

  • [sql] [bug]

    Die Ausgabe von Select.with_hint() wurde in die generische SQL-Zeichenkette aufgenommen, die beim Aufruf von str() auf eine Anweisung erzeugt wird. Zuvor wurde diese Klausel unter der Annahme, dass sie dialektspezifisch ist, weggelassen. Der Hinweistext wird in Klammern angezeigt, um anzuzeigen, dass die Wiedergabe solcher Hinweise je nach Backend variiert.

    Referenzen: #5353

  • [sql] [schema]

    Einführung von IdentityOptions zum Speichern gemeinsamer Parameter für Sequenzen und Identitätsspalten.

    Referenzen: #5324

schema

  • [schema] [bug]

    Problem behoben, bei dem dialect_options weggelassen wurden, wenn ein Datenbankobjekt (z. B. Table) mit tometadata() kopiert wurde.

    Referenzen: #5276

mysql

  • [mysql] [usecase]

    Unterstützung für Zeilen-Level-Locking für MySQL implementiert. Pull-Request von Quentin Somerville.

    Referenzen: #4860

sqlite

  • [sqlite] [usecase]

    SQLite 3.31 fügte Unterstützung für berechnete Spalten hinzu. Diese Änderung ermöglicht deren Unterstützung in SQLAlchemy bei der Ausrichtung auf SQLite.

    Referenzen: #5297

  • [sqlite] [bug]

    „exists“ wurde der Liste der reservierten Wörter für SQLite hinzugefügt, damit dieses Wort bei Verwendung als Bezeichnung oder Spaltenname maskiert wird. Pull Request von Thodoris Sotiropoulos.

    Referenzen: #5395

mssql

  • [mssql] [change]

    Die Anforderung supports_sane_rowcount_returning = False wurde von der Ebene PyODBCConnector zur Ebene MSDialect_pyodbc verschoben, da pyodbc unter bestimmten Umständen korrekt funktioniert.

    Referenzen: #5321

  • [mssql] [bug]

    Die Logik, die vom SQL Server-Dialekt verwendet wird, um mehrteilige Schemanamen mit vielen Punkten zu interpretieren, wurde verfeinert, sodass keine Punkte verloren gehen, wenn der Name keine Klammern oder Maskierung verwendet. Außerdem wird ein „dbname“-Token unterstützt, das viele Teile enthält und mehrere, unabhängig maskierte Abschnitte haben kann.

    Referenzen: #5364, #5366

  • [mssql] [bug] [pyodbc]

    Ein Problem im pyodbc-Konnektor wurde behoben, bei dem eine Warnung bezüglich des pyodbc „drivername“ ausgegeben wurde, wenn eine vollständig leere URL verwendet wurde. Leere URLs sind normal, wenn ein nicht verbundener Dialektobjekt erzeugt wird oder wenn das Argument „creator“ von create_engine() verwendet wird. Die Warnung wird nun nur ausgegeben, wenn der Treibername fehlt, aber andere Parameter noch vorhanden sind.

    Referenzen: #5346

  • [mssql] [bug]

    Problem bei der Zusammenstellung der ODBC-Verbindungszeichenfolge für den pyodbc DBAPI behoben. Tokens, die Semikolons und/oder geschweifte Klammern „{}“ enthielten, wurden nicht korrekt maskiert, was dazu führte, dass der ODBC-Treiber die Verbindungszeichenfolgenattribute falsch interpretierte.

    Referenzen: #5373

  • [mssql] [bug]

    Problem behoben, bei dem datetime.time-Parameter in datetime.datetime konvertiert wurden, was sie für Vergleiche wie >= gegen eine tatsächliche TIME-Spalte inkompatibel machte.

    Referenzen: #5339

  • [mssql] [bug]

    Ein Problem wurde behoben, bei dem die Funktion is_disconnect im SQL Server pyodbc-Dialekt den Trennungsstatus falsch meldete, wenn die Fehlermeldung eine Teilzeichenfolge enthielt, die einem SQL Server ODBC-Fehlercode entsprach.

    Referenzen: #5359

oracle

  • [oracle] [bug] [reflection]

    Fehler im Oracle-Dialekt behoben, bei dem Indizes, die die vollständige Menge der Primärschlüsselspalten enthielten, fälschlicherweise als der Primärschlüsselindex selbst angesehen wurden, der auch dann ausgelassen wurde, wenn es mehrere gab. Die Prüfung wurde verfeinert, um den Namen der Primärschlüsselbeschränkung mit dem Indexnamen selbst zu vergleichen, anstatt zu versuchen, basierend auf den im Index vorhandenen Spalten zu raten.

    Referenzen: #5421

1.3.17

Veröffentlicht: 13. Mai 2020

orm

  • [orm] [usecase]

    Ein Zugriffselement Comparator.expressions wurde hinzugefügt, das Zugriff auf die Gruppe von Spalten bietet, die unter einem mehrspaltigen ColumnProperty-Attribut zugeordnet sind.

    Referenzen: #5262

  • [orm] [usecase]

    Einführung des Flags relationship.sync_backref in einer Beziehung, um zu steuern, ob die Synchronisierungsereignisse, die die In-Python-Attribute verändern, hinzugefügt werden. Dies ersetzt die vorherige Änderung #5149, die davor warnte, dass das Ziel einer viewonly=True-Beziehung einer back_populates- oder backref-Konfiguration nicht zulässig sein würde.

    Referenzen: #5237

  • [orm] [bug]

    Fehler behoben, bei dem die Verwendung von with_polymorphic() als Ziel eines Joins über RelationshipComparator.of_type() auf einem Mapper, der bereits eine Subquery-basierte with_polymorphic-Einstellung hat, die mit der angeforderten äquivalent ist, die ON-Klausel im Join nicht korrekt aliasen würde.

    Referenzen: #5288

  • [orm] [bug]

    Problem im Bereich, wo Ladeoptionen wie selectinload() mit dem „baked query“-System interagieren, wurde behoben, sodass das Caching einer Abfrage nicht erfolgen soll, wenn die Ladeoptionen selbst Elemente wie with_polymorphic()-Objekte enthalten, die derzeit nicht cache-kompatibel sind. Der „baked loader“ konnte sich in einigen dieser Szenarien manchmal nicht vollständig selbst invalidieren, was zu fehlenden eager loads führte.

    Referenzen: #5303

  • [orm] [bug]

    Die interne Implementierung des „identity set“, eines Sets, das Objekte auf Basis ihrer id() anstatt ihrer Hash-Werte hasht, wurde so modifiziert, dass die Methode __hash__() der Objekte, die typischerweise benutzerdefinierte abgebildete Objekte sind, nicht mehr aufgerufen wird. Einige Methoden riefen diese Methode als Nebeneffekt der Implementierung auf.

    Referenzen: #5304

  • [orm] [bug]

    Eine informative Fehlermeldung wird ausgegeben, wenn ein ORM Many-to-One-Vergleich gegen ein Objekt versucht wird, das keine tatsächliche abgebildete Instanz ist. Vergleiche wie die mit Scalar-Subqueries werden nicht unterstützt; ein verallgemeinerter Vergleich mit Subqueries wird besser mit Comparator.has() erreicht.

    Referenzen: #5269

engine

  • [engine] [bug]

    Ein kritischer Fehler wurde behoben, bei dem die DBAPI-Verbindung noch im nicht zurückgerollten Zustand an den Connection-Pool zurückgegeben werden konnte. Der für die Rückrollung der Verbindung verantwortliche Reset-Agent konnte beschädigt werden, wenn die Transaktion „geschlossen“ wurde, ohne zurückgerollt oder committet zu werden. Dies kann in einigen Szenarien bei der Verwendung von ORM-Sessions und beim Aufrufen von .close() in einem bestimmten Muster, das Savepoints beinhaltet, auftreten. Die Korrektur stellt sicher, dass der Reset-Agent immer aktiv ist.

    Referenzen: #5326

schema

  • [schema] [bug]

    Problem behoben, bei dem ein Index, dessen Zuordnung zu einer Tabelle verzögert wurde, z. B. wenn er eine Column enthielt, die noch keiner Table zugeordnet war, nicht korrekt angehängt werden konnte, wenn er außerdem einen nicht tabellenorientierten Ausdruck enthielt.

    Referenzen: #5298

  • [schema] [bug]

    Eine Warnung wird ausgegeben, wenn das Attribut MetaData.sorted_tables sowie die Funktion sort_tables() verwendet werden und die gegebenen Tabellen aufgrund einer zyklischen Abhängigkeit zwischen Fremdschlüsselbeschränkungen nicht korrekt sortiert werden können. In diesem Fall werden die beteiligten Tabellen nicht mehr nach Fremdschlüssel sortiert und eine Warnung wird ausgegeben. Andere Tabellen, die nicht Teil des Zyklus sind, werden weiterhin in Abhängigkeitsreihenfolge zurückgegeben. Zuvor gab die Routine sorted_table eine Sammlung zurück, die alle Fremdschlüssel bedingungslos wegließ, wenn ein Zyklus erkannt wurde, und keine Warnung ausgab.

    Referenzen: #5316

  • [schema]

    Das Attribut comment wurde zur __repr__-Methode der Column hinzugefügt.

    Referenzen: #4138

postgresql

  • [postgresql] [usecase]

    Unterstützung für Spalten oder Typen ARRAY von Enum, JSON oder JSONB in PostgreSQL hinzugefügt. Zuvor war in diesen Anwendungsfällen eine Umgehung erforderlich.

    Referenzen: #5265

  • [postgresql] [usecase]

    Eine explizite CompileError wird ausgelöst, wenn eine Tabelle mit einer Spalte vom Typ ARRAY von Enum hinzugefügt wird, die mit Enum.native_enum auf False konfiguriert ist, wenn Enum.create_constraint nicht auf False gesetzt ist.

    Referenzen: #5266

mssql

  • [mssql] [bug] [reflection]

    Eine Regression, die durch die Spiegelung von berechneten Spalten in MSSQL bei Verwendung der Legacy-TDS-Version 4.2 eingeführt wurde, wurde behoben. Der Dialekt versucht, die Protokollversion bei der ersten Verbindung zu erkennen und im Kompatibilitätsmodus zu arbeiten, wenn er sie nicht erkennen kann.

    Referenzen: #5255

  • [mssql] [bug] [reflection]

    Eine Regression, die durch die Spiegelung von berechneten Spalten in MSSQL bei Verwendung von SQL Server-Versionen vor 2012 eingeführt wurde, wurde behoben, da diese die Funktion concat nicht unterstützen.

    Referenzen: #5271

oracle

  • [oracle] [bug]

    Einige Änderungen daran, wie der cx_oracle-Dialekt per-Spalten-Ausgabetyp-Handler für LOB und numerische Datentypen einrichtet, um potenzielle Änderungen in cx_Oracle 8 zu berücksichtigen.

    Referenzen: #5246

  • [oracle] [bug] [performance]

    Die Implementierung des Abrufens von CLOB- und BLOB-Objekten wurde geändert, um die native Implementierung von cx_Oracle zu verwenden, die CLOB/BLOB-Objekte inline mit anderen Ergebnisspalten abruft, anstatt einen separaten Abruf durchzuführen. Wie immer kann dies durch Setzen von auto_convert_lobs auf False deaktiviert werden.

    Als Teil dieser Änderung gibt das Verhalten eines CLOBs, dem beim INSERT ein leerer String zugewiesen wurde, beim SELECT nun None zurück, was nun mit VARCHAR in Oracle konsistent ist.

    Referenzen: #5314

misc

  • [change] [firebird]

    Die Dialektladung für firebird://-URIs wurde angepasst, sodass der externe sqlalchemy-firebird-Dialekt verwendet wird, falls er installiert ist, andernfalls wird auf den (jetzt veralteten) internen Firebird-Dialekt zurückgegriffen.

    Referenzen: #5278

1.3.16

Veröffentlicht: 7. April 2020

orm

  • [orm] [performance]

    Die von subqueryload und selectinload verwendeten Abfragen wurden so geändert, dass sie nicht mehr nach dem Primärschlüssel der übergeordneten Entität sortiert werden. Diese Sortierung diente dazu, die eingehenden Zeilen direkt mit einem minimalen Maß an Python-seitiger Sortierung in Listen zu kopieren. Diese ORDER BY-Klauseln können jedoch die Leistung der Abfrage negativ beeinflussen, da in vielen Szenarien diese Spalten aus einer Subquery abgeleitet sind oder anderweitig keine tatsächlichen Primärschlüsselspalten sind, sodass SQL-Planer Indizes nicht nutzen können. Die Python-seitige Sortierung verwendet das native itertools.group_by() zum Sortieren der eingehenden Zeilen und wurde so modifiziert, dass mehrere Zeilengruppen pro Elternteil mit list.extend() zusammengefügt werden können, was immer noch eine relativ schnelle Python-seitige Leistung ermöglicht. Es wird immer noch eine ORDER BY für eine Beziehung vorhanden sein, die einen expliziten order_by-Parameter enthält, dies ist jedoch die einzige ORDER BY, die für beide Ladetypen zur Abfrage hinzugefügt wird.

    Referenzen: #5162

  • [orm] [bug]

    Fehler in der Ladeoption selectinload() behoben, bei der zwei oder mehr Lader, die unterschiedliche Beziehungen mit demselben String-Schlüsselnamen repräsentieren, wie von einer einzelnen with_polymorphic()-Konstruktion mit mehreren Unterklassen-Mappern referenziert werden, dazu neigten, jede Subquery-Ladung separat aufzurufen, anstatt einen einzelnen String-basierten Slot zu verwenden, der die anderen Lader daran hinderte, aufgerufen zu werden.

    Referenzen: #5228

  • [orm] [bug]

    Problem behoben, bei dem ein Lazyload, der sessionslokales „get“ gegen eine Ziel-Many-to-One-Beziehung verwendet, bei der ein Objekt mit dem richtigen Primärschlüssel vorhanden ist, aber eine Instanz einer Geschwisterklasse ist, nicht korrekt None zurückgibt, wie es der Fall ist, wenn der Lazy-Lader tatsächlich eine Ladung für diese Zeile ausgibt.

    Referenzen: #5210

orm declarative

  • [orm] [declarative] [bug]

    Das String-Argument, das als erstes positionelles Argument von der Funktion relationship() bei Verwendung der Declarative API akzeptiert wird, wird nicht mehr mithilfe der Python-Funktion eval() interpretiert; stattdessen wird der Name punktgetrennt und die Namen werden direkt im Namensauflösungsdictionary nachgeschlagen, ohne den Wert als Python-Ausdruck zu behandeln. Das Übergeben eines String-Arguments an die anderen relationship()-Parameter, die zwingend Python-Ausdrücke akzeptieren müssen, verwendet weiterhin eval(); die Dokumentation wurde klargestellt, um sicherzustellen, dass keine Mehrdeutigkeit besteht, dass dies verwendet wird.

    Siehe auch

    Auswertung von Beziehungsargumenten – Details zur String-Auswertung

    Referenzen: #5238

sql

  • [sql] [types]

    Möglichkeit hinzugefügt, DateTime, Date oder Time für Debugging-Zwecke unter Verwendung des String-Dialekts zu literal kompilieren. Diese Änderung hat keine Auswirkungen auf reale Dialekt-Implementierungen, die ihr aktuelles Verhalten beibehalten.

    Referenzen: #5052

schema

  • [schema] [reflection]

    Unterstützung für die Spiegelung von „berechneten“ Spalten hinzugefügt, die nun als Teil der von Inspector.get_columns() zurückgegebenen Struktur zurückgegeben werden. Bei der Spiegelung vollständiger Table-Objekte werden berechnete Spalten mithilfe der Computed-Konstruktion dargestellt.

    Referenzen: #5063

postgresql

  • [postgresql] [bug]

    Problem behoben, bei dem ein „covering“ Index (z. B. mit INCLUDE-Klausel) so gespiegelt wurde, dass alle Spalten in der INCLUDE-Klausel als reguläre Spalten enthalten waren. Eine Warnung wird nun ausgegeben, wenn diese zusätzlichen Spalten erkannt werden, die darauf hinweisen, dass sie derzeit ignoriert werden. Beachten Sie, dass die vollständige Unterstützung für „covering“ Indizes Teil von #4458 ist. Pull Request von Marat Sharafutdinov.

    Referenzen: #5205

mysql

  • [mysql] [bug]

    Problem im MySQL-Dialekt behoben: Beim Verbinden mit einer Pseudo-MySQL-Datenbank wie der von ProxySQL bereitgestellten, verhindert die anfängliche Überprüfung des Isolationslevels, wenn sie keine Zeile zurückgibt, nicht, dass der Dialekt die Verbindung fortsetzt. Eine Warnung wird ausgegeben, dass das Isolationslevel nicht ermittelt werden konnte.

    Referenzen: #5239

sqlite

  • [sqlite] [usecase]

    AUTOCOMMIT-Isolationslevel für SQLite bei Verwendung von pysqlite implementiert.

    Referenzen: #5164

mssql

oracle

  • [oracle] [usecase]

    AUTOCOMMIT-Isolationslevel für Oracle bei Verwendung von cx_Oracle implementiert. Ebenfalls wurde ein fester Standard-Isolationslevel von READ COMMITTED für Oracle hinzugefügt.

    Referenzen: #5200

  • [oracle] [bug] [reflection]

    Regression / falsche Korrektur, die durch die Korrektur für #5146 verursacht wurde, wurde behoben, bei der der Oracle-Dialekt aus der Sicht „all_tab_comments“ liest, um Tabellenkommentare zu erhalten, aber nicht berücksichtigt, dass der aktuelle Besitzer der angeforderten Tabelle fehlt, was dazu führt, dass der falsche Kommentar gelesen wird, wenn mehrere Tabellen mit demselben Namen in mehreren Schemata existieren.

    Referenzen: #5146

tests

  • [tests] [bug]

    Ein Problem wurde behoben, das die Ausführung der Testsuite mit dem kürzlich veröffentlichten py.test 5.4.0 verhinderte.

    Referenzen: #5201

misc

  • [enum] [types]

    Der Enum-Typ unterstützt nun den Parameter Enum.length, um die Länge der VARCHAR-Spalte anzugeben, die beim Verwenden von nicht-nativen Enums durch Setzen von Enum.native_enum auf False erstellt wird.

    Referenzen: #5183

  • [installer]

    Sichergestellt, dass die Datei „pyproject.toml“ nicht in Builds enthalten ist, da die Anwesenheit dieser Datei pip anweist, einen PEP-517-Installationsprozess zu verwenden. Da dieser Betriebsmodus von aktuellen Tools/Distributionen anscheinend nicht gut unterstützt wird, werden diese Probleme im Rahmen der SQLAlchemy-Installation durch Weglassen der Datei vermieden.

    Referenzen: #5207

1.3.15

Veröffentlicht: 11. März 2020

orm

  • [orm] [bug]

    Die Fehlermeldung, die von Query.join() ausgegeben wird, wenn eine linke Seite nicht gefunden werden kann, wurde angepasst, sodass die Methode Query.select_from() der beste Weg ist, das Problem zu lösen. Außerdem wurde innerhalb der 1.3-Serie eine deterministische Reihenfolge bei der Bestimmung der FROM-Klausel aus einer gegebenen Spaltenentität, die an Query übergeben wird, verwendet, sodass der gleiche Ausdruck jedes Mal bestimmt wird.

    Referenzen: #5194

  • [orm] [bug]

    Regression in 1.3.14 aufgrund von #4849 behoben, bei der ein Aufruf von sys.exc_info() bei einem Flush-Fehler nicht korrekt aufgerufen wurde. Testabdeckung wurde für diesen Ausnahmefall hinzugefügt.

    Referenzen: #5196

1.3.14

Veröffentlicht: 10. März 2020

general

  • [general] [bug] [py3k]

    Ein expliziter „cause“ (Ursache) wurde den meisten, wenn nicht allen intern ausgelösten Ausnahmen hinzugefügt, die aus einem internen Ausnahme-Catching ausgelöst werden, um irreführende Stack-Traces zu vermeiden, die auf einen Fehler bei der Behandlung einer Ausnahme hindeuten. Obwohl es vorzuziehen wäre, die intern gefangene Ausnahme so zu unterdrücken, wie es das Attribut __suppress_context__ tun würde, gibt es anscheinend noch keinen Weg, dies zu tun, ohne einen umschließenden benutzerdefinierten Kontext zu unterdrücken. Daher wird die intern gefangene Ausnahme vorerst als Ursache offengelegt, damit alle Informationen über den Kontext des Fehlers erhalten bleiben.

    Referenzen: #4849

orm

  • [orm] [usecase]

    Ein neues Flag InstanceEvents.restore_load_context und SessionEvents.restore_load_context wurde hinzugefügt, die für die Ereignisse InstanceEvents.load(), InstanceEvents.refresh() und SessionEvents.loaded_as_persistent() gelten. Wenn dieses Flag gesetzt ist, wird der „load context“ des Objekts nach dem Aufruf des Event-Hooks wiederhergestellt. Dies stellt sicher, dass das Objekt innerhalb des „loader context“ der bereits laufenden Ladeoperation verbleibt, anstatt aufgrund von Refresh-Operationen, die im Event aufgetreten sein mögen, in einen neuen Ladekontext übertragen zu werden. Es wird nun eine Warnung ausgegeben, wenn diese Bedingung auftritt, die die Verwendung des Flags zur Behebung dieses Falls empfiehlt. Das Flag ist „opt-in“, sodass bestehenden Anwendungen kein Risiko entsteht.

    Die Änderung fügt außerdem Unterstützung für das Flag raw=True für Session-Lifecycle-Ereignisse hinzu.

    Referenzen: #5129

  • [orm] [bug]

    Behobener Regressionfehler, der in 1.3.13 durch #5056 verursacht wurde, bei dem eine Umgestaltung des ORM-Pfadregistrierungssystems dazu führte, dass ein Pfad nicht mehr mit einem leeren Tupel verglichen werden konnte, was in einer bestimmten Art von joined eager loading Pfaden auftreten kann. Der Anwendungsfall "leeres Tupel" wurde gelöst, sodass der Pfadregistry mit einem Pfadregistry in allen Fällen verglichen wird; das PathRegistry Objekt selbst implementiert nun die Methoden __eq__() und __ne__(), die bei allen Gleichheitsvergleichen greifen und auch in dem nicht erwarteten Fall, dass ein Nicht-PathRegistry Objekt verglichen wird, weiterhin erfolgreich sind, wobei eine Warnung ausgegeben wird, dass dieses Objekt nicht Gegenstand des Vergleichs sein sollte.

    Referenzen: #5110

  • [orm] [bug]

    Das Setzen einer Beziehung auf viewonly=True, die auch das Ziel einer back_populates- oder backref-Konfiguration ist, gibt nun eine Warnung aus und wird zukünftig nicht mehr zulässig sein. back_populates bezieht sich speziell auf die Mutation eines Attributs oder einer Sammlung, was nicht zulässig ist, wenn das Attribut viewonly=True unterliegt. Das viewonly-Attribut unterliegt keinen Persistenzverhalten, was bedeutet, dass es keine korrekten Ergebnisse widerspiegelt, wenn es lokal mutiert wird.

    Referenzen: #5149

  • [orm] [bug]

    Behobene weitere Regression im selben Bereich wie #5080, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine joined Option über ein with_polymorphic() auf die Basisklasse dieser with_polymorphic und dann weiter auf reguläre gemappte Beziehungen zu erstellen, fehlschlug, da die Basisklassenkomponente sich nicht auf dem Pfad zum Laden hinzufügte, auf dem sie vom Laderstrategie gefunden werden konnte. Die in #5080 angewendeten Änderungen wurden weiter verfeinert, um auch dieses Szenario abzudecken.

    Referenzen: #5121

engine

  • [engine] [bug]

    Erweiterte den Geltungsbereich der Cursor-/Verbindungsbereinigung, wenn eine Anweisung ausgeführt wird, um Fälle einzuschließen, in denen das Ergebnisobjekt nicht konstruiert werden kann, ein after_cursor_execute() Ereignis einen Fehler auslöst oder autocommit / autoclose fehlschlägt. Dies ermöglicht die Bereinigung des DBAPI-Cursors bei Fehlern und ermöglicht bei verbindungsloser Ausführung das Schließen der Verbindung und Rückgabe an den Connection Pool, während sie zuvor bis zur Auslösung der Garbage Collection auf eine Poolrückgabe wartete.

    Referenzen: #5182

sql

  • [sql] [bug] [postgresql]

    Behobener Fehler, bei dem eine CTE eines INSERT/UPDATE/DELETE, die auch RETURNING verwendet, nicht direkt ausgewählt werden konnte, da der interne Zustand des Compilers versuchte, die äußere SELECT-Anweisung selbst als DELETE-Anweisung zu behandeln und auf nicht vorhandenen Zustand zuzugreifen.

    Referenzen: #5181

postgresql

  • [postgresql] [bug]

    Behobenes Problem, bei dem das "schema_translate_map"-Feature mit einem nativen PostgreSQL-Enumerationstyp (d.h. Enum, ENUM) nicht funktionierte, da zwar die "CREATE TYPE"-Anweisung mit dem richtigen Schema ausgegeben wurde, das Schema jedoch in der CREATE TABLE-Anweisung zum Zeitpunkt der Referenzierung der Enumeration nicht gerendert wurde.

    Referenzen: #5158

  • [postgresql] [bug] [reflection]

    Behobener Fehler, bei dem die PostgreSQL-Reflektion von CHECK-Constraints die Einschränkung nicht parsen konnte, wenn der SQL-Text Zeilenumbrüche enthielt. Der reguläre Ausdruck wurde angepasst, um diesen Fall zu berücksichtigen. Pull Request von Eric Borczuk.

    Referenzen: #5170

mysql

  • [mysql] [bug]

    Behobenes Problem in der MySQL Insert.on_duplicate_key_update()-Konstruktion, bei der die Verwendung einer SQL-Funktion oder eines anderen zusammengesetzten Ausdrucks für ein Spaltenargument das Schlüsselwort VALUES, das die Spalte selbst umschließt, nicht korrekt gerendert hätte.

    Referenzen: #5173

mssql

  • [mssql] [bug]

    Behobenes Problem, bei dem der DATETIMEOFFSET-Typ den None-Wert nicht berücksichtigte, der als Teil der Fixes für diesen Typ eingeführt wurde, der erstmals in #4983, #5045 eingeführt wurde. Zusätzlich wurde die Unterstützung für die Übergabe eines Backend-spezifischen, Datums-formatierten Strings über diesen Typ hinzugefügt, wie es für Datums-/Zeit-Typen auf den meisten anderen DBAPIs üblich ist.

    Referenzen: #5132

oracle

  • [oracle] [bug]

    Behobener Reflektionsfehler, bei dem Tabellenkommentare nur für Tabellen abgerufen werden konnten, die tatsächlich dem Benutzer gehörten, aber nicht für Tabellen, die für den Benutzer sichtbar, aber im Besitz eines anderen waren. Pull Request von Dave Hirschfeld.

    Referenzen: #5146

misc

  • [usecase] [ext]

    Schlüsselwortargumente wurden der Funktion MutableList.sort() hinzugefügt, sodass eine Schlüsselfunktion sowie das Schlüsselwortargument "reverse" übergeben werden können.

    Referenzen: #5114

  • [bug] [performance]

    Überarbeitete eine interne Änderung am Testsystem, die als Ergebnis von #5085 hinzugefügt wurde, bei der ein auf das Dialekt bezogenes Testmodul bedingungslos geladen wurde, wenn dieses Dialekt verwendet wurde, wodurch das Testframework von SQLAlchemy und auch der ORM in den Modulimportraum gezogen wurden. Dies beeinträchtigte nur die anfängliche Startzeit und den Speicherbedarf in moderatem Umfang, es ist jedoch am besten, wenn diese zusätzlichen Module nicht von der direkten Core-Nutzung abhängen.

    Referenzen: #5180

  • [bug] [installation]

    Die Funktion inspect.formatannotation wurde in sqlalchemy.util.compat eingebunden, die für die eingebundene Version von inspect.formatargspec benötigt wird. Die Funktion ist in cPython nicht dokumentiert und ihre Verfügbarkeit in zukünftigen Python-Versionen ist nicht garantiert.

    Referenzen: #5138

1.3.13

Veröffentlicht: 22. Januar 2020

orm

  • [orm] [performance]

    Identifiziertes Performanceproblem im System, bei dem ein Join basierend auf einer gemappten Beziehung konstruiert wird. Das Klauselanpassungssystem wurde für die Mehrheit der Join-Ausdrücke verwendet, auch in dem gängigen Fall, in dem keine Anpassung erforderlich ist. Die Bedingungen, unter denen diese Anpassung auftritt, wurden verfeinert, sodass durchschnittliche nicht-aliase Joins über eine einfache Beziehung ohne "sekundäre" Tabelle etwa 70% weniger Funktionsaufrufe benötigen.

  • [orm] [bug] [engine]

    Unterstützung für Tests hinzugefügt und eine Vielzahl von unnötigen Referenzzyklen behoben, die für kurzlebige Objekte erstellt wurden, hauptsächlich im Bereich der ORM-Abfragen. Vielen Dank an Carson Ip für die Hilfe dabei.

    Referenzen: #5050, #5056, #5071

  • [orm] [bug]

    Behobene Regression in Loader-Optionen, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine Loader-Option mit PropComparator.of_type() zu erstellen, die auf eine aliasisierte Entität abzielt, die eine ererbte Unterklasse der Entität ist, auf die sich die vorhergehende Beziehung bezieht, kein passendes Pfad erzeugte. Siehe auch #5082, der in dieser Veröffentlichung behoben wurde und eine ähnliche Art von Problem betrifft.

    Referenzen: #5107

  • [orm] [bug]

    Behobene Regression im joined eager loading, eingeführt in 1.3.0b3 durch #4468, bei der die Möglichkeit, eine joined Option über ein with_polymorphic() in eine polymorphe Unterklasse unter Verwendung von RelationshipProperty.of_type() und dann weiter über reguläre gemappte Beziehungen zu erstellen, fehlschlug, da die polymorphe Unterklasse sich nicht auf dem Pfad zum Laden hinzufügte, auf dem sie vom Laderstrategie gefunden werden konnte. Eine Anpassung wurde vorgenommen, um dieses Szenario zu lösen.

    Referenzen: #5082

  • [orm] [bug]

    Behobene Warnung im ORM-Flush-Prozess, die nicht durch Testabdeckung abgedeckt war, beim Löschen von Objekten, die das "version_id"-Feature verwenden. Diese Warnung ist im Allgemeinen nicht erreichbar, es sei denn, es wird ein Dialekt verwendet, der das Flag "supports_sane_rowcount" auf False setzt, was typischerweise nicht der Fall ist, aber für einige MySQL-Konfigurationen sowie ältere Firebird-Treiber und wahrscheinlich einige Drittanbieter-Dialekte möglich ist.

    Referenzen: #5068

  • [orm] [bug]

    Behobener Fehler, bei dem die Verwendung von joined eager loading die Abfrage innerhalb einer Subquery nicht korrekt umschloss, wenn Query.group_by() auf die Abfrage angewendet wurde. Wenn irgendeine Art von ergebnisbeschränkender Methode verwendet wird, wie DISTINCT, LIMIT, OFFSET, bettet joined eager loading die zeilenbegrenzte Abfrage in eine Subquery ein, damit die Sammlungsresultate nicht beeinträchtigt werden. Aus irgendeinem Grund wurde die GROUP BY-Klausel nie in dieses Kriterium aufgenommen, obwohl sie einen ähnlichen Effekt wie DISTINCT hat. Zusätzlich verhinderte der Fehler die Verwendung von GROUP BY für eine joined eager load-Abfrage für die meisten Datenbankplattformen, die nicht aggregierte, nicht gruppierte Spalten in der Abfrage verbieten, da die zusätzlichen Spalten für den joined eager load von der Datenbank nicht akzeptiert würden.

    Referenzen: #5065

engine

  • [engine] [bug]

    Behobenes Problem, bei dem die Sammlung von Wertverarbeitern auf einem Compiled-Objekt mutiert wurde, wenn "expanding IN"-Parameter mit einem Datentyp mit Bindungswertverarbeitern verwendet wurden; dies bedeutete insbesondere, dass bei Verwendung von Statement-Caching und/oder gebackenen Abfragen dieselbe compiled._bind_processors-Sammlung gleichzeitig mutiert wurde. Da diese Prozessoren jedes Mal dieselbe Funktion für einen bestimmten Bindungsparameter-Namensraum waren, gab es keine tatsächlichen negativen Auswirkungen dieses Problems, jedoch sollte die Ausführung eines Compiled-Objekts niemals Zustandsänderungen verursachen, insbesondere da sie threadsicher und wiederverwendbar sein sollen, sobald sie vollständig konstruiert sind.

    Referenzen: #5048

sql

  • [sql] [usecase]

    Eine Funktion, die mit GenericFunction erstellt wurde, kann nun angeben, ob der Name der Funktion mit oder ohne Anführungszeichen gerendert werden soll, indem die quoted_name-Konstruktion dem .name-Element des Objekts zugewiesen wird. Vor 1.3.4 wurden Anführungszeichen nie auf Funktionsnamen angewendet, und einige Anführungszeichen wurden in #4467 eingeführt, aber es gab keine Möglichkeit, Anführungszeichen für einen gemischten Namen zu erzwingen. Zusätzlich wird die quoted_name-Konstruktion, wenn sie als Name verwendet wird, ihren Kleinbuchstaben-Namen korrekt im Funktionsregister registrieren, sodass der Name über das func.-Register weiterhin verfügbar ist.

    Siehe auch

    GenericFunction

    Referenzen: #5079

postgresql

  • [postgresql] [usecase]

    Unterstützung für Präfixe für die CTE-Konstruktion hinzugefügt, um Unterstützung für die PostgreSQL 12 "MATERIALIZED" und "NOT MATERIALIZED" Phrasen zu ermöglichen. Pull Request von Marat Sharafutdinov.

    Siehe auch

    HasCTE.cte()

    Referenzen: #5040

  • [postgresql] [bug]

    Behobenes Problem, bei dem das PostgreSQL-Dialekt eine reflektierte CHECK-Constraint, die eine boolesche Funktion war (im Gegensatz zu einem booleschen Ausdruck), nicht parsen konnte.

    Referenzen: #5039

mssql

  • [mssql] [bug]

    Behobenes Problem, bei dem ein zeitzonenbewusster datetime-Wert, der in einen String für die Verwendung als Parameterwert einer DATETIMEOFFSET-Spalte umgewandelt wurde, die Nachkommastellen ausließ.

    Referenzen: #5045

tests

  • [tests] [bug]

    Einige Testfehler, die unter Windows aufgrund von SQLite-Dateisperrproblemen auftraten, sowie einige Timing-Probleme in Tests im Zusammenhang mit dem Connection Pool wurden behoben; Pull Request von Federico Caselli.

    Referenzen: #4946

  • [tests] [postgresql]

    Verbesserte Erkennung der Anforderung von Two-Phase-Transaktionen für die PostgreSQL-Datenbank durch Testen, dass max_prepared_transactions auf einen Wert größer als 0 gesetzt ist. Pull Request von Federico Caselli.

    Referenzen: #5057

misc

  • [bug] [ext]

    Behobener Fehler in sqlalchemy.ext.serializer, bei dem ein eindeutiges BindParameter-Objekt mit sich selbst in Konflikt geraten konnte, wenn es in der Abbildung selbst und auch in der Filterbedingung der Abfrage vorhanden war, da eine Seite gegen die nicht deserialisierte Version verwendet wurde und die andere Seite die deserialisierte Version verwendete. Die Logik wurde in BindParameter ähnlich wie bei der "clone"-Methode hinzugefügt, die den Parameternamen bei der Deserialisierung eindeutig macht, sodass er nicht mit dem Original in Konflikt gerät.

    Referenzen: #5086

1.3.12

Veröffentlicht: 16. Dezember 2019

orm

  • [orm] [bug]

    Behobenes Problem mit der lazy="raise"-Strategie, bei der ein ORM-Löschen eines Objekts für eine einfache Many-to-One-Beziehung vom Typ "use-get", bei der lazy="raise" konfiguriert war, einen Fehler auslöste. Dies ist inkonsistent mit der Änderung in 1.3 im Rahmen von #4353, wo festgelegt wurde, dass eine Historienoperation, die keine SQL-Ausgabe erwartet, die lazy="raise"-Prüfung umgehen sollte und stattdessen effektiv als lazy="raise_on_sql" für diesen Fall behandelt werden sollte. Die Korrektur passt die Lazy-Loader-Strategie an, um in dem Fall, dass der Lazy-Load angewiesen wurde, keine SQL-Ausgabe zu generieren, wenn das Objekt nicht vorhanden ist, nicht zu erhöhen.

    Referenzen: #4997

  • [orm] [bug]

    Behobene Regression, eingeführt in 1.3.0, im Zusammenhang mit der Refaktorierung von Association Proxies in #4351, die verhinderte, dass composite()-Attribute in Bezug auf einen Association Proxy, der auf sie verweist, funktionierten.

    Referenzen: #5000

  • [orm] [bug]

    Das Setzen von persistenzbezogenen Flags auf relationship(), während gleichzeitig viewonly=True gesetzt ist, gibt nun eine reguläre Warnung aus, da diese Flags für eine viewonly=True-Beziehung keinen Sinn ergeben. Insbesondere die "cascade"-Einstellungen haben ihre eigene Warnung, die basierend auf den einzelnen Werten, wie z.B. "delete, delete-orphan", generiert wird und nicht für eine viewonly-Beziehung gelten sollte. Beachten Sie jedoch, dass im Falle von "cascade" diese Einstellungen immer noch fälschlicherweise wirksam werden, obwohl die Beziehung als "viewonly" eingerichtet ist. In 1.4 werden alle persistenzbezogenen Cascade-Einstellungen für eine viewonly=True-Beziehung nicht mehr zulässig sein, um dieses Problem zu beheben.

    Referenzen: #4993

  • [orm] [bug] [py3k]

    Behobenes Problem, bei dem beim Zuweisen einer Sammlung an sich selbst als Slice die Mutationsoperation fehlschlug, da sie zunächst die zugewiesene Sammlung versehentlich löschte. Da eine Zuweisung, die den Inhalt nicht ändert, keine Ereignisse auslösen sollte, ist die Operation nun ein No-Op. Beachten Sie, dass die Korrektur nur für Python 3 gilt; in Python 2 wird der __setitem__ Hook in diesem Fall nicht aufgerufen; stattdessen wird __setslice__ verwendet, was die Liste Element für Element in allen Fällen neu erstellt.

    Referenzen: #4990

  • [orm] [bug]

    Behobenes Problem, bei dem, wenn das "begin" einer Transaktion auf Core-Engine-/Verbindungsebene fehlschlug, z. B. aufgrund eines Netzwerkfehlers oder einer gesperrten Datenbank für einige transaktionale Rezepte, im Kontext der Session, die diese Verbindung vom Connection Pool bezog und dann sofort zurückgab, die ORM Session die Verbindung nicht schloss, obwohl diese Verbindung nicht im Zustand dieser Session gespeichert war. Dies führte dazu, dass die Verbindung durch den Connection Pool WeakRef-Handler während der Garbage Collection bereinigt wurde, was ein unerwünschter Code-Pfad ist, der in einigen speziellen Konfigurationen Fehler in Standardfehler ausgeben kann.

    Referenzen: #5034

sql

  • [sql] [bug]

    Behobener Fehler, bei dem das Schlüsselwort "distinct", das an select() übergeben wurde, einen String-Wert nicht als "Label-Referenz" behandelte, so wie es select.distinct() tut; stattdessen wurde bedingungslos ein Fehler ausgelöst. Dieses Schlüsselwortargument und andere, die an select() übergeben wurden, werden für SQLAlchemy 2.0 letztendlich als veraltet erklärt.

    Referenzen: #5028

  • [sql] [bug]

    Der Text der Ausnahme für "Kann Label-Referenz nicht auflösen" wurde geändert, um andere Arten von Label-Koerzionen einzuschließen, insbesondere dass "DISTINCT" unter dem PostgreSQL-Dialekt ebenfalls in diese Kategorie fällt.

sqlite

  • [sqlite] [bug]

    Behobenes Problem als Workaround für das SQLite-Verhalten, numerische Affinität für JSON-Datentypen zuzuweisen, erstmals beschrieben in Unterstützung für SQLite JSON hinzugefügt, das skalare numerische JSON-Werte als Zahl und nicht als Zeichenkette, die JSON deserialisiert werden kann, zurückgibt. Der SQLite-spezifische JSON-Deserializer degradiert nun für diesen Fall als Ausnahme und umgeht die Deserialisierung für einzelne numerische Werte, da sie aus JSON-Sicht bereits deserialisiert sind.

    Referenzen: #5014

mssql

  • [mssql] [bug]

    Unterstützung für den DATETIMEOFFSET-Datentyp auf PyODBC repariert, indem PyODBC-spezifische Ergebnis-Handler hinzugefügt wurden, da dieser keinen nativen Support für diesen Datentyp hat. Dies beinhaltet die Verwendung der Python 3 "timezone" tzinfo Unterklasse zur Einrichtung einer Zeitzone, die auf Python 2 eine minimale Portierung von "timezone" in sqlalchemy.util verwendet.

    Referenzen: #4983

1.3.11

Veröffentlicht: 11. November 2019

orm

  • [orm] [usecase]

    Accessor Query.is_single_entity() zu Query hinzugefügt, der angibt, ob die von dieser Query zurückgegebenen Ergebnisse eine Liste von ORM-Entitäten oder ein Tupel von Entitäten oder Spaltenausdrücken sind. SQLAlchemy hofft, das Verhalten von einzelnen Entitäten / Tupeln in zukünftigen Versionen zu verbessern, sodass das Verhalten von Anfang an explizit wäre, aber dieses Attribut sollte bei aktuellem Verhalten hilfreich sein. Pull Request von Patrick Hayes.

    Referenzen: #4934

  • [orm] [bug]

    Das Flag relationship.omit_join war nicht dazu bestimmt, manuell auf True gesetzt zu werden, und gibt nun eine Warnung aus, wenn dies geschieht. Die omit_join-Optimierung wird automatisch erkannt, und das omit_join-Flag war nur dazu gedacht, die Optimierung in dem hypothetischen Fall zu deaktivieren, dass die Optimierung die korrekten Ergebnisse beeinträchtigt hätte, was bei der modernen Version dieses Features nicht beobachtet wurde. Das Setzen des Flags auf True, wenn es nicht automatisch erkannt wird, kann dazu führen, dass das Selectin-Load-Feature nicht korrekt funktioniert, wenn eine nicht-standardmäßige primäre Join-Bedingung verwendet wird.

    Referenzen: #4954

  • [orm] [bug]

    Es wird eine Warnung ausgegeben, wenn ein Primärschlüsselwert an Query.get() übergeben wird, der für alle Primärschlüsselspaltenpositionen None enthält. Zuvor führte die Übergabe eines einzelnen None außerhalb eines Tupels zu einem TypeError und die Übergabe eines zusammengesetzten None (Tupel von None-Werten) wurde stillschweigend übernommen. Die Korrektur wandelt nun das einzelne None in ein Tupel um, wo es konsistent mit den anderen None-Bedingungen behandelt wird. Vielen Dank an Lev Izraelit für die Hilfe dabei.

    Referenzen: #4915

  • [orm] [bug]

    Die BakedQuery speichert keine Abfragen zwischen, die durch ein QueryEvents.before_compile()-Ereignis modifiziert wurden, sodass Kompilierungs-Hooks, die ad-hoc-Modifikationen an Abfragen vornehmen können, bei jeder Ausführung wirksam werden. Dies ist insbesondere hilfreich für Ereignisse, die Abfragen modifizieren, die beim Lazy Loading sowie beim Eager Loading wie dem "select in"-Loading verwendet werden. Um das Caching für eine durch dieses Ereignis modifizierte Abfrage wieder zu aktivieren, wird ein neues Flag bake_ok hinzugefügt; siehe Verwendung des before_compile-Ereignisses für Details.

    Ein längerfristiger Plan zur Bereitstellung einer neuen Form des SQL-Cachings soll diese Art von Problemen umfassender lösen.

    Referenzen: #4947

  • [orm] [bug]

    ORM-Bug behoben, bei dem eine "sekundäre" Tabelle, die sich auf ein selektierbares Element bezog, das sich auf irgendeine Weise auf die lokale Primärtabelle bezog, beide Seiten der Join-Bedingung mit Aliasing versah, wenn ein beziehungsbezogener Join, entweder über Query.join() oder durch joinedload(), generiert wurde. Die "lokale" Seite wird nun ausgeschlossen.

    Referenzen: #4974

engine

  • [engine] [bug]

    Bug behoben, bei dem die Parameter-Repräsentation, wie sie in der Protokollierung und Fehlerberichterstattung verwendet wird, zusätzlichen Kontext benötigt, um zwischen einer Liste von Parametern für eine einzelne Anweisung und einer Liste von Parameterlisten zu unterscheiden, da die "Liste von Listen"-Struktur auch eine einzelne Parameterliste anzeigen könnte, bei der der erste Parameter selbst eine Liste ist, wie z. B. bei einem Array-Parameter. Die Engine/Verbindung übergibt nun ein zusätzliches Boolesches Flag, das angibt, wie die Parameter betrachtet werden sollen. Das einzige SQLAlchemy-Backend, das Arrays als Parameter erwartet, ist das von psycopg2, das pyformat-Parameter verwendet, sodass dieses Problem bisher nicht sehr deutlich war. Da jedoch andere Treiber, die Positionsangaben verwenden, mehr Funktionen erhalten, ist es wichtig, dass dies unterstützt wird. Es entfällt auch die Notwendigkeit, dass die Parameter-Repräsentationsfunktion basierend auf der übergebenen Parameterstruktur rät.

    Referenzen: #4902

  • [engine] [bug] [postgresql]

    Bug in Inspector behoben, bei dem die Generierung von Cache-Schlüsseln keine Argumente berücksichtigte, die in Form von Tupeln übergeben wurden, wie z. B. das Tupel von View-Namensstilen, die für das PostgreSQL-Dialekt zurückgegeben werden sollten. Dies führte dazu, dass der Inspektor für einen spezifischeren Kriterienkatalog zu allgemein zwischenspeicherte. Die Logik wurde angepasst, um jedes Schlüsselwort-Element in den Cache aufzunehmen, da jedes Argument für einen Cache geeignet sein muss, andernfalls sollte der Caching-Decorator vom Dialekt umgangen werden.

    Referenzen: #4955

sql

  • [sql] [usecase]

    Neue Accessoren zu Ausdrücken vom Typ JSON hinzugefügt, um spezifischen Datentypzugriff und -vergleiche zu ermöglichen, die Strings, Ganzzahlen, numerische und boolesche Elemente abdecken. Dies überarbeitet den dokumentierten Ansatz des CASTings zu String beim Vergleich von Werten und fügt stattdessen spezifische Funktionalität in die Dialekte PostgreSQL, SQlite und MySQL ein, um diese Basistypen in allen Fällen zuverlässig zu liefern.

    Referenzen: #4276

  • [sql] [usecase]

    Das Konstrukt text() unterstützt nun "eindeutige" gebundene Parameter, die sich zur Kompilierungszeit dynamisch eindeutig machen, wodurch mehrere text()-Konstrukte mit denselben Namen gebundener Parameter kombiniert werden können.

    Referenzen: #4933

  • [sql] [bug] [py3k]

    Die repr() des quoted_name-Konstrukts wurde unter Python 3 auf die reguläre String-repr() umgestellt, anstatt sie durch "backslashreplace"-Escaping laufen zu lassen, was irreführend sein kann.

    Referenzen: #4931

schema

  • [schema] [usecase]

    DDL-Unterstützung für "berechnete Spalten" hinzugefügt; dies sind DDL-Spaltenspezifikationen für Spalten, die einen serverseitig berechneten Wert haben, entweder bei SELECT (bekannt als "virtuell") oder zum Zeitpunkt ihrer INSERT- oder UPDAT-Operation (bekannt als "gespeichert"). Unterstützung wurde für Postgresql, MySQL, Oracle, SQL Server und Firebird etabliert. Vielen Dank an Federico Caselli für die viele Arbeit an diesem Punkt.

    Referenzen: #4894

  • [schema] [bug]

    Bug behoben, bei dem eine Tabelle, die eine Spaltenbezeichnung hatte, die mit einem einfachen Spaltennamen überlappte, z. B. "foo.id AS foo_id" gegenüber "foo.foo_id", das Attribut ._label für eine Spalte vorzeitig generiert hätte, bevor diese Überlappung erkannt werden konnte, aufgrund der Verwendung des Flags index=True oder unique=True auf der Spalte in Verbindung mit der Standardbenennungskonvention von "column_0_label". Dies hätte dann zu Fehlern geführt, wenn ._label später zur Generierung eines gebundenen Parameternamens verwendet wurde, insbesondere bei denen, die vom ORM bei der Generierung der WHERE-Klausel für eine UPDATE-Anweisung verwendet wurden. Das Problem wurde behoben, indem ein alternativer ._label-Accessor für die DDL-Generierung verwendet wird, der den Zustand der Column nicht beeinflusst. Der Accessor umgeht auch den Schritt der Schlüssel-Deduplizierung, da dieser für DDL nicht notwendig ist. Die Benennung ist nun konsistent "<tabellenname>_<spaltenname>" ohne nachfolgende numerische Symbole, wenn sie in DDL verwendet wird.

    Referenzen: #4911

mysql

  • [mysql] [bug]

    Die Meldung "Connection was killed" wurde aus der Basisklasse pymysql.Error interpretiert, um geschlossene Verbindungen zu erkennen. Dies basiert auf Berichten, dass diese Meldung über ein pymysql.InternalError()-Objekt ankommt, was darauf hindeutet, dass pymysql sie nicht korrekt behandelt.

    Referenzen: #4945

mssql

  • [mssql] [bug]

    Problem im MSSQL-Dialekt behoben, bei dem ein ausdrucksbasierter OFFSET-Wert in einem SELECT abgelehnt wurde, obwohl der Dialekt diesen Ausdruck innerhalb eines ROW NUMBER-orientierten LIMIT/OFFSET-Konstrukts rendern kann.

    Referenzen: #4973

  • [mssql] [bug]

    Problem in der Methode Engine.table_names() behoben, bei der der Standard-Schemaname des Dialekts zurück in die Tabellenfunktion auf Dialektebene eingespeist wurde. Dies führte im Falle von SQL Server dazu, dass er als punktgetrennter Schemaname interpretiert wurde, wie er vom mssql-Dialekt gesehen wird, was zum Fehlschlag der Methode führte, wenn der Datenbankbenutzer tatsächlich einen Punkt in seinem Namen hatte. In 1.3 wird diese Methode immer noch von der Funktion MetaData.reflect() verwendet, sodass es sich um einen prominenten Codepfad handelt. In 1.4, der aktuellen Hauptentwicklungszweig, existiert dieses Problem nicht, da sowohl MetaData.reflect() diese Methode nicht verwendet als auch die Methode den Standard-Schemanamen nicht explizit übergibt. Die Korrektur schützt dennoch davor, dass der vom Dialekt zurückgegebene Standard-Servernamenwert unter keinen Umständen als punktgetrennter Name interpretiert wird, indem er in quoted_name() eingekapselt wird.

    Referenzen: #4923

oracle

  • [oracle] [usecase]

    Dialekt-Flag encoding_errors zum cx_Oracle-Dialekt hinzugefügt, das als Teil von create_engine() angegeben werden kann. Dies wird für den sehr ungewöhnlichen Fall, dass fehlerhafte Kodierungen in der Zieldatenbank vorhanden sind, die nur ohne Fehlerbehandlung abgerufen werden können, an den Unicode-Dekodierungskonverter von SQLAlchemy unter Python 2 und an den encodingErrors-Parameter des cursor.var()-Objekts unter Python 3 übergeben. Der Wert ist letztendlich einer der Python-"Encoding-Fehler"-Parameter, die an decode() übergeben werden.

    Referenzen: #4799

  • [oracle] [bug] [firebird]

    Der Ansatz der "Namensnormalisierung" für die Oracle- und Firebird-Dialekte wurde geändert, der von der UPPERCASE-als-case-insensitiv-Konvention dieser Dialekte in Kleinbuchstaben-als-case-insensitiv für SQLAlchemy konvertiert. Dabei wird das Konstrukt quoted_name nicht automatisch auf einen Namen angewendet, der sich bei Groß- oder Kleinschreibung entspricht, wie es bei vielen nicht-europäischen Zeichen der Fall ist. Alle Namen, die innerhalb von Metadatenstrukturen verwendet werden, werden ohnehin in quoted_name-Objekte konvertiert; die Änderung hier würde nur die Ausgabe einiger Inspektionsfunktionen beeinflussen.

    Referenzen: #4931

  • [oracle] [bug]

    Der Datentyp NCHAR wird nun bei Verwendung als gebundener Parameter an die DBAPI-Datenbindungen cx_Oracle.FIXED_NCHAR gebunden, was ein korrektes Vergleichsverhalten gegenüber einem String variabler Länge liefert. Zuvor wurde der Datentyp NCHAR an cx_oracle.NCHAR gebunden, das keine feste Länge hat; der Datentyp CHAR wird bereits an cx_Oracle.FIXED_CHAR gebunden, sodass es nun konsistent ist, dass NCHAR an cx_Oracle.FIXED_NCHAR gebunden wird.

    Referenzen: #4913

tests

  • [tests] [bug]

    Einheitstest-Regression behoben, die bei neueren SQLite-Versionen ab Version 3.30 auftrat, aufgrund der zusätzlichen NULL-Sortiersyntax sowie neuer Einschränkungen für Aggregatfunktionen. Pull-Request von Nils Philippsen.

    Referenzen: #4920

misc

  • [bug] [installation] [windows]

    Ein Workaround für einen Setuptools-bedingten Fehler hinzugefügt, der bei Windows-Installationen beobachtet wurde, bei denen Setuptools einen Build-Fehler nicht korrekt meldet, wenn die MSVC-Build-Abhängigkeiten nicht installiert sind, und daher keine ordnungsgemäße Degradation in Builds ohne C-Erweiterungen zulässt.

    Referenzen: #4967

  • [bug] [firebird]

    Zusätzliche "Disconnect"-Meldung "Error writing data to the connection" zur Erkennung von Firebird-Disconnections hinzugefügt. Pull-Request von lukens.

    Referenzen: #4903

1.3.10

Veröffentlicht: 9. Oktober 2019

mssql

  • [mssql] [bug]

    Bug im SQL Server-Dialekt mit der neuen Funktion "max_identifier_length" behoben, bei der der mssql-Dialekt dieses Flag bereits enthielt und die Implementierung den neuen Initialisierungs-Hook nicht korrekt berücksichtigte.

    Referenzen: #4857

oracle

  • [oracle] [bug]

    Regression im Oracle-Dialekt behoben, die versehentlich die maximale Bezeichnerlänge von 128 Zeichen auf Oracle Server 12.2 und höher verwendete, obwohl der vereinbarte Vertrag für den Rest der 1.3er-Serie vorsah, dass dieser Wert bis Version SQLAlchemy 1.4 bei 30 bleibt. Probleme mit dem Abruf der "Kompatibilitätsversion" wurden ebenfalls behoben, und die Warnung, die ausgegeben wurde, wenn die Ansicht "v$parameter" nicht zugänglich war, wurde entfernt, da dies zu Verwirrung bei den Benutzern führte.

    Referenzen: #4857, #4898

1.3.9

Veröffentlicht: 4. Oktober 2019

orm

  • [orm] [bug]

    Regression in der selectinload-Loader-Strategie, die durch #4775 (veröffentlicht in Version 1.3.6) verursacht wurde, behoben, bei der ein Many-to-One-Attribut von None nicht mehr vom Loader gefüllt wurde. Obwohl dies aufgrund des Lazyloaders, der None beim Abrufen füllte, normalerweise nicht auffiel, würde es zu einem Detached-Instance-Fehler führen, wenn das Objekt getrennt wäre.

    Referenzen: #4872

  • [orm] [bug]

    Die Übergabe eines einfachen String-Ausdrucks an Session.query() ist veraltet, da alle String-Konvertierungen in #4481 entfernt wurden und diese hätte enthalten sein sollen. Die Funktion literal_column() kann verwendet werden, um einen textuellen Spaltenausdruck zu erzeugen.

    Referenzen: #4873

  • [orm] [bug]

    Es wird eine Warnung für eine Bedingung ausgegeben, unter der die Session ein Objekt implizit aus der Identitätskarte gegen ein anderes Objekt mit demselben Primärschlüssel austauschen kann, wodurch das alte Objekt getrennt wird. Dies kann ein beobachtetes Ergebnis von Ladevorgängen sein, die innerhalb des SessionEvents.after_flush()-Hooks auftreten. Die Warnung soll den Benutzer darüber informieren, dass eine spezielle Bedingung dazu geführt hat, und dass das vorherige Objekt möglicherweise nicht im erwarteten Zustand ist.

    Referenzen: #4890

engine

  • [engine] [usecase]

    Neuer Parameter create_engine.max_identifier_length für create_engine() hinzugefügt. Dieser überschreibt die im Dialekt kodierte "maximale Bezeichnerlänge", um Datenbanken zu berücksichtigen, die diese Länge kürzlich geändert haben und der SQLAlchemy-Dialekt noch nicht angepasst wurde, um dies für diese Version zu erkennen. Dieser Parameter interagiert mit dem bestehenden Parameter create_engine.label_length, da er den maximalen (und Standard-)Wert für anonym generierte Bezeichnungen festlegt. Darüber hinaus wurde die Erkennung der maximalen Bezeichnerlängen nach der Verbindung zum Dialektsystem hinzugefügt. Dieses Feature wird zuerst vom Oracle-Dialekt genutzt.

    Siehe auch

    Maximale Bezeichnerlängen - in der Dokumentation des Oracle-Dialekts

    Referenzen: #4857

sql

  • [sql] [usecase]

    Explizite Fehlermeldung hinzugefügt für den Fall, dass Objekte, die an Table übergeben werden, keine SchemaItem-Objekte sind, anstatt auf einen AttributeError aufzulösen.

    Referenzen: #4847

  • [sql] [bug]

    Zeichen, die "pyformat" oder "named" Formate in gebundenen Parametern stören, nämlich %, (, ) und das Leerzeichen, sowie einige andere typischerweise unerwünschte Zeichen, werden frühzeitig für einen bindparam() entfernt, der einen anonymisierten Namen verwendet. Dieser wird typischerweise automatisch aus einer benannten Spalte generiert, die selbst diese Zeichen in ihrem Namen enthält und keine .key verwendet. Dadurch wird verhindert, dass sie sowohl die Verwendung der String-Formatierung des SQLAlchemy-Compilers als auch die Parsing des Parameters auf Treiberebene stören, was beides vor der Korrektur demonstriert werden konnte. Die Änderung gilt nur für anonymisierte Parameternamen, die intern generiert und verarbeitet werden, nicht für vom Endbenutzer definierte Namen, sodass die Änderung keine Auswirkungen auf bestehenden Code haben sollte. Gilt insbesondere für den psycopg2-Treiber, der spezielle Parameternamen nicht anderweitig in Anführungszeichen setzt, aber auch führende Unterstriche entfernt, um Oracle gerecht zu werden (aber noch keine führenden Zahlen, da einige anonyme Parameter derzeit rein numerisch/unterstrichelbasiert sind); Oracle setzt in jedem Fall weiterhin Parameternamen mit Sonderzeichen in Anführungszeichen.

    Referenzen: #4837

sqlite

  • [sqlite] [usecase]

    Unterstützung für SQLite "URI"-Verbindungen hinzugefügt, die SQLite-spezifische Flags in der Abfragezeichenfolge ermöglichen, wie z. B. "read only" für Python sqlite3-Treiber, die dies unterstützen.

    Siehe auch

    URI-Verbindungen

    Referenzen: #4863

mssql

  • [mssql] [bug]

    Identifizierungszeichensetzung zum Schemanamen hinzugefügt, der auf die "use"-Anweisung angewendet wird, die aufgerufen wird, wenn ein SQL Server-Multipart-Schemaname innerhalb einer Table verwendet wird, die reflektiert wird, sowie für Inspector-Methoden wie Inspector.get_table_names(). Dies berücksichtigt Sonderzeichen oder Leerzeichen im Datenbanknamen. Darüber hinaus wird die "use"-Anweisung nicht ausgegeben, wenn die aktuelle Datenbank mit dem zu übergebenden Zielbesitzer-Datenbanknamen übereinstimmt.

    Referenzen: #4883

oracle

  • [oracle] [usecase]

    Der Oracle-Dialekt gibt nun eine Warnung aus, wenn Oracle Version 12.2 oder höher verwendet wird und der Parameter create_engine.max_identifier_length nicht gesetzt ist. Die Version in diesem speziellen Fall wird standardmäßig auf die "Kompatibilitäts"-Version gesetzt, die in der Oracle-Serverkonfiguration konfiguriert ist, nicht auf die tatsächliche Serverversion. In Version 1.4 wird die Standard-max_identifier_length für 12.2 oder höher auf 128 Zeichen gesetzt. Um die Abwärtskompatibilität zu gewährleisten, sollten Anwendungen create_engine.max_identifier_length auf 30 setzen, um das gleiche Längenverhalten beizubehalten, oder auf 128, um das kommende Verhalten zu testen. Diese Länge bestimmt unter anderem, wie generierte Constraint-Namen für Anweisungen wie CREATE CONSTRAINT und DROP CONSTRAINT gekürzt werden, was bedeutet, dass die neue Länge einen Namenskonflikt mit einem Namen erzeugen kann, der mit der alten Länge generiert wurde, was Datenbankmigrationen beeinträchtigt.

    Siehe auch

    Maximale Bezeichnerlängen - in der Dokumentation des Oracle-Dialekts

    Referenzen: #4857

  • [oracle] [bug]

    Das Hinzufügen von cx_Oracle.DATETIME zum Aufruf setinputsizes() wurde wiederhergestellt, wenn ein SQLAlchemy Date-, DateTime- oder Time-Datentyp verwendet wird, da einige komplexe Abfragen dies erfordern. Dies wurde in der 1.2er-Serie aus beliebigen Gründen entfernt.

    Referenzen: #4886

tests

  • [tests] [bug]

    Einheitstest-Regression behoben, die in 1.3.8 veröffentlicht wurde und zu Fehlern für Oracle, SQL Server und andere nicht-native ENUM-Plattformen führte, aufgrund neuer Enumerationstests, die als Teil von #4285 Enum-Sortierbarkeit in der Unit-of-Work hinzugefügt wurden; die Enumerationen erzeugten Constraints, die nach Namen dupliziert wurden.

    Referenzen: #4285

1.3.8

Veröffentlicht: 27. August 2019

orm

  • [orm] [usecase]

    Unterstützung für die Verwendung eines Enum-Datentyps mit Python pep-435 Enumerationsobjekten als Werte für die Verwendung als von der ORM zugeordneter Primärschlüsselspalte hinzugefügt. Da diese Werte nicht von Natur aus sortierbar sind, wie von der ORM für Primärschlüssel gefordert, wird ein neues Attribut TypeEngine.sort_key_function zum Typsystem hinzugefügt, das es jedem SQL-Typ ermöglicht, eine Sortierung für Python-Objekte seines Typs zu implementieren, die von der Unit-of-Work konsultiert wird. Der Enum-Typ definiert dies dann anhand des Datenbankwerts einer gegebenen Enumeration. Das Sortierschema kann auch neu definiert werden, indem ein Callable an den Parameter Enum.sort_key_function übergeben wird. Pull-Request von Nicolas Caniart.

    Referenzen: #4285

  • [orm] [bug]

    Bug behoben, bei dem Load-Objekte aufgrund des Mapper-/Relationship-Status im internen Kontextwörterbuch nicht pickelbar waren. Diese Objekte werden nun unter Verwendung ähnlicher Techniken wie andere Elemente im Loader-Optionssystem, die seit langem serialisierbar sind, in pickelbare umgewandelt.

    Referenzen: #4823

engine

  • [engine] [feature]

    Neuer Parameter create_engine.hide_parameters hinzugefügt. Wenn dieser auf True gesetzt ist, werden SQL-Parameter nicht mehr protokolliert und nicht mehr in der String-Darstellung eines StatementError-Objekts angezeigt.

    Referenzen: #4815

  • [engine] [bug]

    Problem behoben, bei dem der "initialize"-Prozess des Dialekts, der bei der ersten Verbindung auftritt, bei einer unerwarteten Ausnahme fehlschlug. Der Initialisierungsprozess konnte nicht abgeschlossen werden und wurde dann bei nachfolgenden Verbindungsversuchen nicht mehr versucht, wodurch der Dialekt im Geltungsbereich von Parametern, die basierend auf der Inspektion einer Live-Verbindung festgelegt werden müssen, in einem nicht initialisierten oder teilweise initialisierten Zustand verblieb. Die "einmalige Ausführung"-Logik im Ereignissystem wurde überarbeitet, um dieses Vorkommnis zu berücksichtigen, indem neue, private API-Funktionen verwendet werden, die einen "exec once"-Hook einrichten, der den Initialisierer weiterhin bei nachfolgenden Verbindungen auslösen wird, bis er ohne Ausnahme abgeschlossen ist. Dies hat keine Auswirkungen auf das Verhalten des bestehenden once=True-Flags im Ereignissystem.

    Referenzen: #4807

postgresql

  • [postgresql] [usecase]

    Hinzugefügte Unterstützung für die Reflexion von CHECK-Constraints, die den speziellen PostgreSQL-Qualifizierer „NOT VALID“ enthalten, welcher für CHECK-Constraints vorhanden sein kann, die mit der Direktive, dass sie nicht auf vorhandene Daten in der Tabelle angewendet werden sollen, zu einer bestehenden Tabelle hinzugefügt wurden. Das PostgreSQL-Wörterbuch für CHECK-Constraints, wie es von Inspector.get_check_constraints() zurückgegeben wird, kann einen zusätzlichen Eintrag dialect_options enthalten, der wiederum einen Eintrag "not_valid": True enthält, wenn dieses Symbol erkannt wird. Pull-Request von Bill Finn.

    Referenzen: #4824

  • [postgresql] [bug]

    Überarbeitete den Ansatz für die gerade hinzugefügte Unterstützung für die psycopg2 „execute_values()“-Funktion, die in 1.3.7 für #4623 hinzugefügt wurde. Der Ansatz beruhte auf einem regulären Ausdruck, der bei komplexeren INSERT-Anweisungen, wie z. B. solchen mit Subqueries, nicht übereinstimmte. Der neue Ansatz stimmt exakt mit dem String überein, der als VALUES-Klausel gerendert wurde.

    Referenzen: #4623

  • [postgresql] [bug]

    Behob einen Fehler, bei dem Postgresql-Operatoren wie Comparator.contains() und Comparator.contained_by() für Nicht-Ganzzahlwerte nicht korrekt funktionierten, wenn sie gegen ein array-Objekt verwendet wurden, aufgrund einer fehlerhaften Assert-Anweisung.

    Referenzen: #4822

sqlite

  • [sqlite] [bug] [reflection]

    Behob einen Fehler, bei dem ein FOREIGN KEY, der so eingerichtet war, dass er nur über den Tabellennamen auf die übergeordnete Tabelle verwies, ohne die Spaltennamen, nicht korrekt reflektiert wurde, was die Einrichtung der „referenzierten Spalten“ betraf, da SQLite’s PRAGMA diese Spalten nicht meldet, wenn sie nicht explizit angegeben wurden. Aus irgendeinem Grund wurde dies hartkodiert, um den Namen der lokalen Spalte anzunehmen, was in manchen Fällen funktionieren mag, aber nicht korrekt ist. Der neue Ansatz reflektiert den Primärschlüssel der referenzierten Tabelle und verwendet die Liste der Constraint-Spalten als Liste der referenzierten Spalten, wenn die entfernten Spalten nicht direkt im reflektierten PRAGMA vorhanden sind.

    Referenzen: #4810

1.3.7

Veröffentlicht: 14. August 2019

orm

  • [orm] [bug]

    Behob eine Regression, die durch das neue selectinload für Many-to-One-Logik verursacht wurde, bei der eine Primaryjoin-Bedingung, die nicht auf tatsächlichen Fremdschlüsseln basierte, zu einem KeyError führte, wenn ein verwandtes Objekt für einen bestimmten Schlüsselwert im übergeordneten Objekt nicht existierte.

    Referenzen: #4777

  • [orm] [bug]

    Behob einen Fehler, bei dem die Verwendung von Query.first() oder ein Slice-Ausdruck in Verbindung mit einer Abfrage, die einen ausdrucksbasierten „offset“ angewendet hat, einen TypeError auslöste, aufgrund einer „oder“-Bedingung gegen „offset“, die nicht erwartete, dass es sich um einen SQL-Ausdruck handelt, im Gegensatz zu einer Ganzzahl oder None.

    Referenzen: #4803

sql

  • [sql] [bug]

    Behob ein Problem, bei dem ein Index-Objekt, das eine Mischung aus funktionalen Ausdrücken enthielt, die nicht auf eine bestimmte Spalte abgebildet werden konnten, in Kombination mit zeichenkettenbasierten Spaltennamen, seinen internen Zustand nicht korrekt initialisierte, was zu Fehlern bei der DDL-Kompilierung führte.

    Referenzen: #4778

  • [sql] [bug]

    Behob einen Fehler, bei dem die Methode TypeEngine.column_expression() nicht auf nachfolgende SELECT-Anweisungen innerhalb eines UNION oder eines anderen _selectable.CompoundSelect angewendet wurde, obwohl die SELECT-Anweisungen auf der obersten Ebene der Anweisung gerendert werden. Neue Logik unterscheidet nun zwischen dem Rendern des Spaltenausdrucks, der für alle SELECTs in der Liste benötigt wird, und dem Sammeln des zurückgegebenen Datentyps für die Ergebniszeile, der nur für den ersten SELECT benötigt wird.

    Referenzen: #4787

  • [sql] [bug]

    Behob ein Problem, bei dem das interne Klonen von SELECT-Konstrukten zu einem Schlüsselwertfehler führen konnte, wenn die Kopie des SELECT seinen Zustand änderte, sodass sich seine Spaltenliste änderte. Dies trat in einigen ORM-Szenarien auf, die spezifisch für 1.3 und höher sein könnten, und ist daher teilweise eine Regression-Korrektur.

    Referenzen: #4780

postgresql

  • [postgresql] [usecase]

    Hinzugefügte neue Dialekt-Flagge für den psycopg2-Dialekt, executemany_mode, die die vorherige experimentelle use_batch_mode-Flagge ersetzt. executemany_mode unterstützt sowohl die „execute batch“- als auch die „execute values“-Funktionen von psycopg2, letztere wird für kompilierte insert()-Konstrukte verwendet. Pull-Request von Yuval Dinari.

    Referenzen: #4623

mysql

  • [mysql] [usecase]

    Hinzugefügte reservierte Wörter ARRAY und MEMBER zur Liste der reservierten Wörter von MySQL, da MySQL 8.0 diese nun reserviert hat.

    Referenzen: #4783

  • [mysql] [bug]

    Die MySQL-Dialekte geben am Anfang einer Verbindung „SET NAMES“ aus, wenn die Zeichensatzkodierung an den MySQL-Treiber übergeben wird, um ein offensichtliches Verhalten von MySQL 8.0 zu umgehen, das einen Kollisionsfehler auslöst, wenn ein UNION Zeichenketten-Spalten mit Spalten der Form CAST(NULL AS CHAR(..)) vereint, was die Funktion polymorphic_union von SQLAlchemy tut. Das Problem schien PyMySQL mindestens ein Jahr lang betroffen zu haben, ist aber seit mysqlclient 1.4.4 aufgrund von Änderungen in der Art und Weise, wie dieser DBAPI eine Verbindung herstellt, aufgetreten. Da die Anwesenheit dieser Direktive drei separate MySQL-Zeichensatzkodierungs-Einstellungen beeinflusst, die jeweils komplexe Auswirkungen auf Basis ihrer Anwesenheit haben, gibt SQLAlchemy die Direktive nun bei neuen Verbindungen aus, um das korrekte Verhalten zu gewährleisten.

    Referenzen: #4804

  • [mysql] [bug]

    Eine weitere Korrektur für ein Upstream-MySQL-8-Problem, bei dem ein Groß-/Kleinschreibung-sensitiver Tabellenname bei der Fremdschlüssel-Reflexion falsch gemeldet wird. Dies ist eine Erweiterung der Korrektur, die zuerst für #4344 hinzugefügt wurde und einen Groß-/Kleinschreibung-sensitiven Spaltennamen betrifft. Das neue Problem tritt bis MySQL 8.0.17 auf, sodass die allgemeine Logik der 88718-Korrektur erhalten bleibt.

    Siehe auch

    https://bugs.mysql.com/bug.php?id=96365 - Upstream-Bug

    Referenzen: #4751

sqlite

  • [sqlite] [bug]

    Die Dialekte, die JSON unterstützen, sollen Argumente json_serializer und json_deserializer auf der create_engine()-Ebene akzeptieren, jedoch nennt der SQLite-Dialekt sie _json_serializer und _json_deserilalizer. Die Namen wurden korrigiert, die alten Namen werden mit einer Warnung akzeptiert und diese Parameter werden nun als create_engine.json_serializer und create_engine.json_deserializer dokumentiert.

    Referenzen: #4798

  • [sqlite] [bug]

    Behob einen Fehler, bei dem die Verwendung von „PRAGMA table_info“ im SQLite-Dialekt dazu führte, dass Reflexionsfunktionen zur Erkennung der Tabellenexistenz, der Liste der Tabellenspalten und der Liste der Fremdschlüssel standardmäßig auf jede Tabelle in jeder angehängten Datenbank griffen, wenn kein Schemaname angegeben war und die Tabelle nicht im Basisschema existierte. Die Korrektur führt explizit PRAGMA für das Schema ‚main‘ und dann für das Schema ‚temp‘ aus, wenn ‚main‘ keine Zeilen zurückgegeben hat, um das Verhalten von Tabellen + temporären Tabellen im Namensraum „ohne Schema“ und angehängten Tabellen nur im Namensraum „Schema“ beizubehalten.

    Referenzen: #4793

mssql

  • [mssql] [usecase]

    Hinzugefügte neue try_cast()-Konstruktion für SQL Server, die die Syntax „TRY_CAST“ ausgibt. Pull-Request von Leonel Atencio.

    Referenzen: #4782

misc

  • [bug] [events]

    Behob ein Problem im Ereignissystem, bei dem die Verwendung der Flagge once=True mit dynamisch generierten Listener-Funktionen dazu führte, dass die Registrierung zukünftiger Ereignisse fehlschlug, wenn diese Listener-Funktionen nach ihrer Verwendung vom Garbage Collector eingesammelt wurden, aufgrund der Annahme, dass eine lauschende Funktion stark referenziert wird. Der „once“-Wrapper wurde nun modifiziert, um die innere Funktion dauerhaft stark zu referenzieren, und die Dokumentation wurde aktualisiert, dass die Verwendung von „once“ keine automatische Deregistrierung von Listener-Funktionen impliziert.

    Referenzen: #4794

1.3.6

Veröffentlicht: 21. Juli 2019

orm

  • [orm] [feature]

    Hinzugefügte neue Loader-Optionsmethode Load.options(), die es ermöglicht, Loader-Optionen hierarchisch zu konstruieren, sodass viele Unteroptionen auf einen bestimmten Pfad angewendet werden können, ohne defaultload() viele Male aufrufen zu müssen. Danke an Alessio Bogon für die Idee.

    Referenzen: #4736

  • [orm] [performance]

    Die Optimierung, die in #4340 für selectin-Laden angewendet wurde, bei der ein JOIN nicht benötigt wird, um verwandte Elemente eifrig zu laden, wird nun auch auf Many-to-One-Beziehungen angewendet, sodass nur die verwandte Tabelle für eine einfache JOIN-Bedingung abgefragt wird. In diesem Fall werden die verwandten Elemente basierend auf dem Wert einer Fremdschlüsselspalte des übergeordneten Objekts abgefragt; wenn diese Spalten verzögert sind oder anderweitig nicht auf einem der übergeordneten Objekte in der Sammlung geladen werden, fällt der Loader auf die JOIN-Methode zurück.

    Referenzen: #4775

  • [orm] [bug]

    Behob eine Regression, die durch #4365 verursacht wurde, bei der ein JOIN von einer Entität zu sich selbst ohne Aliase keine informative Fehlermeldung mehr auslöste, sondern bei einer Assertion fehlschlug. Die informative Fehlerbedingung wurde wiederhergestellt.

    Referenzen: #4773

  • [orm] [bug]

    Behob ein Problem, bei dem die Methode _ORMJoin.join(), eine nicht-intern verwendete ORM-Methode, die den normalerweise internen Prozess von Query.join() exponiert, die Schlüsselwörter full und outerjoin nicht korrekt weitergab. Pull-Request von Denis Kataev.

    Referenzen: #4713

  • [orm] [bug]

    Behob einen Fehler, bei dem eine Many-to-One-Beziehung, die uselist=True angab, bei einer Änderung des Primärschlüssels, bei der sich eine verwandte Spalte ändern musste, nicht korrekt aktualisiert wurde.

    Referenzen: #4772

  • [orm] [bug]

    Behob einen Fehler, bei dem die Erkennung von Many-to-One- oder One-to-One-Verwendung mit einer „dynamischen“ Beziehung, die eine ungültige Konfiguration ist, nicht auslöste, wenn die Beziehung mit uselist=True konfiguriert war. Die aktuelle Korrektur besteht darin, dass eine Warnung ausgegeben wird, anstatt einen Fehler auszulösen, da dies andernfalls rückwärtskompatibel wäre; in einer zukünftigen Version wird jedoch ein Fehler ausgelöst.

    Referenzen: #4772

  • [orm] [bug]

    Behob einen Fehler, bei dem ein Synonym, das gegen ein noch nicht vorhandenes zugeordnetes Attribut erstellt wurde, wie es der Fall ist, wenn es auf eine Backref verweist, bevor Mappers konfiguriert sind, Rekursionsfehler auslöste, wenn versucht wurde, Attribute darauf zu testen, die letztendlich nicht existieren (wie es bei der Verarbeitung von Klassen durch Sphinx Autodoc geschieht), da der unkonfigurierte Zustand des Synonyms es in eine Endlosschleife „Attribut nicht gefunden“ versetzen würde.

    Referenzen: #4767

engine

  • [engine] [bug]

    Behob einen Fehler, bei dem die Verwendung von Reflexionsfunktionen wie MetaData.reflect() mit einem Engine-Objekt, auf das Ausführungsoptionen angewendet wurden, fehlschlug, da das resultierende OptionEngine Proxy-Objekt kein Attribut .engine enthielt, das in den Reflexionsroutinen verwendet wurde.

    Referenzen: #4754

sql

  • [sql] [bug]

    Angepasste die Initialisierung für Enum, um zu minimieren, wie oft das Attribut .__members__ eines gegebenen PEP-435-Enumerationsobjekts aufgerufen wird, um Fälle zu berücksichtigen, in denen dieses Attribut teuer auszuführen ist, wie es bei einigen beliebten externen Enumerationsbibliotheken der Fall ist.

    Referenzen: #4758

  • [sql] [bug] [postgresql]

    Behob ein Problem, bei dem die array_agg-Konstruktion in Kombination mit FunctionElement.filter() nicht die korrekte Operatorrangfolge in Kombination mit dem Array-Index-Operator erzeugte.

    Referenzen: #4760

  • [sql] [bug]

    Behob ein unwahrscheinliches Problem, bei dem die Routine für die „korrespondierende Spalte“ für Unions und andere _selectable.CompoundSelect-Objekte in einigen überlappenden Spaltensituationen die falsche Spalte zurückgeben konnte, was möglicherweise einige ORM-Operationen beeinträchtigt, wenn Mengenoperationen verwendet werden, da ein zwischengespeicherter Wert nicht gelöscht wurde.

    Referenzen: #4747

postgresql

  • [postgresql] [usecase]

    Hinzugefügte Unterstützung für die Reflexion von Indizes auf PostgreSQL partitionierten Tabellen, die ab Version 11 zu PostgreSQL hinzugefügt wurde.

    Referenzen: #4771

  • [postgresql] [usecase]

    Hinzugefügte Unterstützung für mehrdimensionale Postgresql-Array-Literale durch Verschachtelung des array-Objekts innerhalb eines anderen. Der mehrdimensionale Array-Typ wird automatisch erkannt.

    Siehe auch

    array

    Referenzen: #4756

mysql

  • [mysql] [bug]

    Behob einen Fehler, bei dem die spezielle Logik zum Rendern von „NULL“ für den TIMESTAMP-Datentyp, wenn nullable=True war, nicht funktionierte, wenn der Datentyp der Spalte ein TypeDecorator oder ein Variant war. Die Logik stellt nun sicher, dass sie bis zum ursprünglichen TIMESTAMP entpackt wird, damit dieses spezielle NULL-Schlüsselwort korrekt gerendert wird, wenn es angefordert wird.

    Referenzen: #4743

  • [mysql] [bug]

    Verbesserte das Parsen von MySQL/MariaDB-Versionsstrings, um exotische MariaDB-Versionsstrings zu berücksichtigen, bei denen das Wort „MariaDB“ in andere alphanumerische Zeichen eingebettet ist, wie z. B. „MariaDBV1“. Diese Erkennung ist entscheidend, um API-Funktionen, die zwischen MySQL und MariaDB aufgeteilt wurden, wie die Systemvariable „transaction_isolation“, korrekt zu berücksichtigen.

    Referenzen: #4624

sqlite

  • [sqlite] [usecase]

    Hinzugefügte Unterstützung für zusammengesetzte (Tupel) IN-Operatoren mit SQLite, indem das VALUES-Schlüsselwort für dieses Backend gerendert wird. Da andere Backends wie DB2 bekannt dafür sind, die gleiche Syntax zu verwenden, wird die Syntax im Basiscompiler über eine Dialekt-Flagge tuple_in_values aktiviert. Die Änderung umfasst auch die Unterstützung für „leere IN-Tupel“-Ausdrücke für SQLite, wenn „in_()“ zwischen einem Tupelwert und einer leeren Menge verwendet wird.

    Referenzen: #4766

mssql

  • [mssql] [bug]

    Sichergestellt, dass die Abfragen zur Reflexion von Indizes und Ansichtdefinitionen explizit String-Parameter in NVARCHAR CASTen, da viele SQL Server-Treiber Zeichenkettenwerte, insbesondere solche mit Nicht-ASCII-Zeichen oder längere Zeichenkettenwerte, häufig als TEXT behandeln, was aus irgendeinem Grund oft nicht korrekt mit VARCHAR-Zeichen in den Information-Schema-Tabellen von SQL Server verglichen wird. Diese CAST-Operationen finden bereits für Reflexionsabfragen gegen information_schema.-Tabellen von SQL Server statt, fehlten jedoch in drei zusätzlichen Abfragen, die gegen sys.-Tabellen gerichtet sind.

    Referenzen: #4745

1.3.5

Veröffentlicht: 17. Juni 2019

orm

  • [orm] [bug]

    Behob eine Reihe verwandter Fehler bezüglich joined table inheritance, die mehr als zwei Ebenen tief waren, in Verbindung mit der Änderung von Primärschlüsselwerten, wobei diese Primärschlüsselspalten auch in einer Fremdschlüsselbeziehung verknüpft sind, wie es für joined table inheritance typisch ist. Die Zwischen-Tabelle in einer dreistufigen Vererbungshierarchie erhält nun ein UPDATE, wenn sich nur der Primärschlüsselwert geändert hat und passive_updates=False (z. B. Fremdschlüssel-Constraints werden nicht erzwungen), während sie zuvor übersprungen wurde; ebenso wird bei passive_updates=True (z. B. ON UPDATE CASCADE in Kraft) die Drittstufen-Tabelle kein UPDATE-Statement erhalten, wie es zuvor der Fall war und zu einem Fehler führen würde, da CASCADE es bereits geändert hat. In einem verwandten Problem wird eine Beziehung, die über den Primärschlüssel einer Zwischen-Tabelle einer joined-inheritance-Hierarchie mit einer dreistufigen Vererbungshierarchie verknüpft ist, ebenfalls korrekt ihre Fremdschlüsselspalte aktualisieren, wenn der Primärschlüssel des übergeordneten Objekts geändert wird, auch wenn dieses übergeordnete Objekt eine Unterklasse der verknüpften übergeordneten Klasse ist, während diese Klassen zuvor nicht gezählt wurden.

    Referenzen: #4723

  • [orm] [bug]

    Behob einen Fehler, bei dem der Zugriff Mapper.all_orm_descriptors einen Eintrag für den Mapper selbst unter dem deklarativen Schlüssel __mapper__ zurückgab, obwohl dies kein Deskriptor ist. Das Flag .is_attribute, das auf allen InspectionAttr-Objekten vorhanden ist, wird nun konsultiert, was auch für einen Assoziationsproxy auf True gesetzt wurde, da es zuvor fälschlicherweise auf False für dieses Objekt gesetzt war.

    Referenzen: #4729

  • [orm] [bug]

    Behob eine Regression in Query.join(), bei der das Flag aliased=True die Klauselanpassung für Filterkriterien nicht richtig anwandte, wenn zuvor ein Join zur selben Entität durchgeführt wurde. Dies lag daran, dass die Adapter in der falschen Reihenfolge platziert waren. Die Reihenfolge wurde umgekehrt, sodass der Adapter des zuletzt aufgerufenen aliased=True Aufrufs Vorrang hat, wie es in 1.2 und früheren Versionen der Fall war. Dies brach unter anderem die „elementtree“-Beispiele.

    Referenzen: #4704

  • [orm] [bug] [py3k]

    Ersetzte die Python-Kompatibilitätsroutinen für getfullargspec() durch eine vollständig integrierte Version von Python 3.3. Ursprünglich gab Python in Python 3.8-Alphas Deprecation-Warnungen für diese Funktion aus. Obwohl diese Änderung rückgängig gemacht wurde, wurde festgestellt, dass Python 3-Implementierungen für getfullargspec() ab der Serie 3.4, wo sie gegen Signature neu geschrieben wurde, um eine Größenordnung langsamer sind. Während Python plant, diese Situation zu verbessern, verwenden SQLAlchemy-Projekte vorerst eine einfache Ersetzung, um zukünftige Probleme zu vermeiden.

    Referenzen: #4674

  • [orm] [bug]

    Überarbeitete die Attributmechanismen, die von AliasedClass verwendet werden, sodass nicht mehr __getattribute__ auf dem MRO der umschlossenen Klasse aufgerufen wird. Stattdessen wird das Attribut normal auf der umschlossenen Klasse mittels getattr() aufgelöst und dann entpackt/angepasst. Dies ermöglicht eine größere Bandbreite von Attributstilen auf der zugeordneten Klasse, einschließlich spezieller __getattr__()-Schemata; es macht den Code aber auch im Allgemeinen einfacher und robuster.

    Referenzen: #4694

sql

  • [sql] [bug]

    Behandelte eine Reihe von Problemen bei der Anführungszeichensetzung, die aus der Verwendung des Konstrukts literal_column`() resultierten. Wenn dieses Konstrukt über eine Unterabfrage "proxy-fähig" gemacht und mit einem Label referenziert wurde, das mit seinem Text übereinstimmte, wurden auf das Label keine Anführungszeichenregeln angewendet, selbst wenn der String im Label mithilfe eines quoted_name`-Konstrukts eingerichtet wurde. Das Nichtanwenden von Anführungszeichen auf den Text des Label ist ein Fehler, da dieser Text streng genommen ein SQL-Bezeichnername und keine SQL-Expression ist und der String nicht bereits Anführungszeichen enthalten sollte, im Gegensatz zu literal_column(), auf das er angewendet werden kann. Das bestehende Verhalten eines nicht beschrifteten literal_column(), das unverändert außerhalb einer Unterabfrage weitergegeben wird, wird beibehalten, um manuelle Anführungszeichenschemata zu unterstützen, obwohl unklar ist, ob für ein solches Konstrukt in jedem Fall gültiges SQL generiert werden kann.

    Referenzen: #4730

postgresql

  • [postgresql] [usecase]

    Unterstützung für Spaltensortierungsflags beim Reflektieren von Indizes für PostgreSQL hinzugefügt, einschließlich ASC, DESC, NULLSFIRST, NULLS LAST. Dies erweitert auch das Reflexionssystem im Allgemeinen, das in zukünftigen Versionen auf andere Dialekte angewendet werden kann. Pull Request von Eli Collins.

    Referenzen: #4717

  • [postgresql] [bug]

    Behobenen Fehler, bei dem der PostgreSQL-Dialekt einen ENUM-Datentyp ohne Mitglieder nicht korrekt reflektieren konnte, indem eine Liste mit None für den Aufruf get_enums() zurückgegeben und ein TypeError beim Reflektieren einer Spalte mit einem solchen Datentyp ausgelöst wurde. Die Inspektion gibt nun eine leere Liste zurück.

    Referenzen: #4701

mysql

  • [mysql] [bug]

    Behobenen Fehler, bei dem MySQL ON DUPLICATE KEY UPDATE das Setzen einer Spalte auf den Wert NULL nicht unterstützte. Pull Request von Lukáš Banič.

    Referenzen: #4715

1.3.4

Veröffentlicht: 27. Mai 2019

orm

  • [orm] [bug]

    Behobenen Problem, bei dem das Flag AttributeEvents.active_history für einen Ereignis-Listener, der über das Flag AttributeEvents.propagate an eine Unterklasse weitergegeben wurde, nicht gesetzt wurde. Dieser Fehler bestand während der gesamten Lebensdauer des AttributeEvents-Systems.

    Referenzen: #4695

  • [orm] [bug]

    Behobenen Regression, bei der das neue Assoziations-Proxy-System immer noch keine Hybrid-Attribute proxyte, wenn diese den Dekorator @hybrid_property.expression verwendeten, um eine alternative SQL-Expression zurückzugeben, oder wenn das Hybrid-Objekt ein beliebiges PropComparator auf Expressionsebene zurückgab. Dies beinhaltete eine weitere Verallgemeinerung der Heuristiken zur Erkennung des proxyten Objekttyps auf Ebene von QueryableAttribute, um besser zu erkennen, ob der Deskriptor letztendlich zu gemappten Klassen oder Spalten-Expressions dient.

    Referenzen: #4690

  • [orm] [bug]

    Den Mapper „configure mutex“ auf den deklarativen Klassenmapping-Prozess angewendet, um den Wettlauf zu verhindern, der auftreten kann, wenn Mapper verwendet werden, während dynamische Modulimportschemata noch dabei sind, Mapper für zugehörige Klassen zu konfigurieren. Dies schützt nicht vor allen möglichen Wettlaufbedingungen, z. B. wenn der gleichzeitige Import die abhängigen Klassen noch nicht angetroffen hat, schützt jedoch so weit wie möglich innerhalb des SQLAlchemy-Deklarationsprozesses.

    Referenzen: #4686

  • [orm] [bug]

    Eine Warnung wird nun für den Fall ausgegeben, dass ein transientes Objekt mit Session.merge() in die Sitzung zusammengeführt wird, wenn dieses Objekt bereits in der Session transient ist. Dies warnt vor dem Fall, dass das Objekt normalerweise doppelt eingefügt würde.

    Referenzen: #4647

  • [orm] [bug]

    Behobenen Regression in der neuen Logik für den Vergleich von Many-to-One-Beziehungen, die erstmals in Verbesserung des Verhaltens von Many-to-One-Query-Expressions eingeführt wurde, beim Vergleich mit einem Attribut, das als NULL gespeichert ist und sich im Zustand „nicht abgerufen“ in der gemappten Instanz befindet. Da das Attribut keinen expliziten Standardwert hat, muss es standardmäßig NULL sein, wenn es in einer persistenten Einstellung aufgerufen wird.

    Referenzen: #4676

engine

  • [engine] [bug] [postgresql]

    Der „Rollback“, der während der Dialektinitialisierung auftritt, wurde verschoben, sodass er nach zusätzlichen dialektspezifischen Initialisierungsschritten erfolgt, insbesondere denen des psycopg2-Dialekts, die versehentlich Transaktionsstatus auf der ersten neuen Verbindung hinterließen, was einige psycopg2-spezifische APIs beeinträchtigen könnte, die erfordern, dass keine Transaktion gestartet wird. Pull Request von Matthew Wilkes.

    Referenzen: #4663

sql

  • [sql] [bug]

    Behobenen Fehler, dass die Klasse GenericFunction sich selbst versehentlich als eine der benannten Funktionen registrierte. Pull Request von Adrien Berchet.

    Referenzen: #4653

  • [sql] [bug]

    Behobenen Problem, bei dem die doppelte Negation einer booleschen Spalte den „NOT“-Operator nicht zurückgesetzt hätte.

    Referenzen: #4618

  • [sql] [bug]

    Der Namespace GenericFunction wird migriert, sodass Funktionsnamen fallunabhängig gesucht werden, da SQL-Funktionen keine Kollisionen aufgrund von Fallunterschieden aufweisen und dies auch bei benutzerdefinierten Funktionen oder gespeicherten Prozeduren nicht der Fall ist. Suchen nach Funktionen, die mit GenericFunction deklariert wurden, verwenden nun ein fallunabhängiges Schema. Es wird jedoch ein Deprecationsfall unterstützt, der es ermöglicht, dass zwei oder mehr GenericFunction-Objekte mit demselben Namen, aber unterschiedlicher Groß- und Kleinschreibung existieren. Dies führt dazu, dass für diesen spezifischen Namen fallabhängige Suchen durchgeführt werden, während bei der Registrierung der Funktion eine Warnung ausgegeben wird. Vielen Dank an Adrien Berchet für die umfangreiche Arbeit an diesem komplexen Feature.

    Referenzen: #4569

postgresql

  • [postgresql] [bug] [orm]

    Behobenen Problem, bei dem die Warnung „Anzahl der übereinstimmenden Zeilen“ auch dann ausgegeben wurde, wenn der Dialekt „supports_sane_multi_rowcount=False“ meldete, was bei psycogp2 mit use_batch_mode=True und anderen der Fall ist.

    Referenzen: #4661

mysql

  • [mysql] [bug]

    Unterstützung für DROP CHECK-Constraint hinzugefügt, das für MySQL 8.0.16 zum Löschen eines CHECK-Constraints erforderlich ist; MariaDB unterstützt Plain DROP CONSTRAINT. Die Logik unterscheidet zwischen den beiden Syntaxen, indem sie die Serverversionszeichenfolge auf die Anwesenheit von MariaDB prüft. Alembic-Migrationen hatten dieses Problem bereits durch die Implementierung eines eigenen DROP für MySQL / MariaDB CHECK-Constraints umgangen. Diese Änderung implementiert es nun direkt in Core, sodass es allgemein verfügbar ist. Pull Request von Hannes Hansen.

    Referenzen: #4650

mssql

  • [mssql] [feature]

    Unterstützung für SQL Server gefilterte Indizes hinzugefügt, über den Parameter mssql_where, der ähnlich wie die postgresql_where-Indexfunktion im PostgreSQL-Dialekt funktioniert.

    Siehe auch

    Gefilterte Indizes

    Referenzen: #4657

  • [mssql] [bug]

    Fehlercode 20047 zu „is_disconnect“ für pymssql hinzugefügt. Pull Request von Jon Schuff.

    Referenzen: #4680

misc

  • [misc] [bug]

    Das fehlerhafte Symbol „sqla_nose.py“ aus MANIFEST.in entfernt, das eine unerwünschte Warnmeldung erzeugte.

    Referenzen: #4625

1.3.3

Veröffentlicht: 15. April 2019

orm

  • [orm] [bug]

    Behobenen 1.3-Regression in der neuen Abfrage-Logik für „mehrdeutige FROMs“, die in Query.join() behandelt Mehrdeutigkeit bei der Entscheidung der „linken“ Seite expliziter eingeführt wurde, bei der eine Query, die eine Entität explizit mit Query.select_from() in die FROM-Klausel einfügt und sich auch mit Query.join() mit dieser verbindet, später eine „mehrdeutige FROM“-Fehlermeldung verursachen würde, wenn diese Entität in zusätzlichen Joins verwendet würde, da die Entität zweimal in der „from“-Liste der Query erscheint. Die Korrektur löst diese Mehrdeutigkeit, indem die eigenständige Entität in den Join, zu dem sie bereits gehört, eingefügt wird, so wie es letztendlich geschieht, wenn die SELECT-Anweisung gerendert wird.

    Referenzen: #4584

  • [orm] [bug]

    Die Methode Query.filter_by() wurde so angepasst, dass sie nicht intern and() gegen mehrere Kriterien aufruft, sondern diese als Reihe von Kriterien an Query.filter() übergibt, anstatt als ein einzelnes Kriterium. Dies ermöglicht Query.filter_by(), die Behandlung von variablen Klauseln durch Query.filter() zu übernehmen, einschließlich des Falls, in dem die Liste leer ist. In diesem Fall hat das Query-Objekt keine .whereclause, was nachfolgenden Methoden ohne whereclause wie Query.select_from() ermöglicht, konsistent zu arbeiten.

    Referenzen: #4606

postgresql

  • [postgresql] [bug]

    Behobenen Regression aus Version 1.3.2, verursacht durch #4562, bei der eine URL, die nur eine Query-Zeichenfolge und keinen Hostnamen enthielt, wie z. B. zur Angabe einer Service-Datei mit Verbindungsinformationen, nicht mehr ordnungsgemäß an psycopg2 weitergegeben wurde. Die Änderung in #4562 wurde angepasst, um den genauen Anforderungen von psycopg2 besser gerecht zu werden, nämlich dass, wenn überhaupt Verbindungsparameter vorhanden sind, der Parameter „dsn“ nicht mehr erforderlich ist. In diesem Fall werden die Query-String-Parameter allein übergeben.

    Referenzen: #4601

mssql

  • [mssql] [bug]

    Behobenen Problem im SQL Server-Dialekt, bei dem, wenn ein gebundener Parameter in einer ORDER BY-Expression vorhanden war, die letztendlich nicht in der SQL Server-Version der Anweisung gerendert wurde, die Parameter dennoch Teil der Ausführungsparameter waren, was zu DBAPI-Fehlern führte. Pull Request von Matt Lewellyn.

    Referenzen: #4587

misc

  • [bug] [pool]

    Behobenen Verhaltensregression infolge der Deprekation des Flags „use_threadlocal“ für Pool, bei der SingletonThreadPool diese Option nicht mehr verwendet, was dazu führt, dass die Logik „Rollback bei Rückgabe“ stattfindet, wenn dasselbe Engine mehrmals im Kontext einer Transaktion verwendet wird, um eine Verbindung herzustellen oder implizit auszuführen, wodurch die Transaktion abgebrochen wird. Obwohl dies nicht der empfohlene Weg ist, mit Engines und Verbindungen zu arbeiten, handelt es sich dennoch um eine verwirrende Verhaltensänderung, da bei Verwendung von SingletonThreadPool die Transaktion offen bleiben sollte, unabhängig davon, was sonst mit derselben Engine im selben Thread geschieht. Das Flag use_threadlocal ist weiterhin veraltet, jedoch implementiert SingletonThreadPool nun eine eigene Version derselben Logik.

    Referenzen: #4585

  • [bug] [ext]

    Behobenen Fehler, bei dem die Verwendung von copy.copy() oder copy.deepcopy() auf MutableList dazu führte, dass die Elemente in der Liste dupliziert wurden, aufgrund einer Inkonsistenz in der Art und Weise, wie Python Pickle und Copy beide __getstate__() und __setstate__() bezüglich Listen verwenden. Um dies zu beheben, musste eine __reduce_ex__-Methode zu MutableList hinzugefügt werden. Um die Abwärtskompatibilität mit bestehenden Pickle-Objekten, die auf __getstate__() basieren, zu gewährleisten, bleibt die __setstate__()-Methode ebenfalls erhalten; die Testsuite stellt sicher, dass Pickle-Objekte, die mit der alten Version der Klasse erstellt wurden, immer noch vom Pickle-Modul deserialisiert werden können.

    Referenzen: #4603

1.3.2

Veröffentlicht: 2. April 2019

orm

  • [orm] [bug] [ext]

    Instanzebene Unterstützung für einfache Python-Deskriptoren, z. B. @property-Objekte, in Verbindung mit Assoziations-Proxys wiederhergestellt, sodass, wenn das proxyte Objekt überhaupt nicht im ORM-Geltungsbereich liegt, es als „mehrdeutig“ klassifiziert wird, aber direkt proxyed wird. Für den Zugriff auf Klassenebene gibt ein grundlegendes Klassen-Level``__get__()`` nun direkt AmbiguousAssociationProxyInstance zurück, anstatt seine Ausnahme auszulösen, was die engste Annäherung an das vorherige Verhalten ist, das AssociationProxy selbst zurückgab, die möglich ist. Außerdem wurde die Stringifizierung dieser Objekte verbessert, um den aktuellen Zustand genauer zu beschreiben.

    Referenzen: #4573, #4574

  • [orm] [bug]

    Behobenen Fehler, bei dem die Verwendung von with_polymorphic() oder anderen aliasen Konstrukten nicht ordnungsgemäß angepasst wurde, wenn das aliase Ziel als Select.correlate_except()-Ziel einer Unterabfrage innerhalb einer column_property() verwendet wurde. Dies erforderte eine Korrektur der Klauselanpassungsmechanismen, um ein wählbares Element, das in der Liste „correlate except“ erscheint, ordnungsgemäß zu behandeln, ähnlich wie bei wählbaren Elementen, die in der Liste „correlate“ erscheinen. Dies ist letztendlich ein ziemlich grundlegender Fehler, der schon lange besteht, aber schwer zu finden ist.

    Referenzen: #4537

  • [orm] [bug]

    Behobenen Regression, bei der eine neue Fehlermeldung, die beim Versuch, eine Beziehungsoption mit einer AliasedClass ohne Verwendung von PropComparator.of_type() zu verknüpfen, ausgelöst werden sollte, stattdessen einen AttributeError auslöste. Beachten Sie, dass es in 1.3 nicht mehr zulässig ist, einen Optionspfad von einer einfachen Mapper-Beziehung zu einer AliasedClass zu erstellen, ohne PropComparator.of_type() zu verwenden.

    Referenzen: #4566

sql

  • [sql] [bug] [documentation]

    Dank TypeEngine-Methoden bind_expression, column_expression arbeiten mit Variant, typspezifischen Typen müssen wir uns nicht mehr auf Rezepte verlassen, die direkt von dialektspezifischen Typen abgeleitet sind. TypeDecorator kann nun alle Fälle behandeln. Zusätzlich erschwerte die obige Änderung die direkte Ableitung von einem Basis-SQLAlchemy-Typ, was irreführend sein konnte. Die Dokumentation wurde aktualisiert, um TypeDecorator für diese Beispiele zu verwenden, einschließlich des PostgreSQL „ArrayOfEnum“-Beispieldatentyps, und die direkte Unterstützung für das „Ableiten eines Typs direkt“ wurde entfernt.

    Referenzen: #4580

postgresql

  • [postgresql] [feature]

    Unterstützung für parameterlose Verbindungs-URLs für den psycopg2-Dialekt hinzugefügt. Das bedeutet, die URL kann an create_engine() als "postgresql+psycopg2://" ohne zusätzliche Argumente übergeben werden, um ein leeres DSN an libpq anzuzeigen, was eine Verbindung zu „localhost“ ohne Benutzername, Passwort oder Datenbank bedeutet. Pull Request von Julian Mehnle.

    Referenzen: #4562

  • [postgresql] [bug]

    Den Parameter Select.with_for_update.of modifiziert, sodass, wenn ein Join oder ein anderes zusammengesetztes wählbares Element übergeben wird, die einzelnen Table-Objekte daraus gefiltert werden. Dies ermöglicht die Übergabe eines Join()-Objekts an den Parameter, wie es normalerweise bei der Verwendung von joined table inheritance mit dem ORM geschieht. Pull Request von Raymond Lu.

    Referenzen: #4550

1.3.1

Veröffentlicht: 9. März 2019

orm

  • [orm] [bug] [ext]

    Behobenen Regression, bei der ein mit einem Synonym verknüpfter Assoziations-Proxy nicht mehr funktionierte, sowohl auf Instanz- als auch auf Klassenebene.

    Referenzen: #4522

mssql

  • [mssql] [bug]

    Ein Commit() wird nach einer Änderung des Isolationsgrads auf SNAPSHOT ausgegeben, da sowohl pyodbc als auch pymssql eine implizite Transaktion öffnen, die nachfolgende SQL-Anweisungen in der aktuellen Transaktion blockiert.

    Diese Änderung wird auch **zurückportiert** auf: 1.2.19

    Referenzen: #4536

  • [mssql] [bug]

    Behobenen Regression in der SQL Server-Reflexion aufgrund von #4393, bei der die Entfernung von offenen **kw aus dem Float-Datentyp die Reflexion dieses Typs aufgrund eines übergebenen „scale“-Arguments zum Fehlschlag brachte.

    Referenzen: #4525

1.3.0

Veröffentlicht: 4. März 2019

orm

  • [orm] [feature]

    Die Methode Query.get() kann nun ein Dictionary von Attributschlüsseln und -werten als Mittel zur Angabe des zu ladenden Primärschlüsselwerts akzeptieren; dies ist besonders nützlich für zusammengesetzte Primärschlüssel. Pull Request von Sanjana S.

    Referenzen: #4316

  • [orm] [feature]

    Eine SQL-Expression kann nun einem Primärschlüsselattribut für einen ORM-Flush auf die gleiche Weise zugewiesen werden wie normale Attribute, wie in Einbettung von SQL INSERT/UPDATE-Expressions in einen Flush beschrieben, wo die Expression ausgewertet und dann über RETURNING an das ORM zurückgegeben wird, oder im Fall von pysqlite funktioniert sie über das Attribut cursor.lastrowid. Erfordert entweder eine Datenbank, die RETURNING unterstützt (z. B. Postgresql, Oracle, SQL Server), oder pysqlite.

    Referenzen: #3133

engine

  • [engine] [feature]

    Die Formatierung für StatementError bei der Stringifizierung wurde überarbeitet. Jedes Fehlerdetail wird auf mehrere Zeilen aufgeteilt, anstatt auf einer einzigen Zeile angeordnet zu sein. Zusätzlich rendert die SQL-Darstellung nun die SQL-Anweisung als String und verwendet nicht repr(), sodass neue Zeilen wie sie sind gerendert werden. Pull Request von Nate Clark.

    Referenzen: #4500

sql

  • [sql] [bug]

    Die Klasse Alias und verwandte Unterklassen wie CTE, Lateral und TableSample wurden überarbeitet, sodass es nicht mehr möglich ist, die Objekte direkt zu konstruieren. Diese Konstrukte erfordern die Verwendung der Standalone-Konstruktionsfunktion oder der wählbaren Methode, um neue Objekte zu instanziieren.

    Referenzen: #4509

schema

  • [schema] [feature]

    Neue Parameter Table.resolve_fks und MetaData.reflect.resolve_fks hinzugefügt, die, wenn auf False gesetzt, die automatische Reflexion von verwandten Tabellen, die in ForeignKey-Objekten angetroffen werden, deaktivieren. Dies kann sowohl den SQL-Overhead für weggelassene Tabellen reduzieren als auch Tabellen vermeiden, die aus datenbankspezifischen Gründen nicht reflektiert werden können. Zwei Table-Objekte, die sich in derselben MetaData-Sammlung befinden, können immer noch aufeinander verweisen, auch wenn die Reflexion der beiden Tabellen separat erfolgte.

    Referenzen: #4517

1.3.0b3

Veröffentlicht: 8. Februar 2019

orm

  • [orm] [bug]

    Das Verhalten von with_polymorphic() in Verbindung mit Loader-Optionen, insbesondere mit Wildcard-Operationen sowie load_only(), wurde verbessert. Das polymorphe Objekt wird genauer adressiert, sodass spaltenbasierte Optionen für die Entität korrekt greifen. Das Problem ist eine Fortsetzung derselben Art von Korrekturen, die in #4468 vorgenommen wurden.

    Referenzen: #4469

orm declarative

  • [orm] [declarative] [bug]

    Einige Hilfsexzeptionsklassen wurden hinzugefügt, die ausgelöst werden, wenn eine Abbildung basierend auf AbstractConcreteBase, DeferredReflection oder AutoMap verwendet wird, bevor die Abbildung bereit ist, verwendet zu werden. Diese Ausnahmen enthalten aussagekräftige Informationen über die Klasse, anstatt in andere weniger aussagekräftige Fehlermodi zu fallen.

    Referenzen: #4470

sql

  • [sql] [bug]

    Das Verhalten, dass Strings, die direkt als Komponenten eines select()- oder Query-Objekts übergeben werden, automatisch zu text()-Konstrukten koerziert wird, wurde vollständig entfernt. Die bisher ausgegebene Warnung ist nun ein ArgumentError oder im Falle von order_by() / group_by() ein CompileError. Dies hat seit Version 1.0 eine Warnung ausgegeben, aber seine Existenz birgt weiterhin Bedenken hinsichtlich des Missbrauchs dieses Verhaltens.

    Beachten Sie, dass für order_by() / group_by() öffentliche CVEs veröffentlicht wurden, die durch diesen Commit behoben werden: CVE-2019-7164 CVE-2019-7548

    Referenzen: #4481

  • [sql] [bug]

    Das Quoting wird auf Function-Namen angewendet, die üblicherweise, aber nicht notwendigerweise, aus dem sqlalchemy.sql.expression.func-Konstrukt generiert werden, zur Kompilierungszeit, wenn sie illegale Zeichen wie Leerzeichen oder Satzzeichen enthalten. Die Namen werden wie bisher als nicht case-sensitiv behandelt, was bedeutet, dass das alleinige Vorhandensein von Groß- oder gemischten Groß-/Kleinschreibungszeichen kein Quoting auslöst. Die Nicht-Case-Sensitivität wird derzeit aus Kompatibilitätsgründen beibehalten.

    Referenzen: #4467

  • [sql] [bug]

    „SQL-Phrasengültigkeitsprüfung“ wurde zu wichtigen DDL-Phrasen hinzugefügt, die als einfache Strings akzeptiert werden, darunter ForeignKeyConstraint.on_delete, ForeignKeyConstraint.on_update, ExcludeConstraint.using, ForeignKeyConstraint.initially, für Bereiche, in denen nur eine Reihe von SQL-Schlüsselwörtern erwartet wird. Alle Nicht-Leerzeichen-Zeichen, die darauf hindeuten, dass die Phrase gequotet werden müsste, lösen einen CompileError aus. Diese Änderung steht im Zusammenhang mit der Reihe von Änderungen, die im Rahmen von #4481 vorgenommen wurden.

    Referenzen: #4481

postgresql

  • [postgresql] [bug]

    Problem behoben, bei dem die Verwendung eines Großbuchstaben-Namens für einen Indextyp (z. B. GIST, BTREE usw.) oder eine EXCLUDE-Beschränkung diesen als zu quotierenden Bezeichner behandelte, anstatt ihn so auszugeben, wie er ist. Das neue Verhalten wandelt diese Typen in Kleinbuchstaben um und stellt sicher, dass sie nur gültige SQL-Zeichen enthalten.

    Referenzen: #4473

tests

  • [tests] [change]

    Das Testsystem hat die Unterstützung für Nose entfernt, das seit mehreren Jahren nicht mehr gewartet wird und unter Python 3 Warnungen erzeugt. Die Testsuite ist derzeit auf Pytest standardisiert. Pull-Request von Parth Shandilya.

    Referenzen: #4460

misc

  • [bug] [ext]

    Eine umfassendere Zuweisungsoperation (z. B. „Bulk-Replace“) wurde implementiert, wenn ein Association Proxy mit Sets oder Dictionaries verwendet wird. Behebt das Problem, dass redundante Proxy-Objekte erstellt werden, um die alten zu ersetzen, was zu übermäßigen Ereignissen und SQL führt und im Falle von Unique Constraints dazu führt, dass der Flush fehlschlägt.

    Referenzen: #2642

1.3.0b2

Veröffentlicht: 25. Januar 2019

general

  • [general] [change]

    Eine umfangreiche Änderung in der gesamten Bibliothek hat sichergestellt, dass alle als veraltet oder Legacy gekennzeichneten Objekte, Parameter und Verhaltensweisen nun DeprecationWarning-Warnungen ausgeben, wenn sie aufgerufen werden. Da der Python 3 Interpreter standardmäßig Deprecation Warnings anzeigt und moderne Test-Frameworks wie tox und pytest dazu neigen, Deprecation Warnings anzuzeigen, sollte diese Änderung es einfacher machen, veraltete API-Features zu erkennen. Ein Hauptgrund für diese Änderung ist, dass lang veraltete Features, die dennoch weiterhin in der Praxis verwendet werden, in naher Zukunft endlich entfernt werden können; das größte Beispiel hierfür sind die Klassen SessionExtension und MapperExtension sowie eine Handvoll anderer Pre-Event-Extension-Hooks, die seit Version 0.7 veraltet sind, aber immer noch in der Bibliothek vorhanden sind. Ein weiterer Grund ist, dass mehrere langjährige Hauptverhaltensweisen ebenfalls als veraltet gekennzeichnet werden, darunter die Thread-Local-Engine-Strategie, das convert_unicode-Flag und Non-Primary-Mappers.

    Referenzen: #4393

orm

  • [orm] [feature]

    Eine neue Funktion wurde implementiert, bei der der AliasedClass-Konstrukt nun als Ziel einer relationship() verwendet werden kann. Dies macht das Konzept der „Non-Primary-Mappers“ überflüssig, da die AliasedClass einfacher zu konfigurieren ist und automatisch alle Beziehungen der abgebildeten Klasse erbt, während die Möglichkeit für Loader-Optionen, normal zu funktionieren, erhalten bleibt.

    Referenzen: #4423

  • [orm] [feature]

    Ein neues Ereignis MapperEvents.before_mapper_configured() wurde hinzugefügt. Dieses Ereignis ergänzt die anderen „configure“-Stage Mapper-Ereignisse mit einem per-Mapper-Ereignis, das jeden Mapper kurz vor seinem Konfigurationsschritt empfängt und zusätzlich verwendet werden kann, um die Konfiguration bestimmter Mapper-Objekte durch einen neuen Rückgabewert interfaces.EXT_SKIP zu verhindern oder zu verzögern. Siehe den Dokumentationslink für ein Beispiel.

    Referenzen: #4397

  • [orm] [change]

    Eine neue Funktion close_all_sessions() wurde hinzugefügt, die die Aufgabe der Methode Session.close_all() übernimmt, die nun als veraltet gilt, da sie als Klassenmethode verwirrend ist. Pull-Request von Augustin Trancart.

    Referenzen: #4412

  • [orm] [bug]

    Langjähriges Problem behoben, bei dem doppelte Sammlungsmitglieder dazu führten, dass ein Backref die Verbindung zwischen dem Mitglied und seinem übergeordneten Objekt löschte, wenn eines der Duplikate entfernt wurde, was als Nebeneffekt des Austauschs zweier Objekte in einer Anweisung geschah.

    Referenzen: #1103

  • [orm] [bug]

    Die Korrektur, die erstmals im Rahmen von #3287 vorgenommen wurde, bei der eine auf einer Unterklasse mit einem Wildcard angewendete Loader-Option sich selbst erweiterte, um die Anwendung des Wildcards auch auf Attribute der Oberklassen auszudehnen, wurde nun auf eine „gebundene“ Loader-Option erweitert, z. B. in einem Ausdruck wie Load(SomeSubClass).load_only('foo'). Spalten, die Teil der Oberklasse von SomeSubClass sind, werden ebenfalls auf die gleiche Weise ausgeschlossen, als ob die ungebundene Option load_only('foo') verwendet worden wäre.

    Referenzen: #4373

  • [orm] [bug]

    Verbesserte Fehlermeldungen, die vom ORM im Bereich der Loader-Options-Traversal ausgegeben werden. Dies beinhaltet die frühzeitige Erkennung von nicht übereinstimmenden Loader-Strategien sowie eine klarere Erklärung, warum diese Strategien nicht übereinstimmen.

    Referenzen: #4433

  • [orm] [bug]

    Das „remove“-Ereignis für Sammlungen wird nun vor dem Entfernen des Elements aufgerufen, im Falle der Methode collection.remove(), wie es für die meisten anderen Formen der Entfernung von Sammlungs-Elementen konsistent ist (wie z. B. __delitem__, Ersetzung unter __setitem__). Für pop()-Methoden wird das remove-Ereignis immer noch nach der Operation ausgelöst.

  • [orm] [bug] [engine]

    Zugriffsmethoden für Ausführungsoptionen wurden zu Core und ORM hinzugefügt, über Query.get_execution_options(), Connection.get_execution_options(), Engine.get_execution_options() und Executable.get_execution_options(). PR von Daniel Lister.

    Referenzen: #4464

  • [orm] [bug]

    Problem bei Association Proxy behoben, das aufgrund von #3423 dazu führte, dass die Verwendung von benutzerdefinierten PropComparator-Objekten mit Hybrid-Attributen, wie dem im Beispiel dictlike-polymorphic gezeigten, innerhalb eines Association Proxy nicht funktionierte. Die in #3423 hinzugefügte Striktheit wurde gelockert, und zusätzliche Logik zur Berücksichtigung eines Association Proxy, der auf einen benutzerdefinierten Hybrid verweist, wurde hinzugefügt.

    Referenzen: #4446

  • [orm] [bug]

    Die Methode .get_history(), die auch die Verfügbarkeit von AttributeState.history impliziert, wurde für synonym()-Attribute implementiert. Zuvor würde der Versuch, die Attributhistorie über ein Synonym abzurufen, einen AttributeError auslösen.

    Referenzen: #3777

orm declarative

  • [bug] [orm declarative]

    Eine __clause_element__()-Methode wurde zu ColumnProperty hinzugefügt, die die Verwendung einer nicht vollständig deklarierten Spalte oder eines verzögerten Attributs in einer deklarativ abgebildeten Klasse etwas benutzerfreundlicher gestaltet, wenn sie in einer Beschränkung oder einem anderen spaltenorientierten Szenario innerhalb der Klassendeklaration verwendet wird. Dies kann jedoch immer noch nicht in offen definierten Ausdrücken funktionieren; rufen Sie stattdessen das Attribut ColumnProperty.expression auf, wenn Sie einen TypeError erhalten.

    Referenzen: #4372

engine

  • [engine] [feature]

    Eine öffentliche Zugriffsmethode QueuePool.timeout() wurde hinzugefügt, die das konfigurierte Timeout für ein QueuePool-Objekt zurückgibt. Pull-Request von Irina Delamare.

    Referenzen: #3689

  • [engine] [change]

    Die „Threadlocal“-Engine-Strategie, die seit etwa Version 0.2 ein Legacy-Feature von SQLAlchemy ist, ist nun veraltet, zusammen mit dem Parameter Pool.threadlocal von Pool, der in den meisten modernen Anwendungsfällen keine Wirkung hat.

    Referenzen: #4393

sql

  • [sql] [feature]

    Die Klasse AnsiFunction, die Basis gängiger SQL-Funktionen wie CURRENT_TIMESTAMP, wurde so geändert, dass sie Positionsargumente wie eine reguläre Ad-hoc-Funktion akzeptiert. Dies geschieht, um dem Fall gerecht zu werden, dass viele dieser Funktionen auf bestimmten Backends Argumente wie „Nachkommastellenpräzision“ akzeptieren. Wenn die Funktion mit Argumenten erstellt wird, werden die Klammern und die Argumente gerendert. Wenn keine Argumente vorhanden sind, generiert der Compiler die Form ohne Klammern.

    Referenzen: #4386

  • [sql] [change]

    Die Parameter create_engine.convert_unicode und String.convert_unicode wurden veraltet. Diese Parameter wurden entwickelt, als die meisten Python DBAPIs wenig bis gar keine Unterstützung für Python Unicode-Objekte hatten und SQLAlchemy die sehr komplexe Aufgabe übernehmen musste, Daten und SQL-Strings performant zwischen Unicode und Bytestrings im gesamten System zu marshaling. Dank Python 3 mussten sich DBAPIs an Unicode-fähige APIs anpassen, und heute unterstützen alle von SQLAlchemy unterstützten DBAPIs Unicode nativ, auch unter Python 2. Dies ermöglicht es, diese langjährige und sehr komplizierte Funktion endlich (weitgehend) zu entfernen. Es gibt natürlich immer noch einige Python 2 Edge Cases, bei denen SQLAlchemy mit Unicode umgehen muss, aber diese werden automatisch gehandhabt; im modernen Gebrauch sollte kein Endbenutzer mit diesen Flags interagieren müssen.

    Referenzen: #4393

mssql

  • [mssql] [bug]

    Der literal_processor für die Datentypen Unicode und UnicodeText gibt nun ein N-Zeichen vor dem literal string expression aus, wie es von SQL Server für Unicode-Zeichenkettenwerte in SQL-Ausdrücken erforderlich ist.

    Referenzen: #4442

misc

  • [bug] [ext]

    Ein Regression in 1.3.0b1, verursacht durch #3423, wurde behoben. Diese führte dazu, dass Association Proxy-Objekte, die auf ein Attribut zugreifen, das nur auf einer polymorphen Unterklasse vorhanden ist, einen AttributeError auslösten, obwohl die tatsächlich aufgerufene Instanz eine Instanz dieser Unterklasse war.

    Referenzen: #4401

1.3.0b1

Veröffentlicht: 16. November 2018

orm

  • [orm] [feature]

    Eine neue Funktion Query.only_return_tuples() wurde hinzugefügt. Sie veranlasst das Query-Objekt, bedingungslos Keyed-Tuple-Objekte zurückzugeben, auch wenn die Abfrage auf eine einzelne Entität abzielt. Pull-Request von Eric Atkin.

    Diese Änderung wird auch **zurückportiert** auf: 1.2.5

  • [orm] [feature]

    Ein neues Flag Session.bulk_save_objects.preserve_order wurde zur Methode Session.bulk_save_objects() hinzugefügt, die standardmäßig auf True gesetzt ist. Wenn sie auf False gesetzt ist, werden die angegebenen Abbildungen nach Objekttyp in Einfüge- und Aktualisierungsgruppen eingeteilt, um größere Möglichkeiten zur Stapelverarbeitung gängiger Operationen zu ermöglichen. Pull-Request von Alessandro Cucci.

  • [orm] [feature]

    Die „selectin“-Loader-Strategie lässt nun den JOIN im Falle eines einfachen One-to-Many-Loads weg, wo stattdessen nur von der zugehörigen Tabelle geladen wird, wobei die Fremdschlüsselspalten der zugehörigen Tabelle verwendet werden, um die Primärschlüssel der Elterntabelle abzugleichen. Diese Optimierung kann durch Setzen des Flags relationship.omit_join auf False deaktiviert werden. Vielen Dank an Jayson Reis für die Bemühungen hierzu.

    Referenzen: #4340

  • [orm] [feature]

    Ein .info-Dictionary wurde zur Klasse InstanceState hinzugefügt, dem Objekt, das durch Aufruf von inspect() auf einem abgebildeten Objekt entsteht.

    Referenzen: #4257

  • [orm] [bug]

    Bug behoben, bei dem die Verwendung des Lateral-Konstrukts in Verbindung mit Query.join() sowie Query.select_entity_from() keine Klauselanpassung auf der rechten Seite des Joins anwendete. „Lateral“ führt den Anwendungsfall ein, bei dem die rechte Seite eines Joins korrelierbar ist. Zuvor wurde die Anpassung dieser Klausel nicht berücksichtigt. Beachten Sie, dass in 1.2 nur ein durch Query.subquery() eingeführter Selektierbarer aufgrund von #4304 immer noch nicht angepasst wird; der Selektierbare muss von der Funktion select() erzeugt werden, um die rechte Seite des „Lateral“-Joins zu sein.

    Diese Änderung wird auch **zurückportiert** auf: 1.2.12

    Referenzen: #4334

  • [orm] [bug]

    Problem behoben bezüglich passive_deletes="all", wo das Fremdschlüsselattribut eines Objekts auch nach dem Entfernen des Objekts aus seiner übergeordneten Sammlung seinen Wert behält. Zuvor setzte die Unit of Work dies auf NULL, obwohl passive_deletes angab, dass es nicht geändert werden sollte.

    Referenzen: #3844

  • [orm] [bug]

    Verbessertes Verhalten eines beziehungsgebundenen Many-to-One-Objektausdrucks, sodass der Abruf von Spaltenwerten des zugehörigen Objekts nun widerstandsfähig gegen das Ablösen des Objekts von seiner übergeordneten Session ist, auch wenn das Attribut abgelaufen ist. Neue Funktionen innerhalb von InstanceState werden verwendet, um den letzten bekannten Wert eines bestimmten Spaltenattributs zu memoizsieren, bevor es abläuft, sodass der Ausdruck immer noch ausgewertet werden kann, wenn das Objekt gleichzeitig abgelöst und abgelaufen ist. Fehlerbedingungen werden ebenfalls mithilfe moderner Attributzustandsfunktionen verbessert, um bei Bedarf spezifischere Meldungen zu erzeugen.

    Referenzen: #4359

  • [orm] [bug] [mysql] [postgresql]

    Das ORM verdoppelt nun die „FOR UPDATE“-Klausel innerhalb der Subquery, die in einigen Fällen in Verbindung mit joined eager loading gerendert wird, da beobachtet wurde, dass MySQL die Zeilen aus einer Subquery nicht sperrt. Dies bedeutet, dass die Abfrage mit zwei FOR UPDATE-Klauseln gerendert wird; beachten Sie, dass auf einigen Backends wie Oracle FOR UPDATE-Klauseln bei Subqueries stillschweigend ignoriert werden, da sie unnötig sind. Darüber hinaus wird im Fall der „OF“-Klausel, die hauptsächlich mit PostgreSQL verwendet wird, FOR UPDATE nur auf der inneren Subquery gerendert, wenn diese verwendet wird, damit der Selektierbare auf die Tabelle innerhalb der SELECT-Anweisung gezielt werden kann.

    Referenzen: #4246

  • [orm] [bug]

    Refactored Query.join(), um die einzelnen Komponenten der Join-Strukturierung weiter zu verdeutlichen. Dieses Refactoring fügt die Fähigkeit hinzu, dass Query.join() die am besten geeignete "linke" Seite des Joins bestimmen kann, wenn mehr als ein Element in der FROM-Liste vorhanden ist oder die Abfrage gegen mehrere Entitäten gerichtet ist. Wenn mehr als ein FROM/Entität übereinstimmt, wird ein Fehler ausgelöst, der zur Auflösung der Mehrdeutigkeit die Angabe einer ON-Klausel verlangt. Insbesondere zielt dies auf die Regression ab, die wir in #4363 gesehen haben, ist aber auch allgemein nützlich. Die Codepfade innerhalb von Query.join() sind nun leichter nachzuvollziehen und die Fehlerfälle werden früher im Ablauf spezifischer entschieden.

    Referenzen: #4365

  • [orm] [bug]

    Behoben wurde ein langjähriges Problem in Query, bei dem eine skalare Unterabfrage, wie sie von Query.exists(), Query.as_scalar() und anderen Ableitungen von Query.statement erzeugt wird, nicht korrekt angepasst wurde, wenn sie in einer neuen Query verwendet wurde, die eine Entitätsanpassung erforderte, z. B. wenn die Abfrage in ein Union oder ein from_self() umgewandelt wurde. Die Änderung entfernt die "keine Anpassung"-Annotation aus dem select()-Objekt, das vom Query.statement-Accessor erzeugt wird.

    Referenzen: #4304

  • [orm] [bug]

    Eine informative Ausnahme wird erneut ausgelöst, wenn ein Primärschlüsselwert während eines ORM-Flushes unter Python 3 in Python nicht sortierbar ist, z. B. eine Enum ohne __lt__() Methode; normalerweise löst Python 3 in diesem Fall einen TypeError aus. Der Flush-Prozess sortiert persistente Objekte nach Primärschlüssel in Python, daher müssen die Werte sortierbar sein.

    Referenzen: #4232

  • [orm] [bug]

    Der von der MappedCollection Klasse verwendete Collections-Konverter wurde entfernt. Dieser Konverter diente nur dazu, zu überprüfen, ob die eingehenden Dictionary-Schlüssel mit denen ihrer entsprechenden Objekte übereinstimmen, und das nur während eines Bulk-Set-Vorgangs. Der Konverter kann mit einem benutzerdefinierten Validator oder einem AttributeEvents.bulk_replace()-Listener kollidieren, der eingehende Werte weiter konvertieren möchte. Der TypeError, der von diesem Konverter ausgelöst würde, wenn ein eingehender Schlüssel nicht mit dem Wert übereinstimmte, wurde entfernt; eingehende Werte während einer Massenzuweisung werden mit ihrem werksgenerierten Schlüssel indiziert und nicht mit dem Schlüssel, der explizit im Dictionary vorhanden ist.

    Insgesamt wird @converter durch den Ereignis-Handler AttributeEvents.bulk_replace() abgelöst, der als Teil von #3896 hinzugefügt wurde.

    Referenzen: #3604

  • [orm] [bug]

    Neues Verhalten wurde zum Lazy-Loading hinzugefügt, das beim Abrufen des "alten" Werts eines Many-to-One-Objekts stattfindet, sodass Ausnahmen, die entweder durch lazy="raise" oder einen Detached-Session-Fehler ausgelöst würden, übersprungen werden.

    Referenzen: #4353

  • [orm] [bug]

    Ein langjähriges Versäumnis im ORM, die __delete__ Methode für eine Many-to-One-Beziehung war funktionsunfähig, z.B. für eine Operation wie del a.b. Dies ist nun implementiert und entspricht dem Setzen des Attributs auf None.

    Referenzen: #4354

orm deklarativ

  • [orm] [declarative] [bug]

    Ein Fehler wurde behoben, bei dem die deklarative Methode den Zustand des Mapper in Bezug auf vorhandene Attribute nicht aktualisierte, wenn zusätzliche Attribute nach dem Aufruf und Memoizing der Mapper-Attributsammlungen hinzugefügt oder entfernt wurden. Zusätzlich wird nun ein NotImplementedError ausgelöst, wenn ein vollständig zugeordnetes Attribut (z. B. Spalte, Beziehung usw.) aus einer Klasse gelöscht wird, die derzeit zugeordnet ist, da der Mapper nicht korrekt funktioniert, wenn das Attribut entfernt wurde.

    Referenzen: #4133

engine

  • [engine] [feature]

    Der QueuePool wurde um einen neuen Modus "lifo" (Last-In, First-Out) erweitert, der typischerweise durch Setzen des Flags create_engine.pool_use_lifo auf True aktiviert wird. Der "lifo"-Modus bedeutet, dass dieselbe Verbindung, die gerade zurückgegeben wurde, die erste ist, die wieder ausgecheckt wird, was es ermöglicht, überschüssige Verbindungen vom Server während Perioden, in denen der Pool nur teilweise ausgelastet ist, zu bereinigen. Pull Request von Taem Park.

sql

  • [sql] [feature]

    Der SQLCompiler wurde überarbeitet, um eine Methode SQLCompiler.group_by_clause() ähnlich den Methoden SQLCompiler.order_by_clause() und SQLCompiler.limit_clause() verfügbar zu machen, die von Dialekten überschrieben werden können, um anzupassen, wie GROUP BY gerendert wird. Pull Request von Samuel Chou.

    Diese Änderung wird auch nach zurückportiert zu: 1.2.13

  • [sql] [feature]

    Dem "String SQL"-System wurde eine Sequence hinzugefügt, die einen aussagekräftigen String-Ausdruck ("<next sequence value: my_sequence>") rendert, wenn eine Anweisung, die einen "sequence nextvalue"-Ausdruck enthält, ohne Dialekt stringifiziert wird, anstatt einen Kompilierungsfehler auszulösen.

    Referenzen: #4144

  • [sql] [feature]

    Neue Benennungskonvention-Token column_0N_name, column_0_N_name usw. wurden hinzugefügt, die die Namen / Schlüssel / Labels für alle Spalten rendern, auf die von einer bestimmten Einschränkung in einer Sequenz verwiesen wird. Um die Länge einer solchen Benennungskonvention zu berücksichtigen, wendet der SQL-Compiler seine automatische Kürzung nun auch auf Einschränkungsnamen an, wodurch ein verkürzter, deterministisch generierter Name für die Einschränkung erstellt wird, der auf ein Ziel-Backend angewendet wird, ohne das Zeichenlimit dieses Backends zu überschreiten.

    Die Änderung behebt auch zwei weitere Probleme. Zum einen war das Token column_0_key nicht verfügbar, obwohl dieses Token dokumentiert war. Zum anderen rendert das Token referred_column_0_name versehentlich den .key und nicht den .name der Spalte, wenn diese beiden Werte unterschiedlich waren.

    Referenzen: #3989

  • [sql] [feature]

    Neue Logik wurde zur "expanding IN"-Funktion für gebundene Parameter hinzugefügt, bei der, wenn die gegebene Liste leer ist, ein spezieller "leerer Satz"-Ausdruck generiert wird, der für verschiedene Backends spezifisch ist. Dies ermöglicht IN-Ausdrücke, die vollständig dynamisch sind, einschließlich leerer IN-Ausdrücke.

    Referenzen: #4271

  • [sql] [feature]

    Das eingebaute Python-Funktion dir() wird nun für ein SQLAlchemy-Objekt "properties" unterstützt, wie z.B. eine Core-Spaltenkollektion (z. B. .c), mapper.attrs usw. Dies ermöglicht auch die iPython-Autovervollständigung. Pull Request von Uwe Korn.

  • [sql] [feature]

    Die neue Funktion FunctionElement.as_comparison() wurde hinzugefügt, die es einer SQL-Funktion ermöglicht, als binäre Vergleichsoperation zu fungieren, die innerhalb des ORM verwendet werden kann.

    Referenzen: #3831

  • [sql] [bug]

    "Like"-basierte Operatoren wurden als "Vergleichsoperatoren" hinzugefügt, einschließlich ColumnOperators.startswith() ColumnOperators.endswith() ColumnOperators.ilike() ColumnOperators.notilike() und viele andere, so dass all diese Operatoren die Grundlage für eine ORM-"primaryjoin"-Bedingung bilden können.

    Referenzen: #4302

  • [sql] [bug]

    Ein Problem mit den Methoden TypeEngine.bind_expression() und TypeEngine.column_expression() wurde behoben, bei denen diese Methoden nicht funktionierten, wenn der Zieltyp Teil eines Variant war, oder ein anderer Zieltyp eines TypeDecorator. Zusätzlich ruft der SQL-Compiler nun die dialekt-spezifische Implementierung auf, wenn er diese Methoden rendert, sodass Dialekte nun SQL-seitige Verarbeitung für eingebaute Typen bereitstellen können.

    Referenzen: #3981

postgresql

  • [postgresql] [feature]

    Ein neuer PG-Typ REGCLASS wurde hinzugefügt, der beim Casten von Tabellennamen zu OID-Werten hilft. Pull Request von Sebastian Bank.

    Diese Änderung wird auch nach zurückportiert zu: 1.2.7

    Referenzen: #4160

  • [postgresql] [feature]

    Rudimentäre Unterstützung für die Reflexion von PostgreSQL-Partitionstabellen wurde hinzugefügt, z. B. relkind=’p’ wird zu den Reflexionsabfragen hinzugefügt, die Tabelleninformationen zurückgeben.

    Referenzen: #4237

mysql

  • [mysql] [feature]

    Unterstützung für die "WITH PARSER"-Syntax von CREATE FULLTEXT INDEX in MySQL wurde hinzugefügt, unter Verwendung des Schlüsselwortarguments mysql_with_parser. Die Reflexion wird ebenfalls unterstützt, was das spezielle Kommentarformat von MySQL zur Berichterstattung über diese Option berücksichtigt. Zusätzlich werden die Präfixe "FULLTEXT" und "SPATIAL" nun in die Indexoption mysql_prefix zurückreflektiert.

    Referenzen: #4219

  • [mysql] [feature]

    Unterstützung für die Parameter in einer ON DUPLICATE KEY UPDATE-Anweisung auf MySQL wurde hinzugefügt, um sie zu ordnen, da die Parameterreihenfolge in einer MySQL UPDATE-Klausel wichtig ist, ähnlich wie bei Parameter Ordered Updates beschrieben. Pull Request von Maxim Bublis.

  • [mysql] [feature]

    Die "Pre-Ping"-Funktion des Connection Pools verwendet nun die ping() Methode der DBAPI-Verbindung im Falle von mysqlclient, PyMySQL und mysql-connector-python. Pull Request von Maxim Bublis.

sqlite

  • [sqlite] [feature]

    Unterstützung für die JSON-Funktionalität von SQLite wurde über die neue SQLite-Implementierung für JSON, JSON hinzugefügt. Der für den Typ verwendete Name ist JSON, gemäß einem Beispiel in der eigenen Dokumentation von SQLite. Pull Request von Ilja Everilä.

    Referenzen: #3850

  • [sqlite] [feature]

    Die ON CONFLICT-Klausel von SQLite wurde implementiert, wie auf DDL-Ebene verstanden, z.B. für Primärschlüssel-, Unique- und CHECK-Constraints sowie auf einer Column angegeben, um Inline-Primärschlüssel und NOT NULL zu erfüllen. Pull Request von Denis Kataev.

    Referenzen: #4360

mssql

oracle

  • [oracle] [feature]

    Ein neues Ereignis, das derzeit nur vom cx_Oracle-Dialekt verwendet wird, wurde hinzugefügt: DialectEvents.setiputsizes(). Das Ereignis übergibt ein Dictionary von BindParameter-Objekten an DBAPI-spezifische Typobjekte, die nach der Konvertierung in Parameternamen an die Methode cursor.setinputsizes() von cx_Oracle übergeben werden. Dies ermöglicht sowohl die Sichtbarkeit des setinputsizes-Prozesses als auch die Möglichkeit, das Verhalten der an diese Methode übergebenen Datentypen zu ändern.

    Diese Änderung wird auch nach zurückportiert zu: 1.2.9

    Referenzen: #4290

  • [oracle] [bug]

    Die Parameter, die an das cx_Oracle DBAPI übergeben werden können, wurden aktualisiert, um sowohl alle aktuellen als auch zukünftige, noch nicht hinzugefügte Parameter zu ermöglichen. Zusätzlich wurden nicht verwendete Parameter entfernt, die in Version 1.2 als veraltet markiert wurden, und außerdem wird "threaded" jetzt standardmäßig auf False gesetzt.

    Referenzen: #4369

  • [oracle] [bug]

    Der Oracle-Dialekt wird die NCHAR/NCLOB-Datentypen zur Darstellung von generischen Unicode-Strings oder Clob-Feldern in Verbindung mit Unicode und UnicodeText nicht mehr verwenden, es sei denn, das Flag use_nchar_for_unicode=True wird an create_engine() übergeben - dies schließt das CREATE TABLE-Verhalten sowie setinputsizes() für gebundene Parameter ein. Auf der Leseseite wurde unter Python 2 eine automatische Unicode-Konvertierung für CHAR/VARCHAR/CLOB-Ergebniszeilen hinzugefügt, um das Verhalten von cx_Oracle unter Python 3 anzupassen. Um die Performance-Einbußen unter Python 2 abzumildern, werden unter Python 2 die sehr performanten (wenn C-Erweiterungen kompiliert sind) nativen Unicode-Handler von SQLAlchemy verwendet.

    Referenzen: #4242

misc