0.6 Changelog

0.6.9

Veröffentlicht: Sa, 05. Mai 2012

general

  • [general]

    Den intern verwendeten Mechanismus „importlater“, der dazu dient, Importzyklen aufzulösen, so angepasst, dass die Verwendung von __import__ abgeschlossen ist, wenn der Import von sqlalchemy oder sqlalchemy.orm erfolgt ist. Dadurch wird jede Verwendung von __import__ nach dem Start neuer Threads durch die Anwendung vermieden, Fehler behoben.

    Referenzen: #2279

orm

  • [orm] [bug]

    Unangemessene Auswertung eines benutzerdefinierten Objekts im booleschen Kontext innerhalb von query.get() behoben.

    Referenzen: #2310

  • [orm] [bug]

    Fehlerformatierung behoben, die ausgelöst wurde, wenn versehentlich ein Tupel an session.query() übergeben wurde.

    Referenzen: #2297

  • [orm]

    Fehler behoben, bei dem die von query.join() verwendete Quellklausel inkonsistent war, wenn sie auf einen Spaltenausdruck angewendet wurde, der mehrere Entitäten kombinierte.

    Referenzen: #2197

  • [orm]

    Fehler behoben, der nur unter Python 3 auftrat, bei dem die Sortierung von persistenten + ausstehenden Objekten während des Flush einen ungültigen Vergleich erzeugte, wenn der Primärschlüssel des persistenten Objekts kein einzelner Integer war.

    Referenzen: #2228

  • [orm]

    Fehler behoben, bei dem query.join() + aliased=True aus einer joined-inh-Struktur mit sich selbst über relationship() mit einer Join-Bedingung auf der Kindtabelle die führende Entität unangemessen in die zugeordnete umwandelte.

    Referenzen: #2234

  • [orm]

    Fehler behoben, bei dem das Attribut mapper.order_by in der „inneren“ Abfrage einer Subquery-Eager-Load ignoriert wurde.

    Referenzen: #2287

  • [orm]

    Fehler behoben, bei dem, wenn eine gemappte Klasse __hash__() oder __eq__() auf etwas Nichtstandardmäßiges neu definierte (was ein unterstützter Anwendungsfall ist, da SQLA diese niemals konsultieren sollte), die Methoden konsultiert wurden, wenn die Klasse Teil eines „zusammengesetzten“ (d. h. nicht einzelner Entitäten) Ergebnissatzes war.

    Referenzen: #2215

  • [orm]

    Fein subtiler Fehler behoben, der dazu führte, dass SQL abstürzte, wenn: column_property() gegen eine Subquery + joinedload + LIMIT + Order by die column_property() stattfand.

    Referenzen: #2188

  • [orm]

    Die von with_parent erzeugte Join-Bedingung sowie die Verwendung einer „dynamischen“ Beziehung zu einem Elternteil erzeugen eindeutige Bindparameter, anstatt denselben Bindparameter falsch zu wiederholen.

    Referenzen: #2207

  • [orm]

    Die Assertion „no statement condition“ in Query repariert, die versuchte, auszulösen, wenn eine generative Methode nach dem Aufruf von from_statement() aufgerufen wurde.

    Referenzen: #2199

  • [orm]

    Cls.column.collate(“some collation”) funktioniert jetzt.

    Referenzen: #1776

examples

  • [examples]

    Das Beispiel dictlike-polymorphic.py wurde angepasst, um CAST anzuwenden, sodass es auf PG und anderen Datenbanken funktioniert.

    Referenzen: #2266

engine

  • [engine]

    Der Fix für 0.7.4 wurde zurückportiert, der sicherstellt, dass die Verbindung in einem gültigen Zustand ist, bevor versucht wird, rollback()/prepare()/release() auf Savepoint- und Zwei-Phasen-Transaktionen anzuwenden.

    Referenzen: #2317

sql

  • [sql]

    Zwei subtile Fehler im Zusammenhang mit der Spaltenkorrespondenz in einem wählbaren Element behoben: einer mit derselben bezeichneten Subquery, die wiederholt wurde, der andere, wenn das Label „gruppiert“ wurde und sich selbst verlor. Betrifft.

    Referenzen: #2188

  • [sql]

    Fehler behoben, bei dem das Flag „warn on unicode“ für den String-Typ gesetzt wurde, wenn er mit bestimmten Dialekten verwendet wurde. Dieser Fehler ist nicht in 0.7.

  • [sql]

    Fehler behoben, bei dem die Methode with_only_columns() von Select fehlschlägt, wenn ein wählbares Objekt übergeben wurde. Das FROM-Verhalten ist hier jedoch immer noch falsch, daher benötigen Sie in jedem Fall 0.7, damit dieser Anwendungsfall nutzbar ist.

    Referenzen: #2270

schema

  • [schema]

    Eine informative Fehlermeldung hinzugefügt, wenn ForeignKeyConstraint auf einen Spaltennamen in der übergeordneten Tabelle verweist, der nicht gefunden wird.

postgresql

  • [postgresql]

    Fehler behoben, bei dem das modifizierte Indexverhalten in PG 9 die Primärschlüsselreflexion bei einer umbenannten Spalte beeinträchtigte.

    Referenzen: #2141, #2291

mysql

  • [mysql]

    Der OurSQL-Dialekt verwendet für XA-Befehle das ANSI-neutrale Anführungszeichen „'“ anstelle von „““.

    Referenzen: #2186

  • [mysql]

    Ein CREATE TABLE platziert die COLLATE-Option nach CHARSET, was Teil der willkürlichen Regeln von MySQL zu sein scheint, ob es tatsächlich funktioniert oder nicht.

    Referenzen: #2225

mssql

  • [mssql] [bug]

    Eingehende Werte beim Abrufen einer Liste von Indexnamen und der Namen der Spalten innerhalb dieser Indizes dekodiert.

    Referenzen: #2269

oracle

  • [oracle]

    ORA-00028 zu den Trennungscodes hinzugefügt, cx_oracle _Error.code zur Abfrage des Codes verwendet.

    Referenzen: #2200

  • [oracle]

    Der oracle.RAW-Typ wurde repariert, der die falsche DDL generierte.

    Referenzen: #2220

  • [oracle]

    CURRENT zur Liste der reservierten Wörter hinzugefügt.

    Referenzen: #2212

0.6.8

Veröffentlicht: So, 05. Juni 2011

orm

  • [orm]

    Das Aufrufen von query.get() gegen eine spaltenbasierte Entität ist ungültig; diese Bedingung löst nun eine Deprecation Warning aus.

    Referenzen: #2144

  • [orm]

    Ein nicht-primärer Mapper erbt die _identity_class des primären Mappers. Dies geschieht, damit ein nicht-primärer Mapper, der gegen eine Klasse eingerichtet wird, die normalerweise in einer Vererbungszuordnung vorkommt, Ergebnisse liefert, die mit denen des primären Mappers identitätskartkompatibel sind.

    Referenzen: #2151

  • [orm]

    Die Identitätskartimplementierung von 0.7 wurde zurückportiert, die keine Mutex um die Entfernung verwendet. Dies, da einige Benutzer trotz der Anpassungen in 0.6.7 immer noch Deadlocks erhielten; der 0.7-Ansatz, der keinen Mutex verwendet, scheint keine „dictionary changed size“-Probleme zu verursachen, was der ursprüngliche Grund für den Mutex war.

    Referenzen: #2148

  • [orm]

    Die Fehlermeldung für „can’t execute syncrule for destination column ‘q’; mapper ‘X’ does not map this column“ wurde korrigiert, um den richtigen Mapper zu referenzieren.

    Referenzen: #2163

  • [orm]

    Fehler behoben, bei dem die Bestimmung der „selbstverweisenden“ Beziehung bei einer joined-inh-Unterklasse, die sich selbst bezieht, oder bei einer joined-inh-Unterklasse, die sich auf eine Unterklasse davon bezieht, ohne Spalten in der Unter-Unterklasse in der Join-Bedingung fehlschlug.

    Referenzen: #2149

  • [orm]

    mapper() ignoriert nicht konfigurierte Fremdschlüssel zu nicht verwandten Tabellen bei der Bestimmung der Vererbungsbedingung zwischen Eltern- und Kindklasse. Dies entspricht dem bereits für declarative angewendeten Verhalten. Beachten Sie, dass 0.7 eine umfassendere Lösung dafür hat, die ändert, wie join() selbst einen FK-Fehler feststellt.

    Referenzen: #2153

  • [orm]

    Fehler behoben, bei dem ein Mapper, der auf einen anonymen Alias gemappt war, fehlschlug, wenn Logging verwendet wurde, aufgrund eines nicht maskierten %-Zeichens im Alias-Namen.

    Referenzen: #2171

  • [orm]

    Der Text der Meldung, die auftritt, wenn der „identity“-Schlüssel beim Flush nicht erkannt wird, wurde geändert, um die häufige Ursache einzubeziehen, dass die Spalte nicht korrekt für die Erkennung von Auto-Inkrement eingerichtet ist.

    Referenzen: #2170

  • [orm]

    Fehler behoben, bei dem die Transaktions-„deleted“-Sammlung nicht von ausgeschlossenen Zuständen gelöscht wurde, was zu einem Fehler führte, wenn sie später transient wurden.

    Referenzen: #2182

engine

  • [engine]

    Die __contains__() Methode einer RowProxy-Ergebniszeile wurde angepasst, sodass intern keine Ausnahme ausgelöst wird; NoSuchColumnError() generiert ebenfalls seine Meldung, unabhängig davon, ob die Spaltenkonstruktion in einen String umgewandelt werden kann.

    Referenzen: #2178

sql

  • [sql]

    Fehler behoben, bei dem, wenn FetchedValue an column server_onupdate übergeben wurde, sein übergeordnetes „column“ nicht zugewiesen wurde; Testabdeckung für alle Spaltendefault-Zuweisungsmuster hinzugefügt.

    Referenzen: #2147

  • [sql]

    Fehler behoben, bei dem das Verschachteln eines Labels einer select()-Anweisung mit einem anderen Label darin zu falsch exportierten Spalten führte. Unter anderem brach dies eine ORM-Spalten-Eigenschaft()-Zuordnung zu einer anderen Spalten-Eigenschaft().

    Referenzen: #2167

postgresql

  • [postgresql]

    Fehler behoben, der PG 9 betraf und bei dem die Indexreflexion fehlschlug, wenn sie auf eine Spalte mit einem geänderten Namen angewendet wurde.

    Referenzen: #2141

  • [postgresql]

    Einige Unit-Test-Korrekturen bezüglich numerischer Arrays und des MATCH-Operators. Ein potenzielles Ungenauigkeitsproblem bei Fließkommazahlen wurde behoben, und bestimmte Tests des MATCH-Operators werden derzeit nur in einem EN-orientierten Gebietsschema ausgeführt.

    Referenzen: #2175

mssql

  • [mssql]

    Fehler im MSSQL-Dialekt behoben, bei dem die Aliasing einer schemaqualifizierten Tabelle in umschließende SELECT-Anweisungen überlief.

    Referenzen: #2169

  • [mssql]

    Fehler behoben, bei dem der DATETIME2-Typ im „adapt“-Schritt fehlschlug, wenn er in Ergebnislisten oder gebundenen Parametern verwendet wurde. Dieses Problem besteht nicht in 0.7.

    Referenzen: #2159

0.6.7

Veröffentlicht: Mi, 13. April 2011

orm

  • [orm]

    Den Iterate-vs.-Remove-Mutex um die Iteration der Identitätskarte gestrafft, um die Wahrscheinlichkeit eines (extrem seltenen) reentranten GC-Vorgangs, der zu einem Deadlock führt, zu verringern. Könnte den Mutex in 0.7 entfernen.

    Referenzen: #2087

  • [orm]

    Ein name-Argument zu Query.subquery() hinzugefügt, um dem Alias-Objekt einen festen Namen zuweisen zu können.

    Referenzen: #2030

  • [orm]

    Eine Warnung wird ausgegeben, wenn ein Joined-Table-Inheriting-Mapper keine Primärschlüssel in der lokal zugeordneten Tabelle hat (aber PKs in der Superklassentabelle hat).

    Referenzen: #2019

  • [orm]

    Fehler behoben, bei dem die „mittlere“ Klasse in einer polyamorphen Hierarchie keine ‚polymorphic_on‘-Spalte hatte, wenn sie nicht auch eine ‚polymorphic_identity‘ angab, was zu seltsamen Fehlern beim Aktualisieren und zum Laden der falschen Klasse beim Abfragen von diesem Ziel führte. Gibt auch das korrekte WHERE-Kriterium bei Verwendung von Single-Table-Inheritance aus.

    Referenzen: #2038

  • [orm]

    Fehler behoben, bei dem eine Spalte mit einem SQL- oder serverseitigen Standardwert, die mit include_properties oder exclude_properties von einer Zuordnung ausgeschlossen wurde, zu UnmappedColumnError führte.

    Referenzen: #1995

  • [orm]

    Eine Warnung wird in dem ungewöhnlichen Fall ausgegeben, dass ein Anfüge- oder ähnliches Ereignis bei einer Sammlung auftritt, nachdem das übergeordnete Objekt dereferenziert wurde, was verhindert, dass das übergeordnete Objekt in der Sitzung als „dirty“ markiert wird. Dies wird in 0.7 eine Ausnahme sein.

    Referenzen: #2046

  • [orm]

    Fehler in query.options() behoben, bei dem ein Pfad, der auf einen lazyload mit String-Schlüsseln angewendet wurde, mit einem gleichnamigen Attribut der falschen Entität überlappen konnte. Beachten Sie, dass 0.7 eine aktualisierte Version dieses Fixes enthält.

    Referenzen: #2098

  • [orm]

    Die Ausnahme, die ausgelöst wird, wenn ein Flush einer polyamorphen Unterklasse versucht wird, die nicht polyamorphen gegen den Übertyp ist, wurde umformuliert.

    Referenzen: #2063

  • [orm]

    Einige Korrekturen am Zustandsmanagement bezüglich Backrefs, typischerweise wenn autoflush=False, wo die Back-Referenzsammlung Add/Remove-Vorgänge ohne Nettoänderung nicht korrekt verarbeitet hätte. Dank an Richard Murri für den Testfall + Patch.

    Referenzen: #2123

  • [orm]

    Eine „having“-Klausel würde von der inneren zur äußeren Abfrage kopiert, wenn from_self() verwendet würde.

    Referenzen: #2130

examples

  • [examples]

    Das Beaker-Caching-Beispiel erlaubt ein „query_cls“-Argument für die Funktion query_callable().

    Referenzen: #2090

engine

  • [engine]

    Fehler in QueuePool, SingletonThreadPool behoben, bei dem Verbindungen, die durch Überlauf oder periodische Bereinigung() verworfen wurden, nicht explizit geschlossen wurden, stattdessen wurde die Speicherbereinigung der Aufgabe überlassen. Dies betrifft im Allgemeinen nur Backends ohne Referenzzählung wie Jython und PyPy. Dank an Jaimy Azle für die Entdeckung.

    Referenzen: #2102

sql

  • [sql]

    Column.copy(), wie in table.tometadata() verwendet, kopiert das ‚doc‘-Attribut.

    Referenzen: #2028

  • [sql]

    Einige Definitionen zur resultproxy.c-Erweiterung hinzugefügt, damit die Erweiterung unter Python 2.4 kompiliert und ausgeführt wird.

    Referenzen: #2023

  • [sql]

    Die Compiler-Erweiterung unterstützt jetzt das Überschreiben der Standardkompilierung von expression._BindParamClause, einschließlich der Tatsache, dass die automatisch generierten Bindungen in der VALUES/SET-Klausel einer insert()/update()-Anweisung ebenfalls die neuen Kompilierungsregeln verwenden.

    Referenzen: #2042

  • [sql]

    Zugriffsmethoden zu ResultProxy „returns_rows“, „is_insert“ hinzugefügt.

    Referenzen: #2089

  • [sql]

    Die Schlüsselwörter limit/offset für select() sowie der Wert, der an select.limit()/offset() übergeben wird, werden in Integer umgewandelt.

    Referenzen: #2116

postgresql

  • [postgresql]

    Wenn die explizite Sequenzausführung den Namen der automatisch generierten Sequenz einer SERIAL-Spalte ableitet, was derzeit nur geschieht, wenn implicit_returning=False ist, wird nun berücksichtigt, wenn der Tabellen- und Spaltenname größer als 63 Zeichen ist, unter Verwendung derselben Logik, die PostgreSQL verwendet.

    Referenzen: #1083

  • [postgresql]

    Eine zusätzliche libpq-Nachricht zu den „disconnect“-Ausnahmen hinzugefügt: „could not receive data from server“

    Referenzen: #2044

  • [postgresql]

    RESERVED_WORDS für den PostgreSQL-Dialekt hinzugefügt.

    Referenzen: #2092

  • [postgresql]

    Der BIT-Typ wurde korrigiert, um einen „length“-Parameter und einen „varying“-Parameter zu erlauben. Die Reflexion wurde ebenfalls korrigiert.

    Referenzen: #2073

mysql

  • [mysql]

    Der OurSQL-Dialekt akzeptiert dieselben „ssl“-Argumente in create_engine(), wie der MySQLdb-Dialekt.

    Referenzen: #2047

sqlite

  • [sqlite]

    Fehler behoben, bei dem die Reflexion von Fremdschlüsseln, die als „REFERENCES <tablename>“ ohne Spaltennamen erstellt wurden, fehlschlug.

    Referenzen: #2115

mssql

  • [mssql]

    Die Abfrage zum Abrufen der Definition einer View, typischerweise bei Verwendung der Inspector-Schnittstelle, wurde neu geschrieben, um sys.sql_modules anstelle des Informationsschemas zu verwenden. Dadurch können View-Definitionen, die länger als 4000 Zeichen sind, vollständig zurückgegeben werden.

    Referenzen: #2071

oracle

  • [oracle]

    Die Verwendung von Spaltennamen, die Anführungszeichen für die Spalte selbst oder für einen generierten Bindparameter-Namen erfordern (z. B. Namen mit Sonderzeichen, Unterstrichen, Nicht-ASCII-Zeichen), übersetzt nun korrekt die Bindparameter-Schlüssel bei der Kommunikation mit cx_oracle.

    Referenzen: #2100

  • [oracle]

    Der Oracle-Dialekt fügt das create_engine()-Flag use_binds_for_limits=False hinzu; es wird die LIMIT/OFFSET-Werte inline anstelle von Bindungen rendern, was Berichten zufolge den von Oracle verwendeten Ausführungsplan modifiziert.

    Referenzen: #2116

misc

  • [informix]

    RESERVED_WORDS für den Informix-Dialekt hinzugefügt.

    Referenzen: #2092

  • [firebird]

    Das Flag „implicit_returning“ auf create_engine() wird berücksichtigt, wenn es auf False gesetzt ist.

    Referenzen: #2083

  • [ext]

    Die horizontal_shard ShardedSession-Klasse akzeptiert das allgemeine Session-Argument „query_cls“ als Konstruktorargument, um die weitere Unterklassifizierung von ShardedQuery zu ermöglichen.

    Referenzen: #2090

  • [declarative]

    Eine explizite Prüfung wurde hinzugefügt für den Fall, dass der Name ‚metadata‘ für ein Spaltenattribut einer deklarativen Klasse verwendet wird.

    Referenzen: #2050

  • [declarative]

    Fehlermeldung, die auf den alten @classproperty-Namen verwies, wurde korrigiert, um auf @declared_attr zu verweisen.

    Referenzen: #2061

  • [declarative]

    Argumente in __mapper_args__, die nicht „hashbar“ sind, werden nicht fälschlicherweise als immer-hashbar, möglicherweise-Spalten-Argumente interpretiert.

    Referenzen: #2091

  • [documentation]

    SQLite DATE/TIME/DATETIME-Typen dokumentiert.

    Referenzen: #2029

0.6.6

Veröffentlicht: Sa, 08. Januar 2011

orm

  • [orm]

    Fehler behoben, bei dem ein modifiziertes Ereignis eines nicht-„mutablen“ Attributs, das auf einem Objekt auftrat, das bis auf vorherige mutable Attributänderungen sauber war, sich selbst nicht stark in der Identitätskarte referenzierte. Dies würde dazu führen, dass das Objekt gesammelt wird und alle Änderungen verloren gehen, die nicht zuvor im Wörterbuch der „mutablen Änderungen“ gespeichert wurden.

  • [orm]

    Fehler behoben, bei dem „passive_deletes=’all'“ die falschen Symbole nicht an Lazy Loader während des Flush übergab, was eine unnötige Ladung verursachte.

    Referenzen: #2013

  • [orm]

    Fehler behoben, der verhinderte, dass zusammengesetzte gemappte Attribute auf einer gemappten SELECT-Anweisung verwendet wurden. Beachten Sie, dass die Funktionsweise von Composites in 0.7 erheblich geändert werden soll.

    Referenzen: #1997

  • [orm]

    Das Flag active_history wurde auch zu composite() hinzugefügt. Das Flag hat in 0.6 keine Auswirkung, ist aber stattdessen ein Platzhalter für Vorwärtskompatibilität, da es in 0.7 für Composites gilt.

    Referenzen: #1976

  • [orm]

    UOW-Fehler behoben, bei dem abgelaufene Objekte, die an Session.delete() übergeben wurden, entladene Referenzen oder Sammlungen nicht bei der Löschung von Objekten berücksichtigt hätten, obwohl passive_deletes auf dem Standardwert False blieb.

    Referenzen: #2002

  • [orm]

    Eine Warnung wird ausgegeben, wenn version_id_col auf einem vererbenden Mapper angegeben wird, wenn der geerbte Mapper bereits einen hat, wenn diese Spaltenausdrücke nicht dieselben sind.

    Referenzen: #1987

  • [orm]

    Das Flag „innerjoin“ wirkt sich nicht auf die Kette von joinedload()-Joins aus, wenn ein vorheriger Join in dieser Kette ein Outer Join ist, wodurch primäre Zeilen ohne eine referenzierte Kindzeile korrekt in den Ergebnissen zurückgegeben werden.

    Referenzen: #1954

  • [orm]

    Fehler behoben bezüglich der „subqueryload“-Strategie, bei der die Strategie fehlschlug, wenn die Entität ein aliased()-Konstrukt war.

    Referenzen: #1964

  • [orm]

    Fehler behoben bezüglich der „subqueryload“-Strategie, bei der der Join fehlschlug, wenn eine mehrstufige Ladung der Form from A->joined-subclass->C verwendet wurde.

    Referenzen: #2014

  • [orm]

    Fehler bei der Indizierung von Query-Objekten durch -1 behoben. Es wurde fälschlicherweise in den leeren Slice -1:0 umgewandelt, was zu einem IndexError führte.

    Referenzen: #1968

  • [orm]

    Das Mapper-Argument „primary_key“ kann als einzelne Spalte sowie als Liste oder Tupel übergeben werden. Die Dokumentationsbeispiele, die es als Skalarwert darstellten, wurden zu Listen geändert.

    Referenzen: #1971

  • [orm]

    Hinzugefügt: active_history-Flag für relationship() und column_property(), erzwingt, dass Attributereignisse immer den "alten" Wert laden, damit er für attributes.get_history() verfügbar ist.

    Referenzen: #1961

  • [orm]

    Query.get() wird fehlschlagen, wenn die Anzahl der Parameter in einem zusammengesetzten Schlüssel zu groß oder zu klein ist.

    Referenzen: #1977

  • [orm]

    Backport der "optimierten get"-Korrektur von 0.7, verbessert die Generierung des "load expired row"-Verhaltens bei Joined-Inheritance.

    Referenzen: #1992

  • [orm]

    Etwas mehr Text für die "primaryjoin"-Fehlermeldung, in einer ungewöhnlichen Bedingung, dass die Join-Bedingung für viewonly funktioniert, aber nicht für non-viewonly, und foreign_keys nicht verwendet wurde - fügt "foreign_keys" zum Vorschlag hinzu. Fügt auch "foreign_keys" zum Vorschlag für den generischen "direction"-Fehler hinzu.

examples

  • [examples]

    Das Versionierungsbeispiel unterstützt nun die Erkennung von Änderungen in einer zugehörigen relationship().

engine

  • [engine]

    Die "unicode warning" gegen Nicht-Unicode-Bindungsdaten wird nun nur noch ausgelöst, wenn der Unicode-Typ explizit verwendet wird; nicht, wenn convert_unicode=True auf der Engine oder dem String-Typ verwendet wird.

  • [engine]

    Behobener Speicherleck in der C-Version des Decimal-Ergebnisverarbeiters.

    Referenzen: #1978

  • [engine]

    Implementierte Sequenzprüfungsfähigkeit für die C-Version von RowProxy, sowie Registrierung für RowProxy im Stil von Python 2.7 "collections.Sequence".

    Referenzen: #1871

  • [engine]

    Threadlocal-Engine-Methoden rollback(), commit(), prepare() lösen nun keine Fehler mehr aus, wenn keine Transaktion aktiv ist; dies war ein Rückschritt in 0.6.

    Referenzen: #1998

  • [engine]

    Threadlocal-Engine gibt sich selbst bei begin() und begin_nested() zurück; die Engine implementiert dann Kontextmanager-Methoden, um die "with"-Anweisung zu ermöglichen.

    Referenzen: #2004

sql

  • [sql]

    Korrigierte Operatorrangfolgeregeln für mehrere Ketten eines einzelnen nicht-assoziativen Operators. D.h. "x - (y - z)" wird als "x - (y - z)" kompiliert und nicht als "x - y - z". Funktioniert auch mit Labels, d.h. "x - (y - z).label('foo')"

    Referenzen: #1984

  • [sql]

    Das 'info'-Attribut von Column wird bei Column.copy() kopiert, d.h. wenn Spalten in deklarativen Mixins verwendet werden.

    Referenzen: #1967

  • [sql]

    Hinzugefügt: Ein Bindungsprozessor für Booleans, der zu int konvertiert, für DBAPIs wie pymssql, die naiv str() auf Werte anwenden.

  • [sql]

    CheckConstraint kopiert seine Attribute 'initially', 'deferrable' und '_create_rule' bei einem copy()/tometadata().

    Referenzen: #2000

postgresql

  • [postgresql]

    Einzelne Tupelausdrücke innerhalb einer IN-Klausel werden nun korrekt parenthesiziert, ebenfalls aus

    Referenzen: #1984

  • [postgresql]

    Sichergestellt, dass alle numerischen, Gleitkomma-, Ganzzahl-Codes sowie Skalare + Arrays von psycopg2 und pg8000 als "numerischer" Basistyp erkannt werden.

    Referenzen: #1955

  • [postgresql]

    Hinzugefügt: as_uuid=True-Flag für den UUID-Typ. Empfängt und gibt Werte als Python UUID()-Objekte anstelle von Zeichenketten zurück. Derzeit funktioniert der UUID-Typ nur mit psycopg2.

    Referenzen: #1956

  • [postgresql]

    Behobener Fehler, bei dem ein KeyError bei nicht von ENUM unterstützten PG-Versionen auftrat, nachdem ein Pool geleert und neu erstellt wurde.

    Referenzen: #1989

mysql

  • [mysql]

    Korrigierte Fehlerbehandlung für Jython + zxjdbc, sodass die has_table()-Eigenschaft wieder funktioniert. Rückschritt von 0.6.3 (wir haben keine Jython buildbot, Entschuldigung).

    Referenzen: #1960

sqlite

  • [sqlite]

    Die REFERENCES-Klausel in einem CREATE TABLE, die ein Remote-Schema zu einer anderen Tabelle mit demselben Schemanamen enthält, rendert den Remotenamen nun ohne die Schemaklausel, wie von SQLite gefordert.

    Referenzen: #1851

  • [sqlite]

    Im gleichen Sinne rendert die REFERENCES-Klausel in einem CREATE TABLE, die ein Remote-Schema zu einem *anderen* Schema als dem der übergeordneten Tabelle enthält, gar nichts, da Cross-Schema-Referenzen offenbar nicht unterstützt werden.

mssql

  • [mssql]

    Die Umschreibung der Indexreflexion wurde leider nicht richtig getestet und lieferte falsche Ergebnisse. Dieser Rückschritt ist nun behoben.

    Referenzen: #1770

oracle

  • [oracle]

    Die cx_oracle "decimal detection" Logik, die für Ergebnisset-Spalten mit mehrdeutigen numerischen Merkmalen stattfindet, verwendet nun das Dezimalpunktzeichen, das vom Gebietsschema/NLS_LANG bestimmt wird, und verwendet eine Erkennung dieses Zeichens beim ersten Verbindungsaufbau. cx_oracle 5.0.3 oder neuer wird ebenfalls benötigt, wenn eine NLS_LANG-Einstellung mit einem anderen Dezimalpunkt als dem Punkt verwendet wird.

    Referenzen: #1953

misc

  • [firebird]

    Der Firebird-numerische Typ prüft nun explizit auf Decimal und lässt float() direkt durchlaufen, wodurch spezielle Werte wie float('inf') ermöglicht werden.

    Referenzen: #2012

  • [declarative]

    Ein Fehler wird ausgelöst, wenn __table_args__ nicht im Tupel- oder Wörterbuchformat vorliegt und nicht None ist.

    Referenzen: #1972

  • [sqlsoup]

    Hinzugefügt: "map_to()" Methode zu SqlSoup, die eine "master"-Methode ist und explizite Argumente für jeden Aspekt des wählbaren Elements und der Zuordnung akzeptiert, einschließlich einer Basisklasse pro Zuordnung.

    Referenzen: #1975

  • [sqlsoup]

    Zugeordnete wählbare Elemente, die mit den Methoden map(), with_labels(), join() verwendet werden, legen das gegebene Argument nicht mehr im internen "cache"-Wörterbuch ab. Insbesondere da die join() und select() Objekte in der Methode selbst erstellt werden, war dies praktisch ein reiner Speicherleck-Verhalten.

0.6.5

Veröffentlicht: So 24. Okt 2010

orm

  • [orm]

    Hinzugefügt: Eine neue "lazyload"-Option "immediateload". Löst den üblichen "lazy"-Ladevorgang automatisch aus, während das Objekt befüllt wird. Der Anwendungsfall hier ist beim Laden von Objekten, die in einem Offline-Cache gespeichert oder anderweitig verwendet werden, nachdem die Sitzung nicht mehr verfügbar ist, und ein geradliniges 'select'-Laden, kein 'joined' oder 'subquery', gewünscht wird.

    Referenzen: #1914

  • [orm]

    Neue Query-Methoden: query.label(name), query.as_scalar() geben die Anweisung der Abfrage als skalare Unterabfrage mit/ohne Label zurück; query.with_entities(*ent) ersetzt die SELECT-Liste der Abfrage durch neue Entitäten. Ungefähr äquivalent zu einer generativen Form von query.values(), die zugeordnete Entitäten sowie Spaltenausdrücke akzeptiert.

    Referenzen: #1920

  • [orm]

    Behobener Rekursionsfehler, der auftreten konnte, wenn ein Objekt von einer Referenz zu einer anderen verschoben wurde, mit involvierten Backrefs, wobei das initiierende Elternobjekt eine Unterklasse (mit eigenem Mapper) des vorherigen Elternobjekts war.

  • [orm]

    Behobener Rückschritt in 0.6.4, der auftrat, wenn eine leere Liste an "include_properties" auf mapper() übergeben wurde.

    Referenzen: #1918

  • [orm]

    Behobener Labeling-Fehler in Query, bei dem das NamedTuple Labels falsch anwandte, wenn einige der Spaltenausdrücke ungelabelt waren.

  • [orm]

    Ein Fall wurde behoben, in dem query.join() die rechte Seite unangemessen an die rechte Seite des Joins der linken Seite anpasste.

    Referenzen: #1925

  • [orm]

    query.select_from() wurde erweitert, um sicherzustellen, dass ein nachfolgender Aufruf von query.join() die select_from()-Entität verwendet, vorausgesetzt, es handelt sich um eine zugeordnete Entität und nicht um ein einfaches wählbares Element, als "linke" Seite, nicht als erste Entität in der Liste der Entitäten des Query-Objekts.

  • [orm]

    Die von der Session ausgelöste Ausnahme, wenn sie nach einem Rollback einer Untertransaktion verwendet wird (was passiert, wenn ein Flush im Modus autocommit=False fehlschlägt), wurde überarbeitet (dies ist die Meldung "inaktiv aufgrund eines Rollbacks in einer Untertransaktion"). Insbesondere, wenn der Rollback aufgrund einer Ausnahme während des Flush() erfolgte, gibt die Meldung an, dass dies der Fall ist, und wiederholt die Zeichenform der ursprünglichen Ausnahme, die während des Flush() auftrat. Wenn die Sitzung aufgrund der expliziten Verwendung von Untertransaktionen geschlossen wird (nicht sehr üblich), gibt die Meldung lediglich an, dass dies der Fall ist.

  • [orm]

    Die von Mapper ausgelöste Ausnahme, wenn wiederholte Initialisierungsanfragen nach einem Fehlschlag der Initialisierung erfolgen, geht nun nicht mehr vom "hasattr"-Fall aus, da es andere Szenarien gibt, in denen diese Meldung ausgegeben wird, und die Meldung auch nicht mehrmals hintereinander aufgerufen wird - Sie erhalten für jeden Nutzungsversuch dieselbe Meldung. Der irreführende Begriff "kompiliert" wird durch "initialisiert" ersetzt.

  • [orm]

    Behobener Fehler in query.update(), bei dem die 'evaluate'- oder 'fetch'-Ablaufprüfung fehlschlagen würde, wenn der Schlüssel des Spaltenausdrucks ein Klassenattribut mit einem anderen Schlüsselnamen als dem tatsächlichen Spaltennamen war.

    Referenzen: #1935

  • [orm]

    Hinzugefügt: Eine Assertion während des Flush, die sicherstellt, dass keine NULL-haltigen Identitätsschlüssel für "neu persistente" Objekte generiert wurden. Dies kann auftreten, wenn benutzerdefinierter Code unbeabsichtigt Flushes auf nicht vollständig geladenen Objekten auslöst.

  • [orm]

    Lazy Loads für Relationship-Attribute verwenden nun den aktuellen Zustand, nicht den "commit-ten" Zustand, von Fremd- und Primärschlüsselattributen bei der Ausgabe von SQL, wenn kein Flush stattfindet. Zuvor wurde nur der datenbankcommit-te Zustand verwendet. Insbesondere würde dies einen Many-to-One get()-on-lazyload-Vorgang fehlschlagen lassen, da bei diesen Loads kein Autoflush ausgelöst wird, wenn die Attribute bestimmt sind und der "commit-te" Zustand möglicherweise nicht verfügbar ist.

    Referenzen: #1910

  • [orm]

    Ein neues Flag für relationship(), load_on_pending, ermöglicht es dem Lazy Loader, auf ausstehenden Objekten auszulösen, ohne dass ein Flush stattfindet, sowie auf einem transienten Objekt, das manuell "angehängt" wurde. Beachten Sie, dass dieses Flag Attributereignisse blockiert, wenn ein Objekt geladen wird, sodass Backrefs erst nach einem Flush verfügbar sind. Das Flag ist nur für sehr spezifische Anwendungsfälle gedacht.

  • [orm]

    Ein weiteres neues Flag für relationship(), cascade_backrefs, deaktiviert die "save-update"-Kaskade, wenn das Ereignis auf der "umgekehrten" Seite einer bidirektionalen Beziehung ausgelöst wurde. Dies ist ein saubereres Verhalten, sodass Many-to-Ones auf einem transienten Objekt gesetzt werden können, ohne dass es in das Objekt des Kindes einbezogen wird, während die Vorwärtskollktion weiterhin kaskadiert. Wir werden dies möglicherweise standardmäßig auf False in 0.7 setzen.

  • [orm]

    Leichte Verbesserung des Verhaltens von "passive_updates=False", wenn es nur auf der Many-to-One-Seite einer Beziehung platziert wird; die Dokumentation wurde klargestellt, dass passive_updates=False eigentlich auf der One-to-Many-Seite stehen sollte.

  • [orm]

    Das Platzieren von passive_deletes=True auf einem Many-to-One gibt eine Warnung aus, da Sie es wahrscheinlich auf der One-to-Many-Seite platzieren wollten.

  • [orm]

    Behobener Fehler, der "subqueryload" daran gehindert hätte, korrekt mit Single-Table-Inheritance für eine Beziehung von einer Subklasse zu funktionieren - das "where type in (x, y, z)" wird nur innen platziert, anstatt wiederholt.

  • [orm]

    Bei Verwendung von from_self() mit Single-Table-Inheritance wird das "where type in (x, y, z)" nur außerhalb der Abfrage platziert, anstatt wiederholt. Möglicherweise werden hier noch weitere Anpassungen vorgenommen.

  • [orm]

    scoped_session gibt eine Warnung aus, wenn configure() aufgerufen wird, wenn bereits eine Session vorhanden ist (prüft nur den aktuellen Thread).

    Referenzen: #1924

  • [orm]

    Die internen Abläufe von mapper.cascade_iterator() wurden überarbeitet, um Aufrufe von Methoden um etwa 9% unter bestimmten Umständen zu reduzieren.

    Referenzen: #1932

engine

  • [engine]

    Behobener Rückschritt in 0.6.4, bei dem die Änderung, die Cursorfehler konsistent auslöste, den result.lastrowid-Accessor kaputt machte. Testabdeckung wurde für result.lastrowid hinzugefügt. Beachten Sie, dass lastrowid nur von Pysqlite und einigen MySQL-Treibern unterstützt wird, sodass es im Allgemeinen nicht sehr nützlich ist.

  • [engine]

    Die von der Engine ausgegebene Log-Meldung, wenn eine Verbindung zum ersten Mal verwendet wird, lautet nun "BEGIN (implicit)", um zu betonen, dass DBAPI kein explizites begin() hat.

  • [engine]

    Hinzugefügt: "views=True"-Option zu metadata.reflect(), wird die Liste der verfügbaren Ansichten zu den zu reflektierenden hinzufügen.

    Referenzen: #1936

  • [engine]

    engine_from_config() akzeptiert nun 'debug' für 'echo', 'echo_pool', 'force' für 'convert_unicode', boolesche Werte für 'use_native_unicode'.

    Referenzen: #1899

sql

  • [sql]

    Behobener Fehler in TypeDecorator, bei dem der dialektspezifische Typ zur Generierung des DDL für einen bestimmten Typ herangezogen wurde, was nicht immer das korrekte Ergebnis lieferte.

  • [sql]

    TypeDecorator kann nun einen vollständig konstruierten Typ als "impl" angeben, zusätzlich zu einer Typklasse.

  • [sql]

    TypeDecorator platziert sich nun als resultierender Typ für einen binären Ausdruck, bei dem die Typumrechnungsregeln normalerweise seinen impl-Typ zurückgeben würden - zuvor wurde eine Kopie des impl-Typs zurückgegeben, die den TypeDecorator als "dialect" impl eingebettet hätte, dies war wahrscheinlich eine unbeabsichtigte Art, den gewünschten Effekt zu erzielen.

  • [sql]

    TypeDecorator.load_dialect_impl() gibt standardmäßig "self.impl" zurück, d.h. nicht den Dialekt-Implementierungstyp von "self.impl". Dies dient der korrekten Kompilierung. Das Verhalten kann wie zuvor auf die gleiche Weise vom Benutzer überschrieben werden.

  • [sql]

    Hinzugefügt: type_coerce(expr, type_) Ausdruckselement. Behandelt den gegebenen Ausdruck als den gegebenen Typ bei der Auswertung von Ausdrücken und der Verarbeitung von Ergebniszeilen, beeinflusst aber nicht die Generierung von SQL, abgesehen von einem anonymen Label.

  • [sql]

    Table.tometadata() kopiert nun auch Index-Objekte, die der Tabelle zugeordnet sind.

  • [sql]

    Table.tometadata() gibt eine Warnung aus, wenn die gegebene Tabelle bereits in der Ziel-MetaData vorhanden ist - das vorhandene Tabellenobjekt wird zurückgegeben.

  • [sql]

    Eine informative Fehlermeldung wird ausgegeben, wenn eine Spalte, der noch kein Name zugewiesen wurde (z.B. in deklarativen Konstrukten), in einem Kontext verwendet wird, in dem sie der Spaltenauflistung eines umschließenden select()-Konstrukts zugeordnet wird, oder wenn irgendein Konstrukt, das diese Spalte betrifft, kompiliert wird, bevor ihr Name zugewiesen wird.

  • [sql]

    as_scalar(), label() können auf einem wählbaren Element aufgerufen werden, das eine Spalte enthält, die noch keinen Namen hat.

    Referenzen: #1862

  • [sql]

    Behobener Rekursionsüberlauf, der auftreten konnte, wenn mit zwei Ausdrücken vom Typ "NullType" gearbeitet wurde, aber nicht mit der Singleton-Instanz NULLTYPE.

    Referenzen: #1907

postgresql

  • [postgresql]

    Hinzugefügt: "as_tuple"-Flag für den ARRAY-Typ, gibt Ergebnisse als Tupel anstelle von Listen zurück, um Hashing zu ermöglichen.

  • [postgresql]

    Behobener Fehler, der verhinderte, dass "domain", das aus einem benutzerdefinierten Typ wie "enum" erstellt wurde, reflektiert wurde.

    Referenzen: #1933

mysql

  • [mysql]

    Behobener Fehler bei der Reflexion des CURRENT_TIMESTAMP-Defaults in Verbindung mit der ON UPDATE-Klausel, dank Taavi Burns.

    Referenzen: #1940

mssql

  • [mssql]

    Behobener Reflexionsfehler, der unbekannte Typen nicht richtig behandelte.

    Referenzen: #1946

  • [mssql]

    Behobener Fehler, bei dem die Aliassierung von Tabellen mit "schema" nicht korrekt kompiliert wurde.

    Referenzen: #1943

  • [mssql]

    Die Reflexion von Indizes wurde neu geschrieben, um sys.catalogs zu verwenden, sodass Spaltennamen jeder Konfiguration (Leerzeichen, eingebettete Kommas usw.) reflektiert werden können. Beachten Sie, dass die Reflexion von Indizes SQL Server 2005 oder höher erfordert.

    Referenzen: #1770

  • [mssql]

    Das mssql+pymssql-Dialekt berücksichtigt nun den "port"-Teil der URL, anstatt ihn zu verwerfen.

    Referenzen: #1952

oracle

  • [oracle]

    Das Argument implicit_returning für create_engine() wird nun unabhängig von der erkannten Oracle-Version berücksichtigt. Zuvor wurde das Flag auf False gesetzt, wenn die Serverversion kleiner als 10 war.

    Referenzen: #1878

tests

  • [tests]

    Das NoseSQLAlchemyPlugin wurde in ein neues Paket "sqlalchemy_nose" verschoben, das zusammen mit "sqlalchemy" installiert wird. Dies dient dazu, dass das Skript "nosetests" wie gewohnt funktioniert, aber auch die Option --with-coverage ermöglicht, die Abdeckung einzuschalten, bevor SQLAlchemy-Module importiert werden, sodass die Abdeckung korrekt funktioniert.

misc

  • [declarative]

    @classproperty (bald/jetzt @declared_attr) wirkt sich auf __mapper_args__, __table_args__, __tablename__ auf einer Basisklasse aus, die keine Mixin ist, sowie auf Mixins aus.

    Referenzen: #1922

  • [declarative]

    Der offizielle Name/Ort von @classproperty für die Verwendung mit deklarativen Konstrukten ist sqlalchemy.ext.declarative.declared_attr. Dasselbe, aber es wird dorthin verschoben, da es eher ein "Marker" ist, der spezifisch für deklarative Konstrukte ist, nicht nur eine Attributtechnik.

    Referenzen: #1915

  • [declarative]

    Behobener Fehler, bei dem Spalten eines Mixins nicht korrekt auf ein Single-Table- oder Joined-Table-Vererbungsschema übertragen wurden, bei dem der Attributname anders war als der der Spalte.

    Referenzen: #1930, #1931

  • [declarative]

    Ein Mixin kann nun eine Spalte angeben, die eine Spalte mit demselben Namen überschreibt, die mit einer Oberklasse verbunden ist. Dank Oystein Haaland.

  • [informix]

    Umfangreiche Bereinigung / Modernisierung des Informix-Dialekts für 0.6, dank Florian Apolloner.

    Referenzen: #1906

  • [misc]

    CircularDependencyError hat nun .cycles und .edges Member, die die Menge der in einem oder mehreren Zyklen beteiligten Elemente und die Menge der Kanten als 2-Tupel sind.

    Referenzen: #1890

0.6.4

Veröffentlicht: Di 07. Sep 2010

orm

  • [orm]

    Der Name ConcurrentModificationError wurde in StaleDataError geändert, und beschreibende Fehlermeldungen wurden überarbeitet, um genau widerzuspiegeln, was das Problem ist. Beide Namen bleiben für absehbare Zeit verfügbar für Schemata, die möglicherweise ConcurrentModificationError in einer "except:"-Klausel angeben.

  • [orm]

    Hinzugefügt: Eine Mutex zur Identity Map, die Remove-Operationen gegen Iterationsmethoden sperrt, die nun vor der Rückgabe eines Iterators puffern. Dies liegt daran, dass asynchrones GC Elemente über den GC-Thread jederzeit entfernen kann.

    Referenzen: #1891

  • [orm]

    Die Session-Klasse ist nun in sqlalchemy.orm.* vorhanden. Wir bewegen uns weg von der Verwendung von create_session(), das nicht standardmäßige Defaults hat, für Situationen, in denen ein einstufiger Session-Konstruktor gewünscht wird. Die meisten Benutzer sollten jedoch sessionmaker() für allgemeine Zwecke verwenden.

  • [orm]

    query.with_parent() akzeptiert nun transiente Objekte und verwendet die nicht persistenten Werte ihrer pk/fk-Attribute, um das Kriterium zu formulieren. Die Dokumentation wird auch bezüglich des Zwecks von with_parent() klargestellt.

  • [orm]

    Die Argumente include_properties und exclude_properties für mapper() akzeptieren nun Column-Objekte als Mitglieder zusätzlich zu Zeichenketten. Dies dient dazu, gleichnamige Column-Objekte, wie sie in einem join() vorkommen, zu disambiguieren.

  • [orm]

    Eine Warnung wird nun ausgegeben, wenn ein Mapper gegen einen Join oder ein anderes einzelnes wählbares Element erstellt wird, das mehrere Spalten mit demselben Namen in seiner .c.-Sammlung enthält und diese Spalten nicht explizit als Teil derselben oder separaten Attribute (oder ausgeschlossen) benannt sind. In 0.7 wird diese Warnung zu einer Ausnahme. Beachten Sie, dass diese Warnung nicht ausgegeben wird, wenn die Kombination als Ergebnis von Vererbung auftritt, sodass Attribute weiterhin natürlich überschrieben werden können. In 0.7 wird dies weiter verbessert.

    Referenzen: #1896

  • [orm]

    Das Argument primary_key für mapper() kann nun eine Reihe von Spalten angeben, die nur ein Teilmengen der berechneten "Primärschlüssel"-Spalten des zugeordneten wählbaren Elements sind, ohne dass ein Fehler ausgelöst wird. Dies hilft in Situationen, in denen der effektive Primärschlüssel eines wählbaren Elements einfacher ist als die Anzahl der Spalten im wählbaren Element, die tatsächlich als "primary_key" markiert sind, wie z.B. ein Join zweier Tabellen über ihre Primärschlüsselspalten.

    Referenzen: #1896

  • [orm]

    Ein Objekt, das gelöscht wurde, erhält nun ein Flag 'deleted', das verhindert, dass das Objekt erneut zu der Sitzung hinzugefügt wird (re-add()), da das Objekt zuvor stillschweigend in der Identitätszuordnung verblieb, bis auf seine Attribute zugegriffen wurde. Die Funktion make_transient() setzt dieses Flag zusammen mit dem "key"-Flag zurück.

  • [orm]

    make_transient() kann sicher auf eine bereits transiente Instanz angewendet werden.

  • [orm]

    Eine Warnung wird in mapper() ausgegeben, wenn die Spalte polymorphic_on entweder in direkter oder abgeleiteter Form in der gemappten wählbaren oder in der with_polymorphic wählbaren nicht vorhanden ist, anstatt sie stillschweigend zu ignorieren. Erwarten Sie, dass dies in Version 0.7 zu einer Ausnahme wird.

  • [orm]

    Eine weitere Überarbeitung der Fehlermeldungen, die ausgegeben werden, wenn relationship() mit mehrdeutigen Argumenten konfiguriert ist. Die Einstellung "foreign_keys" wird nicht mehr erwähnt, da sie fast nie benötigt wird und es vorzuziehen ist, dass Benutzer korrekte ForeignKey-Metadaten einrichten, was nun die Empfehlung ist. Wenn "foreign_keys" verwendet wird und falsch ist, schlägt die Meldung vor, dass das Attribut wahrscheinlich unnötig ist. Die Dokumentation für das Attribut wird erweitert. Dies liegt daran, dass alle verwirrten relationship()-Benutzer im ML das Attribut foreign_keys wegen der Meldung zu verwenden scheinen, was sie nur noch weiter verwirrt, da Tabellenmetadaten viel klarer sind.

  • [orm]

    Wenn die "secondary" Tabelle keine ForeignKey-Metadaten hat und keine foreign_keys gesetzt sind, wird davon ausgegangen, dass die primary/secondaryjoin-Ausdrücke nur und alle Spalten in "secondary" als fremd betrachten, auch wenn der Benutzer fehlerhafte Informationen übergibt. Es ist ohnehin nicht möglich, dass die Fremdschlüssel bei "secondary" woanders liegen. Statt einer Fehlermeldung wird nun eine Warnung ausgegeben und die Zuordnung gelingt.

    Referenzen: #1877

  • [orm]

    Das Verschieben eines o2m-Objekts von einer Sammlung in eine andere oder umgekehrt, wobei das referenzierte Objekt durch ein m2o geändert wird, wobei der Fremdschlüssel auch ein Mitglied des Primärschlüssels ist, wird nun während des Flushes sorgfältiger geprüft, wenn die Änderung des Werts des Fremdschlüssels auf der "many"-Seite das Ergebnis einer Änderung des Primärschlüssels der "one"-Seite ist oder ob das "one" nur ein anderes Objekt ist. In einem Fall hätte eine kaskadierende DB den Wert bereits kaskadiert, und wir müssen den "neuen" PK-Wert betrachten, um ein UPDATE durchzuführen, im anderen müssen wir weiterhin den "alten" betrachten. Wir betrachten nun den "alten", unter der Annahme von passive_updates=True, es sei denn, wir wissen, dass eine PK-Umstellung die Änderung ausgelöst hat.

    Referenzen: #1856

  • [orm]

    Der Wert von version_id_col kann manuell geändert werden, und dies führt zu einem UPDATE der Zeile. Versionierte UPDATEs und DELETEs verwenden nun den "committed" Wert von version_id_col in der WHERE-Klausel und nicht den ausstehenden geänderten Wert. Der Versionsgenerator wird ebenfalls umgangen, wenn manuelle Änderungen am Attribut vorhanden sind.

    Referenzen: #1857

  • [orm]

    Die Verwendung von merge() mit konkreten erbenden Mappern wurde repariert. Solche Mapper haben häufig sogenannte "konkrete" Attribute, die Unterklassenattribute sind, die die Weitergabe vom Elternteil "deaktivieren" – diese mussten es einem merge()-Vorgang ermöglichen, ohne Wirkung durchzulaufen.

  • [orm]

    Die Angabe eines nicht spaltenbasierten Arguments für column_mapped_collection, einschließlich Zeichenketten, text() usw., löst eine Fehlermeldung aus, die speziell nach einem Spaltenelement fragt, anstatt mit falschen Informationen über text() oder literal() irrezuführen.

    Referenzen: #1863

  • [orm]

    Ebenso wird für relationship(), foreign_keys, remote_side, order_by – alle spaltenbasierten Ausdrücke erzwungen – Listen von Zeichenketten explizit nicht zugelassen, da dies ein sehr häufiger Fehler ist.

  • [orm]

    Dynamische Attribute unterstützen keine Sammlungsbefüllung – eine Assertion wurde hinzugefügt, wenn set_committed_value() aufgerufen wird, sowie wenn joinedload() oder subqueryload() Optionen auf ein dynamisches Attribut angewendet werden, anstatt zu einem Fehler / stillen Fehler zu führen.

    Referenzen: #1864

  • [orm]

    Fehler behoben, bei dem die Generierung einer Query, die von einer abgeleitet wurde, die dieselbe Spalte mit unterschiedlichen Bezeichnungsnamen wiederholt hatte, typischerweise in einigen UNION-Situationen, die inneren Spalten nicht vollständig an die äußere Query weitergab.

    Referenzen: #1852

  • [orm]

    object_session() löst die korrekte UnmappedInstanceError aus, wenn eine nicht zugeordnete Instanz übergeben wird.

    Referenzen: #1881

  • [orm]

    Weitere Memoisationen auf berechnete Mapper-Eigenschaften angewendet, mit einer erheblichen Reduzierung der Aufrufanzahl von mapper.py (~90%) in stark polygonalen Mapping-Konfigurationen.

  • [orm]

    Die private Methode mapper _get_col_to_prop, die vom Versionierungsbeispiel verwendet wird, ist veraltet; verwenden Sie stattdessen mapper.get_property_by_column(), die die öffentliche Methode dafür bleibt.

  • [orm]

    Das Versionierungsbeispiel funktioniert nun korrekt, wenn eine Spalte versioniert wird, die zuvor NULL war.

Beispiele

  • [examples]

    Das Beispiel beaker_caching wurde neu organisiert, sodass die Session, der Cache-Manager und declarative_base Teil der Umgebung sind und benutzerdefinierter Cache-Code portabel ist und nun innerhalb von "caching_query.py" liegt. Dies ermöglicht es dem Beispiel, einfacher in bestehende Projekte "eingefügt" zu werden.

  • [examples]

    Das History-Meta-Versionierungsrezept setzt "unique=False" beim Kopieren von Spalten, damit die Versionierungstabelle mehrere Zeilen mit wiederholten Werten verarbeiten kann.

    Referenzen: #1887

engine

  • [engine]

    Das Aufrufen von fetchone() oder ähnlichem auf einem Ergebnis, das bereits erschöpft, geschlossen wurde oder kein ergebnisrückgebendes Ergebnis ist, löst nun in allen Fällen, unabhängig vom Backend, ResourceClosedError aus, eine Unterklasse von InvalidRequestError. Zuvor lösten einige DBAPIs ProgrammingError aus (z.B. pysqlite), andere gaben None zurück, was zu nachgelagerten Fehlern führte (z.B. MySQL-python).

  • [engine]

    Fehler behoben, bei dem bei einer "disconnect"-Ereignis in der "initialize"-Phase des ersten Connection-Pool-Connects ein AttributeError ausgelöst wurde, wenn die Connection versuchte, die DBAPI-Verbindung zu invalidieren.

    Referenzen: #1894

  • [engine]

    Connection, ResultProxy sowie Session verwenden ResourceClosedError für alle Fehler vom Typ "Diese Verbindung/Transaktion/Ergebnis ist geschlossen".

  • [engine]

    Connection.invalidate() kann mehr als einmal aufgerufen werden, und nachfolgende Aufrufe tun nichts.

sql

  • [sql]

    Das Aufrufen von execute() auf einem alias()-Konstrukt wird für Version 0.7 zur Deprecation anstehen, da es selbst kein "ausführbares" Konstrukt ist. Es "leitet" derzeit sein inneres Element weiter und ist bedingt "ausführbar", aber das ist heutzutage nicht die Art von Mehrdeutigkeit, die wir mögen.

  • [sql]

    Die Methoden execute() und scalar() von ClauseElement werden nun entsprechend der Unterklasse Executable verschoben. ClauseElement.execute()/scalar() sind immer noch vorhanden und werden in Version 0.7 zur Deprecation anstehen, aber beachten Sie, dass diese ohnehin immer einen Fehler ausgelöst hätten, wenn Sie kein Executable wären (es sei denn, Sie wären ein alias(), siehe vorheriger Hinweis).

  • [sql]

    Einfache mathematische Ausdruckskonvertierung für Numeric->Integer wurde hinzugefügt, so dass der resultierende Typ Numeric ist, unabhängig von der Richtung des Ausdrucks.

  • [sql]

    Das Schema zur Generierung von gekürzten "auto"-Indexnamen bei Verwendung des Flags "index=True" für Column wurde geändert. Die Kürzung erfolgt nur beim automatisch generierten Namen, nicht bei einem benutzerdefinierten (andernfalls würde ein Fehler ausgelöst werden), und das Kürzungsschema selbst basiert nun auf einem Fragment eines md5-Hashs des Bezeichnernamens, so dass mehrere Indizes auf Spalten mit ähnlichen Namen weiterhin eindeutige Namen haben.

    Referenzen: #1855

  • [sql]

    Der generierte Indexname basiert auch auf einem Attribut "max index name length", das vom "max identifier length" getrennt ist – dies, um MySQL zu gefallen, das eine maximale Länge von 64 für Indexnamen hat, getrennt von seiner Gesamtlänge von 255.

    Referenzen: #1412

  • [sql]

    Der text()-Konstrukt gibt, wenn er in einer spaltenorientierten Situation platziert wird, zumindest NULLTYPE für seinen Typ zurück anstatt None, was ihm erlaubt, etwas freier für Ad-hoc-Spaltenausdrücke als zuvor verwendet zu werden. literal_column() ist jedoch immer noch die bessere Wahl.

  • [sql]

    Vollständige Beschreibung der übergeordneten Tabelle/Spalte, Ziel-Tabelle/Spalte wurde zur Fehlermeldung hinzugefügt, die ausgelöst wird, wenn ForeignKey das Ziel nicht auflösen kann.

  • [sql]

    Fehler behoben, bei dem das Ersetzen von Verbund-Fremdschlüsselspalten in einer reflektierten Tabelle dazu führte, dass ein Versuch unternommen wurde, die reflektierte Einschränkung ein zweites Mal aus der Tabelle zu entfernen, was einen KeyError auslöste.

    Referenzen: #1865

  • [sql]

    Das _Label-Konstrukt, d.h. das, das immer dann erzeugt wird, wenn man somecol.label() sagt, zählt nun sich selbst in seinem "proxy_set" mit dem des enthaltenen Spalten-Proxy-Sets vereint, anstatt direkt das des enthaltenen Spalten zurückzugeben. Dies ermöglicht Spaltenkorrespondenzoperationen, die von der Identität der _Labels selbst abhängen, das korrekte Ergebnis zurückzugeben.

  • [sql]

    behebt ORM-Fehler.

    Referenzen: #1852

postgresql

  • [postgresql]

    Das psycopg2-Dialekt wurde korrigiert, um seine set_isolation_level()-Methode zu verwenden, anstatt sich auf den Basisbefehl "SET SESSION ISOLATION" zu verlassen, da psycopg2 andernfalls den Isolationsgrad bei jeder neuen Transaktion zurücksetzt.

mssql

  • [mssql]

    Die Abfrage "default schema" wurde korrigiert, um mit dem pymssql-Backend zu funktionieren.

oracle

  • [oracle]

    Der ROWID-Typ wurde dem Oracle-Dialekt hinzugefügt, für Fälle, in denen ein explizites CAST benötigt werden könnte.

    Referenzen: #1879

  • [oracle]

    Die Oracle-Reflexion von Indizes wurde optimiert, so dass Indizes, die einige oder alle Primärschlüsselspalten enthalten, aber nicht denselben Satz von Spalten wie der Primärschlüssel, reflektiert werden. Indizes, die identische Spalten wie der Primärschlüssel enthalten, werden bei der Reflexion übersprungen, da der Index in diesem Fall als der automatisch generierte Primärschlüsselindex angenommen wird. Zuvor wurde jeder Index mit vorhandenen PK-Spalten übersprungen. Vielen Dank an Kent Bower für den Patch.

    Referenzen: #1867

  • [oracle]

    Oracle reflektiert nun die Namen von Primärschlüsselbeschränkungen – ebenfalls Dank an Kent Bower.

    Referenzen: #1868

misc

  • [declarative]

    Wenn @classproperty mit einem regulären klassengebundenen Mapper-Eigenschaftsattribut verwendet wird, wird es aufgerufen, um den tatsächlichen Attributwert während der Initialisierung zu erhalten. Derzeit gibt es keinen Vorteil, @classproperty auf einem Spalten- oder Beziehungsattribut einer deklarativen Klasse zu verwenden, die keine Mixin ist – die Auswertung erfolgt zur gleichen Zeit, als ob @classproperty nicht verwendet worden wäre. Aber hier lassen wir es zumindest wie erwartet funktionieren.

  • [declarative]

    Fehler behoben, bei dem die Meldung "Can't add additional column" den falschen Namen anzeigte.

  • [firebird]

    Fehler behoben, bei dem ein Spaltendefaultwert nicht reflektiert wurde, wenn das Schlüsselwort "default" kleingeschrieben war.

  • [informix]

    Patches wurden angewendet, um die grundlegende Informix-Funktionalität wiederherzustellen. Wir verlassen uns auf Endbenutzertests, um sicherzustellen, dass Informix bis zu einem gewissen Grad funktioniert.

    Referenzen: #1904

  • [documentation]

    Die Dokumentation wurde neu organisiert, sodass der Abschnitt "API Reference" verschwunden ist – alle Docstrings von dort, die öffentliche API waren, wurden in den Kontext des Hauptabschnitts verschoben, der darüber spricht. Die Hauptdokumentation ist in die Abschnitte "SQLAlchemy Core" und "SQLAlchemy ORM" unterteilt, Mapper/Relationship-Dokumente wurden ausgelagert. Viele Abschnitte wurden neu geschrieben und/oder neu organisiert.

0.6.3

Veröffentlicht: Do 15. Juli 2010

orm

  • [orm]

    Falsche Many-to-Many-Ladung im Unit of Work entfernt, die unnötigerweise bei abgelaufenen/unloaded Sammlungen ausgelöst wurde. Diese Ladung erfolgt nun nur, wenn passive_updates False ist und der übergeordnete Primärschlüssel geändert wurde, oder wenn passive_deletes False ist und ein Löschen des übergeordneten Elements stattgefunden hat.

    Referenzen: #1845

  • [orm]

    Spaltenentitäten (d.h. query(Foo.id)) kopieren ihren Zustand vollständiger, wenn Abfragen von ihnen selbst + einer wählbaren abgeleitet werden (d.h. from_self(), union() usw.), so dass join() und ähnliches den korrekten Zustand zum Arbeiten haben.

    Referenzen: #1853

  • [orm]

    Fehler behoben, bei dem Query.join() fehlschlug, wenn eine nicht-ORM-Spalte abgefragt und dann ohne eine on-Klausel verbunden wurde, wenn bereits eine FROM-Klausel vorhanden war. Nun wird eine geprüfte Ausnahme ausgelöst, genauso wie wenn die Klausel nicht vorhanden ist.

    Referenzen: #1853

  • [orm]

    Die Prüfung auf eine "nicht zugeordnete Klasse" wurde verbessert, einschließlich des Falls, in dem die Oberklasse zugeordnet ist, die Unterklasse jedoch nicht. Jeder Versuch, auf cls._sa_class_manager.mapper zuzugreifen, löst nun UnmappedClassError() aus.

    Referenzen: #1142

  • [orm]

    Die "column_descriptions"-Zugriffsmethode wurde zu Query hinzugefügt. Sie gibt eine Liste von Dictionaries zurück, die Namens-/Typinformationen über die Entitäten enthalten, die die Query zurückgeben wird. Dies kann für den Aufbau von GUIs auf ORM-Abfragen hilfreich sein.

mysql

  • [mysql]

    Die Methode _extract_error_code() funktioniert nun korrekt mit jedem MySQL-Dialekt (MySQL-python, OurSQL, MySQL-Connector-Python, PyODBC). Zuvor schlug die Reconnect-Logik bei OperationalError-Bedingungen fehl, da aber MySQLdb und OurSQL ihre eigene Reconnect-Funktion haben, gab es hier keine Symptome für diese Treiber, es sei denn, man beobachtete die Logs.

    Referenzen: #1848

oracle

  • [oracle]

    Weitere Anpassungen an der cx_oracle Decimal-Handhabung. "Mehrdeutige" Numeriken ohne Dezimalstelle werden auf der Ebene des Verbindungsbehandlers in int umgewandelt. Der Vorteil hierbei ist, dass ints als ints zurückkommen, ohne dass SQLA-Typobjekte beteiligt sind und ohne unnötige Konvertierung in Decimal zuerst.

    Leider können einige exotische Subquery-Fälle sogar unterschiedliche Typen zwischen einzelnen Ergebniszeilen aufweisen, so dass der Numeric-Handler, wenn er angewiesen wird, Decimal zurückzugeben, nicht vollständig von der "native decimal"-Modus Gebrauch machen kann und bei jedem Wert isinstance() ausführen muss, um zu prüfen, ob es bereits Decimal ist. Wiedereröffnung von

    Referenzen: #1840

0.6.2

Veröffentlicht: Di 06. Juli 2010

orm

  • [orm]

    Query.join() prüft auf einen Aufruf der Form query.join(target, clause_expression), d.h. das Tupel fehlt, und gibt eine informative Fehlermeldung aus, dass dies die falsche Aufrufform ist.

  • [orm]

    Fehler behoben bezüglich Flushes auf selbst-referenziellen bidirektionalen Many-to-Many-Beziehungen, bei denen zwei Objekte, die sich gegenseitig in einem Flush referenzieren, keine Zeile für beide Seiten einfügen konnten. Regression von 0.5.

    Referenzen: #1824

  • [orm]

    Die post_update-Funktion von relationship() wurde architektonisch überarbeitet, um besser in die neue Unit of Work von 0.6 integriert zu werden. Der Grund für die Änderung ist, dass mehrere "post update"-Aufrufe, die jeweils unterschiedliche Fremdschlüsselspalten derselben Zeile betreffen, in einer einzigen UPDATE-Anweisung ausgeführt werden, anstatt einer UPDATE-Anweisung pro Spalte pro Zeile. Mehrere Zeilen-Updates werden auch, soweit möglich, in executemany()s gebündelt, während eine konsistente Zeilenreihenfolge beibehalten wird.

  • [orm]

    Query.statement, Query.subquery() usw. übertragen nun die Werte von Bindungsparametern, d.h. jene, die mit query.params() angegeben wurden, in den resultierenden SQL-Ausdruck. Zuvor wurden die Werte nicht übertragen und Bindungsparameter kamen als None heraus.

  • [orm]

    Subquery-Eager-Loading funktioniert nun mit Query-Objekten, die params() enthalten, sowie mit get()-Abfragen.

  • [orm]

    make_transient() kann nun auf einer Instanz aufgerufen werden, auf die über Many-to-One von Elternobjekten verwiesen wird, ohne dass der Fremdschlüsselwert des Elternteils vorübergehend auf None gesetzt wird – dies war eine Funktion des "detect primary key switch" Flush-Handlers. Er ignoriert nun Objekte, die sich nicht mehr im "persistenten" Zustand befinden, und der Fremdschlüssel-Identifikator des Elternteils bleibt unberührt.

  • [orm]

    query.order_by() akzeptiert nun False, was jeden bestehenden order_by()-Status auf der Query abbricht und es nachfolgenden generativen Methoden, die kein ORDER BY unterstützen, ermöglicht, aufgerufen zu werden. Dies ist nicht dasselbe wie die bereits vorhandene Funktion, None zu übergeben, die alle bestehenden order_by()-Einstellungen unterdrückt, einschließlich der auf dem Mapper konfigurierten. False bewirkt, als ob order_by() nie aufgerufen worden wäre, während None eine aktive Einstellung ist.

  • [orm]

    Eine Instanz, die in den "transient"-Zustand versetzt wird, unvollständige oder fehlende Primärschlüsselattribute hat und abgelaufene Attribute enthält, löst InvalidRequestError aus, wenn auf ein abgelaufenes Attribut zugegriffen wird, anstatt einen Rekursionsüberlauf zu erleiden.

  • [orm]

    Die Funktion make_transient() ist nun in der generierten Dokumentation enthalten.

  • [orm]

    make_transient() entfernt alle "loader"-Aufrufbaren aus dem Zustand, der transient gemacht wird, entfernt jeden "abgelaufenen" Zustand – alle nicht geladenen Attribute werden bei Zugriff auf undefiniert, None/leer zurückgesetzt.

sql

  • [sql]

    Die von den Unicode- und String-Typen mit convert_unicode=True ausgegebene Warnung enthält nicht mehr den tatsächlichen übergebenen Wert. Dies geschieht, damit das Python-Warnungsregister nicht weiter an Größe zunimmt, die Warnung einmalig gemäß den Warnungsfiltereinstellungen ausgegeben wird und große Zeichenkettenwerte die Ausgabe nicht verunreinigen.

    Referenzen: #1822

  • [sql]

    Fehler behoben, der die Arbeit der überschriebenen Klauselkompilierung für "annotierte" Ausdruckselemente, die oft vom ORM generiert werden, verhinderte.

  • [sql]

    Das Argument für "ESCAPE" eines LIKE-Operators oder ähnlichem wird durch render_literal_value() übergeben, welches möglicherweise Backslashes maskiert.

    Referenzen: #1400

  • [sql]

    Fehler im Enum-Typ behoben, der das native_enum-Flag zerstörte, wenn es mit TypeDecorators oder anderen Anpassungsszenarien verwendet wurde.

  • [sql]

    Inspector greift auf bind.connect() zu, wenn er aufgerufen wird, um sicherzustellen, dass initialize aufgerufen wurde. Der interne Name ".conn" wird in ".bind" geändert, da dies das ist, was es ist.

  • [sql]

    Die internen Abläufe der "Spaltenannotation" wurden so modifiziert, dass eine benutzerdefinierte Spaltensubklasse _constructor sicher überschreiben kann, um Column zurückzugeben, für die Zwecke der Erstellung "konfigurativer" Spaltenklassen, die nicht an Proxying usw. beteiligt sind.

  • [sql]

    Column.copy() übernimmt unter anderem das Attribut "unique", Korrekturen bezüglich deklarativer Mixins.

    Referenzen: #1829

postgresql

  • [postgresql]

    render_literal_value() wird überschrieben, was Backslashes maskiert, dies gilt derzeit für die ESCAPE-Klausel von LIKE und ähnlichen Ausdrücken. Letztendlich muss dies den Wert von "standard_conforming_strings" erkennen, um das volle Verhalten zu erzielen.

    Referenzen: #1400

  • [postgresql]

    Es werden keine "CREATE TYPE" / "DROP TYPE" generiert, wenn types.Enum auf einer PG-Version vor 8.3 verwendet wird – das supports_native_enum-Flag wird vollständig beachtet.

    Referenzen: #1836

mysql

  • [mysql]

    Das MySQL-Dialekt gibt kein CAST() für MySQL-Versionen kleiner als 4.0.2 aus. Dies ermöglicht die Fortsetzung der Unicode-Prüfung bei der Verbindung.

    Referenzen: #1826

  • [mysql]

    Das MySQL-Dialekt erkennt nun den NO_BACKSLASH_ESCAPES SQL-Modus, zusätzlich zu ANSI_QUOTES.

  • [mysql]

    render_literal_value() wird überschrieben, was Backslashes maskiert, dies gilt derzeit für die ESCAPE-Klausel von LIKE und ähnlichen Ausdrücken. Dieses Verhalten ergibt sich aus der Erkennung des Wertes von NO_BACKSLASH_ESCAPES.

    Referenzen: #1400

mssql

  • [mssql]

    Wenn server_version_info außerhalb des üblichen Bereichs (8, ), (9, ), (10, ) liegt, wird eine Warnung ausgegeben, die darauf hinweist, die FreeTDS-Version so zu konfigurieren, dass 7.0 oder 8.0, nicht 4.2 verwendet wird.

    Referenzen: #1825

oracle

  • [oracle]

    ORA-8-Kompatibilitätsflags wurden korrigiert, so dass sie keinen veralteten Wert cachen, bevor die erste Datenbankverbindung tatsächlich stattfindet.

    Referenzen: #1819

  • [oracle]

    Die Metadaten des Oracle-eigenen "native decimal" beginnen, mehrdeutige Typinformationen über Numeriken zurückzugeben, wenn Spalten in Subqueries eingebettet sind und wenn ROWNUM mit Subqueries abgefragt wird, wie wir es für limit/offset tun. Wir haben diese mehrdeutigen Bedingungen zum cx_oracle "convert to Decimal()"-Handler hinzugefügt, so dass wir Numeriken in mehr Fällen als Decimal anstelle von Floats erhalten. Diese werden dann, falls gewünscht, in Integer oder Float umgewandelt oder ansonsten als verlustfreies Decimal beibehalten.

    Referenzen: #1840

misc

  • [firebird]

    Falsche Signatur in do_execute() behoben, Fehler in 0.6.1 eingeführt.

    Referenzen: #1823

  • [firebird]

    Das Firebird-Dialekt fügt die Typen CHAR und VARCHAR hinzu, die ein "charset"-Flag akzeptieren, um die Firebird "CHARACTER SET"-Klausel zu unterstützen.

    Referenzen: #1813

  • [declarative]

    Unterstützung für @classproperty wurde hinzugefügt, um jede Art von Schema-/Mapping-Konstrukt von einem deklarativen Mixin bereitzustellen, einschließlich Spalten mit Fremdschlüsseln, Beziehungen, column_property, deferred. Dies löst alle solchen Probleme bei deklarativen Mixins. Es wird ein Fehler ausgelöst, wenn eine MapperProperty-Unterklasse auf einem Mixin ohne Verwendung von @classproperty angegeben wird.

    Referenzen: #1751, #1796, #1805

  • [declarative]

    Eine Mixin-Klasse kann nun eine Spalte definieren, die mit einer Spalte übereinstimmt, die in einem __table__ definiert ist, das in einer Unterklasse definiert ist. Sie kann jedoch keine definieren, die nicht in der __table__ vorhanden ist, und die Fehlermeldung hier funktioniert nun.

    Referenzen: #1821

  • [compiler] [extension]

    Der „default“-Compiler wird automatisch kopiert, wenn die Kompilierung einer eingebauten Klauselkonstruktion überschrieben wird, sodass kein KeyError ausgelöst wird, wenn der benutzerdefinierte Compiler für bestimmte Backends spezifisch ist und die Kompilierung für ein anderes Backend aufgerufen wird.

    Referenzen: #1838

  • [documentation]

    Dokumentation für den Inspector hinzugefügt.

    Referenzen: #1820

  • [documentation]

    Die Dekorierer @memoized_property und @memoized_instancemethod wurden korrigiert, sodass die Sphinx-Dokumentation diese Attribute und Methoden, wie z. B. ResultProxy.inserted_primary_key, erfasst.

    Referenzen: #1830

0.6.1

Veröffentlicht: Mo 31. Mai 2010

orm

  • [orm]

    Ein Rückschritt, der in 0.6.0 eingeführt wurde und die unsachgemäße Historienbuchhaltung für veränderliche Attribute betraf, wurde behoben.

    Referenzen: #1782

  • [orm]

    Ein Rückschritt, der in der Unit-of-Work-Umgestaltung von 0.6.0 eingeführt wurde und die Updates für bidirektionale relationship() mit post_update=True brach, wurde behoben.

    Referenzen: #1807

  • [orm]

    session.merge() wird keine Attribute auf der zurückgegebenen Instanz ablaufen lassen, wenn diese Instanz „pending“ ist.

    Referenzen: #1789

  • [orm]

    Die Methode __setstate__ von CollectionAdapter wurde korrigiert, sodass sie während der Deserialisierung nicht fehlschlägt, wenn die übergeordnete InstanceState noch nicht deserialisiert wurde.

    Referenzen: #1802

  • [orm]

    Eine interne Warnung wurde hinzugefügt für den Fall, dass eine Instanz ohne vollständigen PK abgelaufen ist und dann versucht wurde, sie zu aktualisieren.

    Referenzen: #1797

  • [orm]

    Aggressivere Zwischenspeicherung für die Verwendung von UPDATE-, INSERT- und DELETE-Ausdrücken durch den Mapper wurde hinzugefügt. Unter der Annahme, dass die Anweisung keine pro Objekt SQL-Ausdrücke angehängt hat, werden die Ausdrucksobjekte vom Mapper nach der ersten Erstellung zwischengespeichert und ihre kompilierte Form wird dauerhaft in einem Cache-Wörterbuch für die Dauer der zugehörigen Engine gespeichert. Der Cache ist ein LRUCache für den seltenen Fall, dass ein Mapper eine extrem hohe Anzahl unterschiedlicher Spaltenmuster als UPDATEs erhält.

sql

  • [sql]

    expr.in_() akzeptiert jetzt ein text()-Konstrukt als Argument. Gruppierungsklammern werden automatisch hinzugefügt, d. h. die Verwendung ist wie col.in_(text(“select id from table”)).

    Referenzen: #1793

  • [sql]

    Spalten vom Typ _Binary (d. h. LargeBinary, BLOB usw.) konvertieren eine „basestring“ auf der rechten Seite ebenfalls in ein _Binary, damit die erforderliche DBAPI-Verarbeitung stattfindet.

  • [sql]

    table.add_is_dependent_on(othertable) wurde hinzugefügt, ermöglicht die manuelle Platzierung von Abhängigkeitsregeln zwischen zwei Table-Objekten für die Verwendung innerhalb von create_all(), drop_all(), sorted_tables.

    Referenzen: #1801

  • [sql]

    Ein Fehler wurde behoben, der die implizite RETURNING-Funktion bei zusammengesetzten Primärschlüsseln, die Nullen enthielten, beeinträchtigte.

    Referenzen: #1778

  • [sql]

    Ein fehlerhafter Leerschritt beim Generieren von ADD CONSTRAINT für eine benannte UNIQUE-Beschränkung wurde behoben.

  • [sql]

    Das Argument „table“ im Konstruktor von ForeignKeyConstraint wurde behoben.

    Referenzen: #1571

  • [sql]

    Ein Fehler im Cursor-Wrapper des Connection-Pools wurde behoben, bei dem, wenn ein Cursor beim Schließen() eine Ausnahme auslöste, die Protokollierung der Nachricht fehlschlug.

    Referenzen: #1786

  • [sql]

    Die Methode _make_proxy() von ColumnClause und Column verwendet nun self.__class__, um die Klasse des zurückzugebenden Objekts zu ermitteln, anstatt ColumnClause/Column fest zu kodieren, was es etwas einfacher macht, spezifische Unterklassen dieser zu erstellen, die in Alias-/Subquery-Situationen funktionieren.

  • [sql]

    func.XXX() löst nicht unbeabsichtigt zu Nicht-Funktions-Klassen auf (z. B. behebt func.text()).

    Referenzen: #1798

mysql

  • [mysql]

    func.sysdate() gibt auf MySQL „SYSDATE()“ aus, d. h. mit den schließenden Klammern.

    Referenzen: #1794

sqlite

  • [sqlite]

    Die Verkettung von Einschränkungen wurde behoben, als die Einschränkung „PRIMARY KEY“ aufgrund des gerenderten SQLite AUTOINCREMENT-Schlüsselworts auf Spaltenebene verschoben wurde.

    Referenzen: #1812

oracle

  • [oracle]

    Es wurde eine Prüfung für cx_oracle-Versionen niedriger als Version 5 hinzugefügt. In diesem Fall wird der inkompatible „output type handler“ nicht verwendet. Dies wirkt sich auf die Dezimalgenauigkeit und einige Unicode-Handling-Probleme aus.

    Referenzen: #1775

  • [oracle]

    Der Modus use_ansi=False, der in fast allen Fällen fehlerhafte WHERE-Klauseln erzeugte, wurde behoben.

    Referenzen: #1790

  • [oracle]

    Die Unterstützung für Oracle 8 mit cx_oracle wurde wiederhergestellt, einschließlich der automatischen Einstellung von use_ansi auf False, NVARCHAR2 und NCLOB werden nicht für Unicode gerendert, die Prüfung auf „native unicode“ schlägt nicht fehl, der „native unicode“-Modus von cx_oracle ist deaktiviert, VARCHAR() wird mit Byte-Anzahl anstelle von Zeichenanzahl ausgegeben.

    Referenzen: #1808

  • [oracle]

    oracle_xe 5 akzeptiert in seinem Verbindungsstring im normalen Python 2.x-Modus kein Python-Unicode-Objekt – daher konvertieren wir direkt zu str(). Nicht-ASCII-Zeichen werden in Verbindungsstrings hier nicht unterstützt, da wir nicht wissen, welche Kodierung wir verwenden könnten.

    Referenzen: #1670

  • [oracle]

    FOR UPDATE wird in der syntaktisch korrekten Position ausgegeben, wenn limit/offset verwendet wird, d. h. die ROWNUM-Subquery. Oracle kann jedoch FOR UPDATE mit ORDER BY oder mit Subqueries nicht wirklich verarbeiten, daher ist es immer noch nicht sehr nutzbar, aber zumindest überschreitet SQLA die SQL-Abfrage, um den Oracle-Parser zu passieren.

    Referenzen: #1815

misc

  • [engines]

    Die Erstellung der C-Erweiterungen unter Python 2.4 wurde behoben.

    Referenzen: #1781

  • [engines]

    Pool-Klassen werden nach einem dispose() dieselbe „pool_logging_name“-Einstellung wiederverwenden.

  • [engines]

    Engine erhält ein „execution_options“-Argument und die Methode update_execution_options(), die für alle von dieser Engine generierten Verbindungen gelten.

  • [firebird]

    Es wurde eine Bezeichnung für die in has_table() und has_sequence() verwendete Abfrage hinzugefügt, um mit älteren Firebird-Versionen zu arbeiten, die keine Bezeichnungen für Ergebnisspalten bereitstellen.

    Referenzen: #1521

  • [firebird]

    Es wurde eine Ganzzahlkonvertierung zum Attribut „type_conv“ hinzugefügt, wenn es über die Abfragezeichenkette übergeben wird, damit es von Kinterbasdb ordnungsgemäß interpretiert wird.

    Referenzen: #1779

  • [firebird]

    „Verbindungstrennung“ wurde zur Liste der Ausnahmetexte hinzugefügt, die eine getrennte Verbindung angeben.

    Referenzen: #1646

  • [sqlsoup]

    Der SqlSoup-Konstruktor akzeptiert ein base-Argument, das die Basisklasse angibt, die für zugeordnete Klassen verwendet werden soll, wobei der Standardwert object ist.

    Referenzen: #1783

0.6.0

Veröffentlicht: So 18. April 2010

orm

  • [orm]

    Die internen Abläufe der Unit of Work wurden neu geschrieben. Units of Work mit einer großen Anzahl von Objekten und abhängigen Objekten können nun ohne Rekursionsüberläufe geleert werden, da keine rekursiven Aufrufe mehr verwendet werden. Die Anzahl der internen Strukturen bleibt für einen bestimmten Sitzungszustand konstant, unabhängig davon, wie viele Beziehungen in den Zuordnungen vorhanden sind. Der Ereignisablauf entspricht nun einer linearen Liste von Schritten, die von den Mappern und Beziehungen basierend auf der tatsächlich auszuführenden Arbeit generiert werden und durch eine einzige topologische Sortierung zur korrekten Reihenfolge gefiltert werden. Flush-Aktionen werden mit weitaus weniger Schritten und weniger Speicher zusammengestellt.

    Referenzen: #1081, #1742

  • [orm]

    Zusammen mit der UOW-Neufassung wird auch ein Problem behoben, das in 0.6beta3 bezüglich der topologischen Zykluserkennung für Units of Work mit langen Abhängigkeitszyklen eingeführt wurde. Wir verwenden nun einen von Guido geschriebenen Algorithmus (danke, Guido!).

  • [orm]

    One-to-Many-Beziehungen pflegen nun eine Liste positiver Eltern-Kind-Assoziationen innerhalb des Flush, wodurch verhindert wird, dass vorherige als gelöscht markierte Eltern ein Löschen oder einen NULL-Fremdschlüssel auf diesen Kindobjekten auslösen, obwohl der Endbenutzer das Kind nicht aus der alten Assoziation entfernt hat.

    Referenzen: #1764

  • [orm]

    Ein „lazy load“ einer Sammlung schaltet das Standard-Eagerloading auf der umgekehrten Many-to-One-Seite aus, da dieses Laden per Definition unnötig ist.

    Referenzen: #1495

  • [orm]

    Session.refresh() führt nun zuerst ein äquivalentes expire() für die gegebene Instanz durch, sodass die „refresh-expire“-Kaskade propagiert wird. Zuvor wurde refresh() in keiner Weise von der Anwesenheit der „refresh-expire“-Kaskade beeinflusst. Dies ist eine Verhaltensänderung gegenüber 0.6beta2, bei der das an refresh() übergebene Flag „lockmode“ eine Versionsprüfung auslöste. Da die Instanz zuerst abgelaufen wird, aktualisiert refresh() das Objekt immer auf die aktuellste Version.

  • [orm]

    Die „refresh-expire“-Kaskade löscht ein „pending“-Objekt, wenn die Kaskade auch „delete-orphan“ enthält, oder trennt es ansonsten einfach.

    Referenzen: #1754

  • [orm]

    id(obj) wird nicht mehr intern in topological.py verwendet, da die Sortierfunktionen nun nur noch hashbare Objekte benötigen.

    Referenzen: #1756

  • [orm]

    Der ORM wird den Docstring aller generierten Deskriptoren standardmäßig auf None setzen. Dies kann mit „doc“ überschrieben werden (oder wenn Sphinx verwendet wird, funktionieren auch Attribut-Docstrings).

  • [orm]

    Das Schlüsselwort-Argument ‚doc‘ wurde zu allen Mapper-Eigenschaftsaufrufbaren sowie zu Column() hinzugefügt. Es wird den String ‚doc‘ als Attribut ‚__doc__‘ auf dem Deskriptor zusammenstellen.

  • [orm]

    Die Verwendung von version_id_col auf einem Backend, das cursor.rowcount für execute() unterstützt, aber nicht für executemany(), funktioniert nun bei einem gelöschten Datensatz (bei Saves funktionierte es bereits, da diese keine executemany() verwenden). Für ein Backend, das cursor.rowcount überhaupt nicht unterstützt, wird wie bei Saves eine Warnung ausgegeben.

    Referenzen: #1761

  • [orm]

    Der ORM speichert nun kurzfristig die „kompilierte“ Form von insert()- und update()-Konstrukten zwischen, wenn Listen von Objekten derselben Klasse geleert werden. Dadurch werden redundante Kompilierungen pro individuellem INSERT/UPDATE innerhalb eines einzelnen flush()-Aufrufs vermieden.

  • [orm]

    Die internen Methoden getattr(), setattr(), getcommitted() von ColumnProperty, CompositeProperty, RelationshipProperty wurden unterstrichen (d. h. sind privat), die Signatur hat sich geändert.

examples

  • [examples]

    Das Beispiel attribute_shard.py wurde aktualisiert, um eine robustere Methode zum Durchsuchen einer Query nach binären Ausdrücken zu verwenden, die Spalten mit literalen Werten vergleichen.

sql

  • [sql]

    Einige Bind-Label-Logiken aus 0.5 wurden wiederhergestellt, die sicherstellt, dass Tabellen mit Spaltennamen, die mit einer anderen Spalte der Form „<tabellenname>_<spaltenname>“ überlappen, keine Fehler erzeugen, wenn column._label während eines UPDATE als Bindungsname verwendet wird. Testabdeckung, die in 0.5 nicht vorhanden war, wurde hinzugefügt.

    Referenzen: #1755

  • [sql]

    somejoin.select(fold_equivalents=True) ist nicht mehr veraltet und wird schließlich in eine umfassendere Version der Funktion für .

    Referenzen: #1729

  • [sql]

    der Numeric-Typ löst eine *enorme* Warnung aus, wenn erwartet wird, dass Floats von einem DBAPI, der Floats zurückgibt, in Decimal konvertiert werden. Dies betrifft SQLite, Sybase, MS-SQL.

    Referenzen: #1759

  • [sql]

    Ein Fehler in der Ausdruckstypisierung wurde behoben, der eine Endlosschleife für Ausdrücke mit zwei NULL-Typen verursachte.

  • [sql]

    Ein Fehler in der execution_options()-Funktion wurde behoben, bei dem die vorhandenen Transaktions- und anderen Zustandsinformationen der übergeordneten Verbindung nicht an die Unterverbindung weitergegeben wurden.

  • [sql]

    Neue Ausführungsoption „compiled_cache“ wurde hinzugefügt. Ein Wörterbuch, in dem Compiled-Objekte zwischengespeichert werden, wenn die Connection eine Klauselkonstruktion in ein Dialekt- und parameterspezifisches Compiled-Objekt kompiliert. Es liegt in der Verantwortung des Benutzers, die Größe dieses Wörterbuchs zu verwalten, das Schlüssel enthält, die dem Dialekt, dem Klauselobjekt, den Spaltennamen in der VALUES- oder SET-Klausel eines INSERT- oder UPDATE sowie dem „Batch“-Modus für eine INSERT- oder UPDATE-Anweisung entsprechen.

  • [sql]

    get_pk_constraint() wurde zu reflection.Inspector hinzugefügt, ähnlich wie get_primary_keys(), außer dass es ein Wörterbuch zurückgibt, das den Namen der Einschränkung enthält, für unterstützte Backends (bisher PG).

    Referenzen: #1769

  • [sql]

    Table.create() und Table.drop() wenden keine Metadaten-Level-Create/Drop-Ereignisse mehr an.

    Referenzen: #1771

postgresql

  • [postgresql]

    PostgreSQL spiegelt nun Sequenznamen, die mit SERIAL-Spalten verbunden sind, korrekt wider, nachdem der Name der Sequenz geändert wurde. Dank Kumar McMillan für den Patch.

    Referenzen: #1071

  • [postgresql]

    Fehlender Import im Typ psycopg2._PGNumeric wurde repariert, wenn eine unbekannte numerische Zahl empfangen wird.

  • [postgresql]

    psycopg2/pg8000-Dialekte sind nun mit den Rückgabetypen REAL[], FLOAT[], DOUBLE_PRECISION[], NUMERIC[] vertraut, ohne eine Ausnahme auszulösen.

  • [postgresql]

    PostgreSQL spiegelt den Namen von Primärschlüsselbeschränkungen wider, falls eine vorhanden ist.

    Referenzen: #1769

oracle

  • [oracle]

    Es werden nun cx_oracle-Ausgabekonverter verwendet, sodass die DBAPI die von uns bevorzugten Wertetypen nativ zurückgibt.

  • [oracle]

    NUMBER-Werte mit positiver Präzision + Skalierung werden in cx_oracle.STRING und dann in Decimal konvertiert. Dies ermöglicht eine perfekte Präzision für den Numeric-Typ bei der Verwendung von cx_oracle.

    Referenzen: #1759

  • [oracle]

    STRING/FIXED_CHAR werden nun nativ in Unicode konvertiert. SQLAlchemys String-Typen müssen dann keine Konvertierungen mehr anwenden.

misc

  • [engines]

    Die C-Erweiterung funktioniert nun auch mit DBAPIs, die benutzerdefinierte Sequenzen als Zeilen (und nicht nur als Tupel) verwenden.

    Referenzen: #1757

  • [ext]

    Die Compiler-Erweiterung erlaubt nun @compiles-Dekoratoren auf Basisklassen, die sich auf Unterklassen erstrecken, und @compiles-Dekoratoren auf Unterklassen, die nicht durch einen @compiles-Dekorator auf der Basisklasse kaputtgehen.

  • [ext]

    Declarative löst eine informative Fehlermeldung aus, wenn ein nicht zugeordnetes Klassenattribut in den zeichenkettenbasierten relationship()-Argumenten referenziert wird.

  • [ext]

    Die „Mixin“-Logik in declarative wurde weiter überarbeitet, um __mapper_args__ zusätzlich als @classproperty auf einem Mixin zu ermöglichen, z. B. um polymorphic_identity dynamisch zuzuweisen.

  • [firebird]

    Die Funktionalität von result.rowcount kann pro Engine deaktiviert werden, indem „enable_rowcount=False“ bei create_engine() gesetzt wird. Normalerweise wird cursor.rowcount nach jeder UPDATE- oder DELETE-Anweisung bedingungslos aufgerufen, da der Cursor dann geschlossen ist und Firebird einen offenen Cursor benötigt, um einen Rowcount zu erhalten. Dieser Aufruf ist jedoch etwas teuer und kann daher deaktiviert werden. Um ihn pro Ausführung wieder zu aktivieren, kann die Ausführungsoption ‚enable_rowcount=True‘ verwendet werden.

0.6beta3

Veröffentlicht: So 28. März 2010

orm

  • [orm]

    Hauptfunktion: Die neue „subquery“-Ladefunktion wurde zu relationship() hinzugefügt. Dies ist eine Eager-Loading-Option, die eine zweite SELECT-Anweisung für jede Sammlung generiert, die in einer Abfrage dargestellt wird, und zwar für alle übergeordneten Elemente gleichzeitig. Die Abfrage gibt die ursprüngliche Endbenutzerabfrage, die in eine Subquery verpackt ist, erneut aus, wendet Joins zur Zielsammlung an und lädt alle diese Sammlungen vollständig in einem Ergebnis, ähnlich wie beim „joined“ Eager Loading, verwendet aber nur Inner Joins und ruft nicht wiederholt vollständige übergeordnete Zeilen ab (wie es die meisten DBAPIs zu tun scheinen, selbst wenn Spalten übersprungen werden). Das Subquery-Laden ist auf Mapper-Konfigurationsebene mit „lazy=’subquery‘“ und auf Abfrageoptions-Ebene mit „subqueryload(props..)“, „subqueryload_all(props…)“ verfügbar.

    Referenzen: #1675

  • [orm]

    Um der Tatsache Rechnung zu tragen, dass nun zwei Arten des Eager Loadings verfügbar sind, sind die neuen Namen für eagerload() und eagerload_all() joinedload() und joinedload_all(). Die alten Namen bleiben für absehbare Zeit als Synonyme bestehen.

  • [orm]

    Das Flag „lazy“ in der Funktion relationship() akzeptiert nun ein String-Argument für alle Arten des Ladens: „select“, „joined“, „subquery“, „noload“ und „dynamic“, wobei der Standardwert nun „select“ ist. Die alten Werte True/False/None behalten ihre übliche Bedeutung und bleiben für absehbare Zeit als Synonyme bestehen.

  • [orm]

    Die Methode with_hint() wurde dem Query()-Konstrukt hinzugefügt. Dies ruft direkt select().with_hint() auf und akzeptiert auch Entitäten sowie Tabellen und Aliase. Siehe with_hint() im SQL-Abschnitt unten.

    Referenzen: #921

  • [orm]

    Ein Fehler in der Query wurde behoben, bei dem der Aufruf von q.join(prop).from_self(…). join(prop) die zweite Join außerhalb der Subquery nicht korrekt rendern würde, wenn mit demselben Kriterium wie innen verbunden wurde.

  • [orm]

    Ein Fehler in der Query wurde behoben, bei dem die Verwendung von aliased()-Konstrukten fehlschlug, wenn die zugrundeliegende Tabelle (aber nicht der eigentliche Alias) innerhalb der von q.from_self() oder q.select_from() generierten Subquery referenziert wurde.

  • [orm]

    Ein Fehler wurde behoben, der alle eagerload()- und ähnlichen Optionen betraf, sodass „remote“ Eager Loads, d. h. Eager Loads von einem Lazy Load wie query(A).options(eagerload(A.b, B.c)), nichts eagerloaded, aber eagerload(“b.c“) hätte fehlerfrei funktioniert.

  • [orm]

    Query erhält eine add_columns(*columns)-Methode, die eine Mehrfachversion von add_column(col) ist. add_column(col) ist zukünftig veraltet.

  • [orm]

    Query.join() erkennt, ob das Endergebnis „FROM A JOIN A“ sein wird, und löst in diesem Fall einen Fehler aus.

  • [orm]

    Query.join(Cls.propname, from_joinpoint=True) prüft sorgfältiger, ob „Cls“ mit dem aktuellen Join-Punkt kompatibel ist, und verhält sich in dieser Hinsicht genauso wie Query.join(“propname“, from_joinpoint=True).

sql

  • [sql]

    Die Methode with_hint() wurde dem select()-Konstrukt hinzugefügt. Geben Sie eine Tabelle/einen Alias, einen Hint-Text und einen optionalen Dialektnamen an, und „hints“ werden an der entsprechenden Stelle in der Anweisung gerendert. Funktioniert für Oracle, Sybase, MySQL.

    Referenzen: #921

  • [sql]

    Ein Fehler, der in 0.6beta2 eingeführt wurde, bei dem Spaltenbeschriftungen innerhalb von Spaltenausdrücken gerendert wurden, denen bereits eine Beschriftung zugewiesen war, wurde behoben.

    Referenzen: #1747

postgresql

  • [postgresql]

    Das psycopg2-Dialekt protokolliert NOTICE-Meldungen über den Logger-Namen „sqlalchemy.dialects.postgresql“.

    Referenzen: #877

  • [postgresql]

    Die Typen TIME und TIMESTAMP sind nun direkt vom postgresql-Dialekt verfügbar, der das PG-spezifische Argument „precision“ zu beiden hinzufügt. „precision“ und „timezone“ werden für die Typen TIME und TIMEZONE korrekt reflektiert.

    Referenzen: #997

mysql

  • [mysql]

    Bei der Reflexion wird nicht mehr geraten, dass TINYINT(1) BOOLEAN sein sollte – TINYINT(1) wird zurückgegeben. Verwenden Sie Boolean / BOOLEAN in der Tabellendefinition, um das Verhalten der booleschen Konvertierung zu erhalten.

    Referenzen: #1752

oracle

  • [oracle]

    Das Oracle-Dialekt gibt VARCHAR-Typdefinitionen mit Zeichenanzahlen aus, z. B. VARCHAR2(50 CHAR), sodass die Spalte nach Zeichen und nicht nach Bytes dimensioniert wird. Die Spaltenreflexion von Zeichentypen verwendet ebenfalls ALL_TAB_COLUMNS.CHAR_LENGTH anstelle von ALL_TAB_COLUMNS.DATA_LENGTH. Beide Verhaltensweisen treten ab Serverversion 9 in Kraft – für Version 8 gelten die alten Verhaltensweisen.

    Referenzen: #1744

misc

  • [declarative]

    Die Verwendung eines Mixins bricht nicht zusammen, wenn der Mixin ein unvorhersehbares __getattribute__() implementiert, z. B. Zope-Schnittstellen.

    Referenzen: #1746

  • [declarative]

    Die Verwendung von @classdecorator und ähnlichem auf Mixins zur Definition von __tablename__, __table_args__ usw. funktioniert nun, wenn die Methode Attribute der ultimativen Unterklasse referenziert.

    Referenzen: #1749

  • [declarative]

    Beziehungen und Spalten mit Fremdschlüsseln sind auf deklarativen Mixins nicht erlaubt, sorry.

    Referenzen: #1751

  • [ext]

    Das Modul sqlalchemy.orm.shard wird nun zu einer Erweiterung, sqlalchemy.ext.horizontal_shard. Der alte Import funktioniert mit einer Deprecation-Warnung.

0.6beta2

Veröffentlicht: Sa. 20. März 2010

orm

  • [orm]

    Der offizielle Name für die Funktion relation() ist nun relationship(), um Verwechslungen mit dem Begriff der relationalen Algebra zu vermeiden. relation() bleibt jedoch auf absehbare Zeit in gleicher Kapazität verfügbar.

    Referenzen: #1740

  • [orm]

    Das Argument "version_id_generator" wurde zu Mapper hinzugefügt. Dies ist ein Callable, das gegebenenfalls den aktuellen Wert von "version_id_col" zurückgibt und die nächste Versionsnummer liefert. Kann für alternative Versionierungsschemata wie UUIDs, Zeitstempel verwendet werden.

    Referenzen: #1692

  • [orm]

    Das Schlüsselwortargument "lockmode" wurde zu Session.refresh() hinzugefügt. Es wird als Zeichenkette an Query übergeben, ähnlich wie bei with_lockmode(), und führt auch eine Versionsprüfung für eine Abbildung mit version_id_col durch.

  • [orm]

    Fehler behoben, bei dem das Aufrufen von query(A).join(A.bs).add_entity(B) in einem Szenario mit vererbter Tabelle B als Ziel doppelt hinzufügte und eine ungültige Abfrage erzeugte.

    Referenzen: #1188

  • [orm]

    Fehler in session.rollback() behoben, bei dem vormals "pending" Objekte nicht aus der Session entfernt wurden, bevor "deleted" Objekte neu integriert wurden, typischerweise bei natürlichen Primärschlüsseln. Wenn es einen Primärschlüsselkonflikt gab, schlug das Anhängen des gelöschten Objekts intern fehl. Die vormals "pending" Objekte werden nun zuerst "expunged".

    Referenzen: #1674

  • [orm]

    Viele Log-Ausgaben, die niemanden wirklich interessierten, wurden entfernt. Die verbleibenden Log-Ausgaben reagieren auf Live-Änderungen des Log-Levels. Es wird kein signifikanter Overhead hinzugefügt.

    Referenzen: #1719

  • [orm]

    Fehler in session.merge() behoben, der das Zusammenführen von dict-ähnlichen Sammlungen verhinderte.

  • [orm]

    session.merge() funktioniert mit Beziehungen, die "merge" nicht explizit in ihren Cascade-Optionen enthalten – das Ziel wird vollständig ignoriert.

  • [orm]

    session.merge() wird vorhandene skalare Attribute auf einem vorhandenen Ziel nicht ablaufen lassen, wenn das Ziel einen Wert für dieses Attribut hat, auch wenn die eingehende zusammengeführte Instanz keinen Wert für das Attribut hat. Dies verhindert unnötige Ladevorgänge bei vorhandenen Elementen. Das Attribut wird jedoch weiterhin als abgelaufen markiert, wenn das Ziel das Attribut nicht hat, was einige Verträge von verzögerten Spalten erfüllt.

    Referenzen: #1681

  • [orm]

    Das Flag "allow_null_pks" heißt jetzt "allow_partial_pks", hat den Standardwert True und verhält sich wieder wie in 0.5. Ausgenommen ist merge(), wo kein SELECT ausgegeben wird, wenn die Flagge auf False steht und die eingehende Instanz einen teilweise NULL-Primärschlüssel hat.

    Referenzen: #1680

  • [orm]

    Fehler in den 0.6-überarbeiteten Optimierungen für "many-to-one" behoben. Wenn eine "many-to-one"-Beziehung auf eine Nicht-Primärschlüsselspalte in der entfernten Tabelle verweist (z. B. Fremdschlüssel gegen eine UNIQUE-Spalte), wird der "alte" Wert aus der Datenbank während einer Änderung geladen, da er benötigt wird, wenn er sich in der Session befindet, für eine korrekte Historien-/Backref-Verwaltung. Er kann nicht aus der lokalen Identitätskarte für eine Nicht-Primärschlüsselspalte geladen werden.

    Referenzen: #1737

  • [orm]

    Interner Fehler behoben, der auftrat, wenn has() oder ein ähnlicher komplexer Ausdruck auf einer relation() mit Einzel-Tabellen-Vererbung aufgerufen wurde.

    Referenzen: #1731

  • [orm]

    query.one() wendet nun kein LIMIT mehr auf die Abfrage an, um sicherzustellen, dass alle Objektidentitäten im Ergebnis vollständig gezählt werden, auch wenn Joins mehrere Identitäten für zwei oder mehr Zeilen verbergen. Als Bonus kann one() nun auch mit einer Abfrage aufgerufen werden, die von Anfang an from_statement() ausgegeben hat, da sie die Abfrage nicht mehr modifiziert.

    Referenzen: #1688

  • [orm]

    query.get() gibt nun None zurück, wenn für eine Kennung abgefragt wird, die in der Identitätskarte mit einer anderen Klasse als der angeforderten vorhanden ist, z. B. bei Verwendung von polymorpher Ladung.

    Referenzen: #1727

  • [orm]

    Eine wichtige Korrektur in query.join(), wenn die "on"-Klausel ein Attribut eines aliased()-Konstrukts ist, aber bereits ein vorhandener Join zu einem kompatiblen Ziel besteht, werden die Abfragen korrekt an das richtige aliased()-Konstrukt angehängt, anstatt sich an die rechte Seite des vorhandenen Joins zu hängen.

    Referenzen: #1706

  • [orm]

    Leichte Verbesserung der Korrektur, um unnötige Updates der Primärschlüsselspalte bei einem sogenannten "Row-Switch"-Vorgang zu vermeiden, d. h. beim Hinzufügen und Löschen zweier Objekte mit demselben PK.

    Referenzen: #1362

  • [orm]

    Verwendet nun sqlalchemy.orm.exc.DetachedInstanceError, wenn ein Attributladen oder ein Aktualisierungsversuch fehlschlägt, da das Objekt von jeder Session getrennt ist. UnboundExecutionError ist spezifisch für Engines, die an Sessions und Anweisungen gebunden sind.

  • [orm]

    Query, die im Kontext eines Ausdrucks aufgerufen wird, rendert in allen Fällen mehrdeutige Bezeichnungen. Beachten Sie, dass dies nicht für den vorhandenen .statement und .subquery() Accessor/Methode gilt, die weiterhin die .with_labels()-Einstellung honorieren, die standardmäßig auf False gesetzt ist.

  • [orm]

    Query.union() behält mehrdeutige Bezeichnungen im zurückgegebenen Statement bei und vermeidet so verschiedene SQL-Kompositionsfehler, die aus Namenskonflikten bei Spalten entstehen können.

    Referenzen: #1676

  • [orm]

    Fehler in der Attributhistorie behoben, der unbeabsichtigt __eq__ auf zugeordneten Instanzen aufgerufen hat.

  • [orm]

    Einige interne Optimierungen des Objektladens sorgen für eine geringfügige Geschwindigkeitssteigerung bei großen Ergebnissen, schätzungsweise etwa 10-15%. Die internen "state"-Datenstrukturen wurden gründlich aufgeräumt und vereinfacht, mit weniger Komplexität, Datenmitgliedern, Methodenaufrufen und leeren Dictionary-Erstellungen.

  • [orm]

    Dokumentationsklarstellung für query.delete()

    Referenzen: #1689

  • [orm]

    Fehler in der Kaskade von relation() vom Typ many-to-one behoben, wenn das Attribut auf None gesetzt wurde, eingeführt in r6711 (Kaskade von gelöschten Elementen in die Session während add()).

  • [orm]

    Das Aufrufen von query.order_by() oder query.distinct() vor dem Aufrufen von query.select_from(), query.with_polymorphic() oder query.from_statement() löst nun eine Ausnahme aus, anstatt diese Kriterien stillschweigend fallen zu lassen.

    Referenzen: #1736

  • [orm]

    query.scalar() löst nun eine Ausnahme aus, wenn mehr als eine Zeile zurückgegeben wird. Alle anderen Verhaltensweisen bleiben gleich.

    Referenzen: #1735

  • [orm]

    Fehler behoben, der die "Row-Switch"-Logik (d. h. eine durch UPDATE ersetzte INSERT und DELETE) bei Verwendung von version_id_col fehlgeschlagen ließ.

    Referenzen: #1692

examples

  • [examples]

    Das Beaker-Cache-Beispiel wurde leicht verändert, um eine separate RelationCache-Option für Lazyload-Caching zu haben. Dieses Objekt sucht effizienter in einer beliebigen Anzahl potenzieller Attribute, indem es mehrere in einer gemeinsamen Struktur gruppiert. Sowohl FromCache als auch RelationCache sind einzeln einfacher.

sql

  • [sql]

    join() simuliert nun standardmäßig einen NATURAL JOIN. Das bedeutet, wenn die linke Seite ein Join ist, versucht es, die rechte Seite zuerst mit der rechtesten Seite der linken Seite zu verbinden und löst keine Ausnahmen wegen mehrdeutiger Join-Bedingungen aus, wenn dies erfolgreich ist, auch wenn weitere Join-Ziele im Rest der linken Seite vorhanden sind.

    Referenzen: #1714

  • [sql]

    Die gängigsten Konvertierungsfunktionen für Ergebnisverarbeiter wurden in das neue Modul "processors" verschoben. Dialekt-Autoren werden ermutigt, diese Funktionen zu verwenden, wann immer sie ihren Bedürfnissen entsprechen, anstatt benutzerdefinierte zu implementieren.

  • [sql]

    SchemaType und die Unterklassen Boolean, Enum sind nun serialisierbar, einschließlich ihrer DDL-Listener und anderer Event-Callables.

    Referenzen: #1694, #1698

  • [sql]

    Einige Plattformen interpretieren nun bestimmte Literalwerte als nicht-bindende Parameter, die buchstäblich in die SQL-Anweisung gerendert werden. Dies dient zur Unterstützung strenger SQL-92-Regeln, die von einigen Plattformen, einschließlich MS-SQL und Sybase, erzwungen werden. In diesem Modell sind bindende Parameter nicht in der Spaltenklausel einer SELECT-Anweisung erlaubt, ebenso wenig wie bestimmte mehrdeutige Ausdrücke wie "?=?". Wenn dieser Modus aktiviert ist, rendert der Basiscompiler die Bindungen als Inline-Literale, aber nur für Zeichenketten und numerische Werte. Andere Typen wie Daten lösen einen Fehler aus, es sei denn, die Dialekt-Unterklasse definiert eine Literalrendering-Funktion dafür. Der bindende Parameter muss bereits einen eingebetteten Literalwert haben, andernfalls wird ein Fehler ausgelöst (d. h. funktioniert nicht mit reinem bindparam('x')). Dialekte können auch die Bereiche erweitern, in denen Bindungen nicht akzeptiert werden, z. B. innerhalb von Funktionsargumentlisten (die unter MS-SQL nicht funktionieren, wenn natives SQL-Binding verwendet wird).

  • [sql]

    Der Parameter "unicode_errors" wurde zu String, Unicode usw. hinzugefügt. Er verhält sich wie das Schlüsselwortargument 'errors' der standardmäßigen string.decode()-Funktionen der Standardbibliothek. Dieses Flag erfordert, dass convert_unicode auf "force" gesetzt ist – andernfalls ist nicht garantiert, dass SQLAlchemy die Aufgabe der Unicode-Konvertierung übernimmt. Beachten Sie, dass dieses Flag einen erheblichen Leistungs-Overhead bei Zeilenabrufvorgängen für Backends hinzufügt, die nativ Unicode-Objekte zurückgeben (was die meisten DBAPIs tun). Dieses Flag sollte nur als absolute letzte Möglichkeit zum Lesen von Zeichenketten aus einer Spalte mit unterschiedlichen oder beschädigten Kodierungen verwendet werden, was nur für Datenbanken gilt, die überhaupt ungültige Kodierungen akzeptieren (d. h. MySQL. *nicht* PG, Sqlite usw.).

  • [sql]

    Unterstützung für den mathematischen Negationsoperator, -x, hinzugefügt.

  • [sql]

    FunctionElement-Unterklassen sind nun direkt ausführbar, genauso wie jede func.foo()-Konstruktion, mit automatischer SELECT-Anwendung, wenn sie an execute() übergeben werden.

  • [sql]

    Die Schlüsselwörter "type" und "bind" eines func.foo()-Konstrukts sind nun lokal für "func."-Konstrukte und nicht Teil der FunctionElement-Basisklasse, wodurch ein "type" in einem benutzerdefinierten Konstruktor oder einer klasseneigenen Variable behandelt werden kann.

  • [sql]

    Die Methode keys() wurde zu ResultProxy wiederhergestellt.

  • [sql]

    Das Typ-/Ausdruckssystem ermittelt nun vollständiger den Rückgabetyp eines Ausdrucks sowie die Anpassung des Python-Operators in einen SQL-Operator, basierend auf dem vollständigen linken/rechten/Operator des gegebenen Ausdrucks. Insbesondere das Datums-/Zeit-/Intervallsystem, das für PostgreSQL EXTRACT in ... erstellt wurde, wurde nun in das Typsystem verallgemeinert. Das frühere Verhalten, bei dem ein Ausdruck "Spalte + Literal" oft dazu führte, dass der Typ des "Literals" derselbe wie der der "Spalte" war, wird nun meist nicht mehr auftreten - der Typ des "Literals" wird zuerst aus dem Python-Typ des Literals abgeleitet, unter Annahme von Standard-nativen Python-Typen + Datumstypen, bevor auf den bekannten Typ auf der anderen Seite des Ausdrucks zurückgegriffen wird. Wenn der "Fallback"-Typ kompatibel ist (z. B. CHAR von String), verwendet die Literal-Seite diesen. TypeDecorator-Typen überschreiben dies standardmäßig, um die "Literal"-Seite bedingungslos zu zwängen, was durch die Implementierung der coerce_compared_value()-Methode geändert werden kann. Ebenfalls Teil von.

    Referenzen: #1647, #1683

  • [sql]

    sqlalchemy.sql.expressions.Executable ist nun Teil der öffentlichen API und wird für alle Ausdruckskonstrukte verwendet, die an execute() gesendet werden können. FunctionElement erbt nun von Executable, so dass es execution_options() erhält, die auch an das von execute() generierte select() weitergegeben werden. Executable wiederum unterteilt sich in _Generative, was alle ClauseElement markiert, die den @_generative-Decorator unterstützen – diese können zu einem späteren Zeitpunkt auch "öffentlich" gemacht werden, zugunsten der Compiler-Erweiterung.

  • [sql]

    Eine Änderung an der Lösung für - ein vom Endbenutzer definierter Name für bindende Parameter, der direkt mit einem Spaltennamen für bindende Parameter kollidiert, der direkt aus der SET- oder VALUES-Klausel eines Update/Insert generiert wird, erzeugt einen Compile-Fehler. Dies reduziert die Anzahl der Aufrufe und eliminiert einige Fälle, in denen unerwünschte Namenskollisionen weiterhin auftreten konnten.

    Referenzen: #1579

  • [sql]

    Column() erfordert einen Typ, wenn es keine Fremdschlüssel hat (dies ist nicht neu). Nun wird ein Fehler ausgelöst, wenn eine Column() keinen Typ und keine Fremdschlüssel hat.

    Referenzen: #1705

  • [sql]

    Das "scale"-Argument des Numeric()-Typs wird bei der Konvertierung eines zurückgegebenen Gleitkommawerts in eine Zeichenkette auf dem Weg zu Decimal berücksichtigt – dies ermöglicht Genauigkeitsfunktionen unter SQLite, MySQL.

    Referenzen: #1717

  • [sql]

    Die Methode copy() von Column kopiert nun uninitialisierte "on table attach"-Ereignisse mit. Hilft bei der neuen deklarativen "Mixin"-Fähigkeit.

mysql

  • [mysql]

    Fehler bei der Reflexion behoben, bei dem bei vorhandenem COLLATE die nullable-Flagge und die Serverstandards nicht reflektiert wurden.

    Referenzen: #1655

  • [mysql]

    Reflexion von TINYINT(1) "boolean"-Spalten, die mit Integer-Flags wie UNSIGNED definiert wurden, behoben.

  • [mysql]

    Weitere Korrekturen für das mysql-connector-Dialekt.

    Referenzen: #1668

  • [mysql]

    Komposit-PK-Tabelle auf InnoDB, bei der die "autoincrement"-Spalte nicht die erste ist, gibt eine explizite "KEY"-Phrase innerhalb von CREATE TABLE aus und vermeidet dadurch Fehler.

    Referenzen: #1496

  • [mysql]

    Unterstützung für Reflexion/Erstellung von Tabellen für eine breite Palette von MySQL-Schlüsselwörtern hinzugefügt.

    Referenzen: #1634

  • [mysql]

    Importfehler behoben, der bei der Reflexion von Tabellen auf einem Windows-Host auftreten konnte

    Referenzen: #1580

sqlite

  • [sqlite]

    Das Flag "native_datetime=True" wurde zu create_engine() hinzugefügt. Dies veranlasst die Typen DATE und TIMESTAMP, die gesamte Verarbeitung von bindenden Parametern und Ergebniszeilen zu überspringen, unter der Annahme, dass PARSE_DECLTYPES auf der Verbindung aktiviert wurde. Beachten Sie, dass dies nicht vollständig mit "func.current_date()" kompatibel ist, das als Zeichenkette zurückgegeben wird.

    Referenzen: #1685

mssql

  • [mssql]

    Unterstützung für das pymssql-Dialekt wiederhergestellt.

  • [mssql]

    Verschiedene Korrekturen für implizites Zurückgeben, Reflexion usw. – die MS-SQL-Dialekte sind in 0.6 noch nicht ganz vollständig (aber nahe dran).

  • [mssql]

    Grundlegende Unterstützung für mxODBC hinzugefügt.

    Referenzen: #1710

  • [mssql]

    Die Option text_as_varchar wurde entfernt.

oracle

  • [oracle]

    "out"-Parameter erfordern einen Typ, der von cx_oracle unterstützt wird. Ein Fehler wird ausgelöst, wenn kein cx_oracle-Typ gefunden werden kann.

  • [oracle]

    Oracle 'DATE' führt nun keine Ergebnisverarbeitung mehr durch, da der DATE-Typ in Oracle vollständige Datum+Zeit-Objekte speichert, die Sie erhalten. Beachten Sie, dass der generische types.Date-Typ bei eingehenden Werten immer noch value.date() aufruft. Bei der Reflexion einer Tabelle ist der reflektierte Typ 'DATE'.

  • [oracle]

    Vorläufige Unterstützung für den WITH_UNICODE-Modus von Oracle hinzugefügt. Zumindest etabliert dies die anfängliche Unterstützung für cx_Oracle mit Python 3. Wenn der WITH_UNICODE-Modus unter Python 2.xx verwendet wird, wird eine große und beängstigende Warnung ausgegeben, die den Benutzer auffordert, die Verwendung dieses schwierigen Betriebsmodus ernsthaft in Betracht zu ziehen.

    Referenzen: #1670

  • [oracle]

    Die Methode except_() wird nun als MINUS unter Oracle gerendert, was auf dieser Plattform mehr oder weniger gleichwertig ist.

    Referenzen: #1712

  • [oracle]

    Unterstützung für das Rendern und Reflektieren von TIMESTAMP WITH TIME ZONE, d. h. TIMESTAMP(timezone=True), hinzugefügt.

    Referenzen: #651

  • [oracle]

    Oracle INTERVAL-Typ kann nun reflektiert werden.

misc

  • [py3k]

    Die Installations-/Testumgebung wurde bezüglich Python 3 verbessert, da Distribute nun auf Py3k läuft. distribute_setup.py ist nun enthalten. Siehe README.py3k für Installations-/Testanweisungen für Python 3.

  • [engines]

    Eine optionale C-Erweiterung wurde hinzugefügt, um die SQL-Schicht zu beschleunigen, indem RowProxy und die gängigsten Ergebnisverarbeiter neu implementiert werden. Die tatsächliche Geschwindigkeitssteigerung hängt stark von Ihrem DBAPI und der Mischung der Datentypen in Ihren Tabellen ab und kann von 30 % bis über 200 % variieren. Sie bietet auch eine moderate (~15-20 %) indirekte Verbesserung der ORM-Geschwindigkeit für große Abfragen. Beachten Sie, dass sie *nicht* standardmäßig erstellt/installiert wird. Installationsanweisungen finden Sie in README.

  • [engines]

    Die Ausführungssequenz zieht alle Rowcount-/Last-Inserted-ID-Informationen aus dem Cursor ab, bevor commit() in einem "autocommit"-Szenario für die DBAPI-Verbindung aufgerufen wird. Dies hilft mxodbc mit Rowcount und ist wahrscheinlich generell eine gute Idee.

  • [engines]

    Die Protokollierung wurde etwas offener gestaltet, so dass isEnabledFor() öfter aufgerufen wird, damit Änderungen am Protokollierungslevel für Engine/Pool beim nächsten Verbindungsaufbau berücksichtigt werden. Dies fügt einen geringen Overhead für den Methodenaufruf hinzu. Er ist vernachlässigbar und erleichtert das Leben in all den Situationen, in denen die Protokollierung zufällig nach create_engine() konfiguriert wird.

    Referenzen: #1719

  • [engines]

    Das Flag assert_unicode ist veraltet. SQLAlchemy gibt eine Warnung aus, wenn es aufgefordert wird, eine nicht-Unicode-Python-Zeichenkette zu kodieren, sowie wenn ein Unicode- oder UnicodeType-Typ explizit eine Bytestring übergeben bekommt. Der String-Typ tut nichts für DBAPIs, die bereits Python-Unicode-Objekte akzeptieren.

  • [engines]

    Bindungsparameter werden als Tupel statt als Liste gesendet. Einige Backend-Treiber akzeptieren keine Bindungsparameter als Liste.

  • [engines]

    Die Thread-lokale Engine schloss die Verbindung bei close() nicht ordnungsgemäß – dies wurde behoben.

  • [engines]

    Das Transaktionsobjekt rollt nicht zurück oder committet nicht, wenn es nicht "aktiv" ist, was eine genauere Verschachtelung von begin/rollback/commit ermöglicht.

  • [engines]

    Python-Unicode-Objekte als Bindungen ergeben den Unicode-Typ, nicht String, wodurch eine bestimmte Klasse von Unicode-Fehlern bei Treibern eliminiert wird, die keine Unicode-Bindungen unterstützen.

  • [engines]

    Das Argument "logging_name" wurde zum Konstruktor von create_engine(), Pool() sowie das Argument "pool_logging_name" zu create_engine() hinzugefügt, das an das von Pool weitergegeben wird. Gibt den angegebenen Zeichenkettennamen im Feld "name" von Protokollmeldungen aus, anstatt die standardmäßige Hexadezimal-ID.

    Referenzen: #1555

  • [engines]

    Die Methode visit_pool() von Dialect wurde entfernt und durch on_connect() ersetzt. Diese Methode gibt ein Callable zurück, das die rohe DBAPI-Verbindung nach jeder Erstellung empfängt. Das Callable wird bei Bedarf zu einem first_connect/connect-Pool-Listener zusammengestellt. Bietet eine einfachere Schnittstelle für Dialekte.

  • [engines]

    StaticPool initialisiert, entsorgt und erstellt nun neu, ohne eine neue Verbindung zu öffnen – die Verbindung wird erst geöffnet, wenn sie zum ersten Mal angefordert wird. dispose() funktioniert nun auch auf AssertionPool.

    Referenzen: #1728

  • [metadata] [ticket: 1673]

    Die Möglichkeit, Schema-Informationen beim Verwenden von "tometadata" zu entfernen, wurde durch Übergabe von "schema=None" als Argument hinzugefügt. Wenn Schema nicht angegeben ist, bleibt das Schema der Tabelle erhalten.

  • [declarative]

    DeclarativeMeta verwendet ausschließlich cls.__dict__ (nicht dict_) als Quelle für Klasseninformationen; _as_declarative verwendet ausschließlich das an ihn übergebene dict_ als Quelle für Klasseninformationen (was bei Verwendung von DeclarativeMeta cls.__dict__ ist). Dies sollte es theoretisch einfacher machen, benutzerdefinierte Metaklassen zur Änderung des an _as_declarative übergebenen Zustands zu verwenden.

  • [declarative]

    Deklarativ akzeptiert nun direkt Mixin-Klassen als Mittel zur Bereitstellung gemeinsamer funktionaler und spaltenbasierter Elemente für alle Unterklassen sowie als Mittel zur Weitergabe eines festen Satzes von __table_args__ oder __mapper_args__ an Unterklassen. Für benutzerdefinierte Kombinationen von __table_args__/__mapper_args__ aus einem geerbten Mixin auf lokale Weise können nun Deskriptoren verwendet werden. Neue Details finden sich in der Deklarativen Dokumentation. Danke an Chris Withers, dass er meine Probleme damit ertragen hat.

    Referenzen: #1707

  • [declarative]

    das __mapper_args__ Dict wird beim Propagieren auf eine Unterklasse kopiert und direkt aus dem __dict__ der Klasse entnommen, um jegliche Propagierung vom Elternteil zu vermeiden. Die Mapper-Vererbung propagiert bereits die gewünschten Elemente vom übergeordneten Mapper.

    Referenzen: #1393

  • [declarative]

    Es wird eine Ausnahme ausgelöst, wenn eine Single-Table-Unterklasse eine Spalte angibt, die bereits in der Basisklasse vorhanden ist.

    Referenzen: #1732

  • [sybase]

    Implementierung eines vorläufigen funktionierenden Dialekts für Sybase, mit Unterimplementierungen für Python-Sybase sowie Pyodbc. Behandelt Tabellenerstellung/-löschung und grundlegende Roundtrip-Funktionalität. Enthält noch keine Reflexion oder umfassende Unterstützung für Unicode/Sonderausdrücke/etc.

  • [documentation]

    Umfangreiche Bereinigungsarbeiten in der Dokumentation, um Klassennamen, Funktions- und Methodennamen mit den API-Dokumenten zu verknüpfen.

    Referenzen: #1700

0.6beta1

Veröffentlicht: Mi, 03. Februar 2010

orm

  • [orm]

    Änderungen an query.update() und query.delete()
    • Die Option 'expire' bei query.update() wurde in 'fetch' umbenannt, um mit der von query.delete() übereinzustimmen. 'expire' ist veraltet und gibt eine Warnung aus.

    • query.update() und query.delete() verwenden beide standardmäßig 'evaluate' für die Synchronisierungsstrategie.

    • Die Strategie 'synchronize' für update() und delete() löst im Fehlerfall eine Ausnahme aus. Es gibt keine implizite Rückfalloption auf "fetch". Das Scheitern der Auswertung basiert auf der Struktur der Kriterien, sodass Erfolg/Misserfolg deterministisch auf Basis der Codestruktur ist.

  • [orm]

    Verbesserungen bei Many-to-One-Beziehungen
    • Many-to-One-Beziehungen lösen jetzt in weniger Fällen einen Lazyload aus, und in den meisten Fällen wird der "alte" Wert nicht mehr abgerufen, wenn ein neuer Wert zugewiesen wird.

    • Many-to-One-Beziehungen zu einer Joined-Table-Unterklasse verwenden jetzt get() für eine einfache Abfrage (bekannt als "use_get"-Bedingung), d.h. Related->Sub(Base), ohne dass die primaryjoin-Bedingung in Bezug auf die Basistabelle neu definiert werden muss.

    • Die Angabe eines Fremdschlüssels mit einer deklarierten Spalte, d.h. ForeignKey(MyRelatedClass.id), unterbricht nicht die "use_get"-Bedingung.

    • relation(), eagerload() und eagerload_all() verfügen jetzt über eine Option namens "innerjoin". Geben Sie True oder False an, um zu steuern, ob ein Eager-Join als INNER oder OUTER Join konstruiert wird. Standard ist immer False. Die Mapper-Optionen überschreiben jede auf relation() angegebene Einstellung. Sollte generell für Many-to-One-Beziehungen mit nicht-nullable Fremdschlüsseln gesetzt werden, um eine verbesserte Join-Leistung zu ermöglichen.

    • Das Verhalten des Eagerloadings, bei dem die Hauptabfrage bei vorhandenem LIMIT/OFFSET in eine Subquery eingewickelt wird, macht jetzt eine Ausnahme für den Fall, dass alle Eager-Loads Many-to-One-Joins sind. In diesen Fällen werden die Eager-Joins direkt gegen die Elterntabelle zusammen mit dem Limit/Offset ohne den zusätzlichen Overhead einer Subquery ausgeführt, da ein Many-to-One-Join keine Zeilen zum Ergebnis hinzufügt.

    Referenzen: #1186, #1492, #1544

  • [orm]

    Verbesserungen / Änderungen an Session.merge()

  • [orm]

    Das Flag "dont_load=True" bei Session.merge() ist veraltet und heißt jetzt "load=False".

  • [orm]

    Session.merge() ist leistungsoptimiert und verwendet halb so viele Aufrufe für den "load=False"-Modus im Vergleich zu 0.5 und deutlich weniger SQL-Abfragen für den "load=True"-Modus bei Sammlungen.

  • [orm]

    merge() wird keinen unnötigen Merge von Attributen ausführen, wenn die gegebene Instanz dieselbe Instanz ist, die bereits vorhanden ist.

  • [orm]

    merge() fusioniert jetzt auch die mit einem gegebenen Status verbundenen "Optionen", d.h. die über query.options() übergebenen, die mit einer Instanz mitlaufen, wie z.B. Optionen zum Eager- oder Lazy-Laden verschiedener Attribute. Dies ist essenziell für den Aufbau hochgradig integrierter Caching-Schemata. Dies ist eine subtile Verhaltensänderung gegenüber 0.5.

  • [orm]

    Ein Fehler wurde behoben, der die Serialisierung des "loader path" betraf, der im Status einer Instanz vorhanden ist und der auch für die Kombination von merge() mit serialisiertem Status und zugehörigen Optionen, die erhalten bleiben sollen, notwendig ist.

  • [orm]

    Das brandneue merge() wird in einem neuen umfassenden Beispiel gezeigt, wie Beaker mit SQLAlchemy integriert werden kann. Siehe die Notizen im "Beispiele"-Hinweis unten.

  • [orm]

    Primärschlüsselwerte können jetzt bei einem Joined-Table-Vererbungsobjekt geändert werden, und ON UPDATE CASCADE wird beim Flush berücksichtigt. Setzen Sie das neue Flag "passive_updates" auf False bei mapper(), wenn Sie SQLite oder MySQL/MyISAM verwenden.

    Referenzen: #1362

  • [orm]

    flush() erkennt jetzt, wenn eine Primärschlüsselspalte durch eine ON UPDATE CASCADE-Operation eines anderen Primärschlüssels aktualisiert wurde, und kann dann die Zeile für ein nachfolgendes UPDATE auf den neuen PK-Wert lokalisieren. Dies geschieht, wenn eine relation() vorhanden ist, um die Beziehung herzustellen, sowie passive_updates=True.

    Referenzen: #1671

  • [orm]

    Die "save-update"-Kaskade wird jetzt die ausstehenden *entfernten* Werte aus einem Skalar- oder Sammlungsattribut in die neue Sitzung während eines add()-Vorgangs kaskadieren. Dies geschieht, damit der flush()-Vorgang auch Zeilen dieser getrennten Elemente löscht oder modifiziert.

  • [orm]

    Die Verwendung eines "dynamischen" Loaders mit einer "sekundären" Tabelle erzeugt jetzt eine Abfrage, bei der die "sekundäre" Tabelle *nicht* aliased wird. Dies ermöglicht die Verwendung des sekundären Table-Objekts im "order_by"-Attribut von relation() und ermöglicht auch die Verwendung in Filterkriterien gegen die dynamische Beziehung.

    Referenzen: #1531

  • [orm]

    relation() mit uselist=False gibt eine Warnung aus, wenn ein Eager- oder Lazy-Load mehr als einen gültigen Wert für die Zeile findet. Dies kann auf primaryjoin/secondaryjoin-Bedingungen zurückzuführen sein, die für einen Eager LEFT OUTER JOIN oder für andere Bedingungen nicht geeignet sind.

    Referenzen: #1643

  • [orm]

    Es erfolgt eine explizite Prüfung, wenn ein synonym() mit map_column=True verwendet wird, wenn eine ColumnProperty (deferred oder anderweitig) separat im Eigenschaftenwörterbuch vorhanden ist, das an mapper mit demselben Schlüsselnamen übergeben wird. Anstatt die vorhandene Eigenschaft (und mögliche Optionen dieser Eigenschaft) stillschweigend zu ersetzen, wird ein Fehler ausgelöst.

    Referenzen: #1633

  • [orm]

    Ein "dynamischer" Loader konfiguriert seine Abfragekriterien zur Erstellungszeit, sodass die tatsächliche Abfrage von nicht-klonenden Accessoren wie "statement" zurückgegeben wird.

  • [orm]

    Die "named tuple"-Objekte, die beim Iterieren einer Query() zurückgegeben werden, sind jetzt picklebar.

  • [orm]

    Das Mapping auf ein select()-Konstrukt erfordert nun, dass Sie es explizit als alias() machen. Dies dient dazu, Verwirrung über Probleme wie...

    Referenzen: #1542

  • [orm]

    query.join() wurde überarbeitet, um ein konsistenteres Verhalten und mehr Flexibilität (inklusive) zu bieten.

    Referenzen: #1537

  • [orm]

    query.select_from() akzeptiert mehrere Klauseln, um mehrere komma-getrennte Einträge in der FROM-Klausel zu erzeugen. Nützlich beim Auswählen aus mehrfach gehosteten join()-Klauseln.

  • [orm]

    query.select_from() akzeptiert auch gemappte Klassen, aliased()-Konstrukte und Mapper als Argumente. Insbesondere hilft dies bei Abfragen aus mehreren Joined-Table-Klassen, um sicherzustellen, dass der vollständige Join gerendert wird.

  • [orm]

    query.get() kann mit einem Mapping zu einem Outer Join verwendet werden, bei dem einer oder mehrere der Primärschlüsselwerte None sind.

    Referenzen: #1135

  • [orm]

    query.from_self(), query.union() und andere Arten von verschachtelten Abfragen wie "SELECT * from (SELECT…)" werden Spaltenausdrücke innerhalb der Subquery besser in die Spaltenklausel der äußeren Abfrage übersetzen. Dies kann rückwärtskompatibel mit 0.5 sein, da es Abfragen mit literalen Ausdrücken, die keine Labels haben (z. B. literal('foo') usw.), unter Umständen unterbricht.

    Referenzen: #1568

  • [orm]

    relation primaryjoin und secondaryjoin prüfen nun, ob es sich um Spaltenausdrücke und nicht nur um Klausel-Elemente handelt. Dies verhindert, dass z. B. FROM-Ausdrücke direkt dort platziert werden.

    Referenzen: #1622

  • [orm]

    expression.null() wird genauso verstanden wie None, wenn ein Attribut, das auf ein Objekt/eine Sammlung verweist, in query.filter(), filter_by() etc. verglichen wird.

    Referenzen: #1415

  • [orm]

    Die Hilfsfunktion "make_transient()" wurde hinzugefügt, die eine persistente/getrennte Instanz in eine transiente Instanz umwandelt (d.h. die instance_key löscht und aus jeder Sitzung entfernt).

    Referenzen: #1052

  • [orm]

    Das Flag allow_null_pks bei mapper() ist veraltet, und die Funktion ist standardmäßig "aktiviert". Das bedeutet, dass eine Zeile, die einen nicht-null-Wert für eine ihrer Primärschlüsselspalten hat, als Identität betrachtet wird. Die Notwendigkeit dieses Szenarios tritt typischerweise nur beim Mapping zu einem Outer Join auf.

    Referenzen: #1339

  • [orm]

    Die Mechanik von "backref" wurde vollständig in das feinere "back_populates"-System integriert und findet vollständig innerhalb der Methode _generate_backref() von RelationProperty statt. Dies vereinfacht das Initialisierungsverfahren von RelationProperty und ermöglicht eine einfachere Weitergabe von Einstellungen (z. B. von Unterklassen von RelationProperty) an die umgekehrte Referenz. Die interne BackRef() ist weg und backref() gibt ein einfaches Tupel zurück, das von RelationProperty verstanden wird.

  • [orm]

    Das Feature version_id_col bei mapper() gibt eine Warnung aus, wenn es mit Dialekten verwendet wird, die "rowcount" nicht angemessen unterstützen.

    Referenzen: #1569

  • [orm]

    execution_options() wurde zu Query hinzugefügt, damit Optionen an die erzeugte Anweisung übergeben werden können. Derzeit haben nur Select-Anweisungen diese Optionen, und die einzige verwendete Option ist "stream_results", und der einzige Dialekt, der "stream_results" kennt, ist psycopg2.

  • [orm]

    Query.yield_per() setzt die Anweisungsoption "stream_results" automatisch.

  • [orm]

    Veraltet oder entfernt
    • Das Flag 'allow_null_pks' bei mapper() ist veraltet. Es hat keine Funktion mehr und ist in allen Fällen "aktiviert".

    • Das Flag 'transactional' bei sessionmaker() und anderen wurde entfernt. Verwenden Sie 'autocommit=True', um 'transactional=False' anzuzeigen.

    • Das Argument 'polymorphic_fetch' bei mapper() wurde entfernt. Das Laden kann mit der Option 'with_polymorphic' gesteuert werden.

    • Das Argument 'select_table' bei mapper() wurde entfernt. Verwenden Sie stattdessen 'with_polymorphic=("*", <some selectable>)' für diese Funktionalität.

    • Das Argument 'proxy' bei synonym() wurde entfernt. Dieses Flag hatte in 0.5 keine Funktion, da das "proxy generation"-Verhalten jetzt automatisch ist.

    • Das Übergeben einer einzelnen Liste von Elementen an eagerload(), eagerload_all(), contains_eager(), lazyload(), defer() und undefer() anstelle von mehreren Positionsargumenten (*args) ist veraltet.

    • Das Übergeben einer einzelnen Liste von Elementen an query.order_by(), query.group_by(), query.join() oder query.outerjoin() anstelle von mehreren Positionsargumenten (*args) ist veraltet.

    • query.iterate_instances() wurde entfernt. Verwenden Sie query.instances().

    • Query.query_from_parent() wurde entfernt. Verwenden Sie die Funktion sqlalchemy.orm.with_parent(), um eine "parent"-Klausel zu erzeugen, oder alternativ query.with_parent().

    • query._from_self() wurde entfernt, verwenden Sie stattdessen query.from_self().

    • Das Argument "comparator" für composite() wurde entfernt. Verwenden Sie stattdessen "comparator_factory".

    • RelationProperty._get_join() wurde entfernt.

    • Das Flag 'echo_uow' bei Session wurde entfernt. Verwenden Sie Logging unter dem Namen "sqlalchemy.orm.unitofwork".

    • session.clear() wurde entfernt. Verwenden Sie session.expunge_all().

    • session.save(), session.update(), session.save_or_update() wurden entfernt. Verwenden Sie session.add() und session.add_all().

    • Das Flag "objects" bei session.flush() bleibt veraltet.

    • Das Flag "dont_load=True" bei session.merge() ist zugunsten von "load=False" veraltet.

    • ScopedSession.mapper bleibt veraltet. Siehe das Nutzungsszenario unter https://sqlalchemy.de/trac/wiki/UsageRecipes/SessionAwareMapper

    • Das Übergeben einer InstanceState (internes SQLAlchemy-Statusobjekt) an attributes.init_collection() oder attributes.get_history() ist veraltet. Diese Funktionen sind öffentliche APIs und erwarten normalerweise eine reguläre gemappte Objektinstanz.

    • Der Parameter 'engine' für declarative_base() wurde entfernt. Verwenden Sie das Schlüsselwortargument 'bind'.

sql

  • [sql]

    Das Flag "autocommit" bei select() und text() sowie select().autocommit() ist veraltet. Rufen Sie jetzt .execution_options(autocommit=True) auf diesen Konstrukten auf, was auch direkt auf Connection und orm.Query verfügbar ist.

  • [sql]

    Das Flag autoincrement bei column zeigt nun die Spalte an, die mit cursor.lastrowid verknüpft werden soll, falls diese Methode verwendet wird. Details finden Sie in der API-Dokumentation.

  • [sql]

    executemany() erfordert nun, dass alle gebundenen Parameter-Sets alle Schlüssel enthalten, die im ersten gebundenen Parameter-Set vorhanden sind. Die Struktur und das Verhalten einer Insert/Update-Anweisung werden stark vom ersten Parametersatz bestimmt, einschließlich der auszulösenden Standardwerte. Es werden nur minimale Vermutungen für fehlende Parameter angestellt, um die Leistung nicht zu beeinträchtigen. Aus diesem Grund würden Standardwerte für fehlende Parameter stillschweigend "fehlschlagen", was nun verhindert wird.

    Referenzen: #1566

  • [sql]

    returning()-Unterstützung ist nativ für insert(), update(), delete(). Implementierungen mit unterschiedlichem Funktionsumfang existieren für PostgreSQL, Firebird, MSSQL und Oracle. returning() kann explizit mit Spaltenausdrücken aufgerufen werden, die dann im Resultset zurückgegeben werden, normalerweise über fetchone() oder first().

    insert()-Konstrukte verwenden ebenfalls implizit RETURNING, um neu generierte Primärschlüsselwerte abzurufen, falls die verwendete Datenbankversion dies unterstützt (eine Versionsnummernprüfung wird durchgeführt). Dies geschieht, wenn kein vom Endbenutzer angegebener returning() spezifiziert wurde.

  • [sql]

    union(), intersect(), except() und andere " zusammengesetzte" Anweisungstypen haben ein konsistenteres Verhalten in Bezug auf Klammerung. Jedes zusammengesetzte Element, das in ein anderes eingebettet ist, wird nun mit Klammern gruppiert. Zuvor wurde das erste zusammengesetzte Element in der Liste nicht gruppiert, da SQLite keine Anweisungen mag, die mit einer Klammer beginnen. PostgreSQL hat jedoch insbesondere Regeln für die Priorität von INTERSECT, und es ist konsistenter, Klammern gleichmäßig auf alle Unterelemente anzuwenden. Daher ist die Problemumgehung für SQLite nun auch die frühere Problemumgehung für PG - beim Verschachteln von zusammengesetzten Elementen muss das erste Element normalerweise '.alias().select()' aufgerufen werden, um es in eine Subquery einzuschließen.

    Referenzen: #1665

  • [sql]

    insert()- und update()-Konstrukte können nun bindparam()-Objekte mit Namen einbetten, die den Schlüsseln der Spalten entsprechen. Diese gebundenen Parameter umgehen den üblichen Weg, dass diese Schlüssel in der VALUES- oder SET-Klausel der generierten SQL-Abfrage erscheinen.

    Referenzen: #1579

  • [sql]

    Der Binary-Typ gibt Daten nun als Python-String (oder als "bytes"-Typ in Python 3) zurück, anstatt des integrierten "buffer"-Typs. Dies ermöglicht symmetrische Roundtrips von Binärdaten.

    Referenzen: #1524

  • [sql]

    Das tuple_()-Konstrukt wurde hinzugefügt und ermöglicht den Vergleich von Ausdruckssätzen mit anderen Sätzen, typischerweise mit IN gegen zusammengesetzte Primärschlüssel oder ähnliches. Akzeptiert auch ein IN mit mehreren Spalten. Die Fehlermeldung "scalar select can have only one column" (skalare Auswahl darf nur eine Spalte haben) wurde entfernt – Probleme mit Spalteninkongruenzen werden nun vom Datenbank gemeldet.

  • [sql]

    Benutzerdefinierte "default"- und "onupdate"-Aufrufe, die einen Kontext akzeptieren, sollten nun "context.current_parameters" aufrufen, um auf das Wörterbuch der aktuell verarbeiteten gebundenen Parameter zuzugreifen. Dieses Wörterbuch ist auf die gleiche Weise verfügbar, unabhängig davon, ob es sich um eine einzelne Ausführung oder eine Ausführung mehrerer Datensätze handelt.

  • [sql]

    Mehrteilige Schemanamen, d.h. mit Punkten wie "dbo.master", werden nun in select()-Labels mit Unterstrichen für Punkte gerendert, d.h. "dbo_master_table_column". Dies ist ein "freundliches" Label, das sich in Ergebnismengen besser verhält.

    Referenzen: #1428

  • [sql]

    unnötiges "Zähler"-Verhalten bei select()-Labelnamen, die mit einem Spaltennamen in der Tabelle übereinstimmen, wurde entfernt. z.B. wird "tablename_id" für "id" statt "tablename_id_1" generiert, um Namenskonflikte zu vermeiden, wenn die Tabelle eine Spalte namens "tablename_id" hat – da die Labeling-Logik immer auf alle Spalten angewendet wird, wird ein Namenskonflikt nie auftreten.

  • [sql]

    Der Aufruf von expr.in_([]), d.h. mit einer leeren Liste, gibt eine Warnung aus, bevor die übliche "expr != expr"-Klausel ausgegeben wird. Die "expr != expr"-Klausel kann sehr teuer sein, und es wird bevorzugt, dass der Benutzer in_() nicht aufruft, wenn die Liste leer ist, sondern stattdessen einfach nicht abfragt oder die Kriterien für komplexere Situationen anpasst.

    Referenzen: #1628

  • [sql]

    execution_options() wurde zu select()/text() hinzugefügt, was die Standardoptionen für die Connection setzt. Siehe den Hinweis unter "engines".

  • [sql]

    Veraltet oder entfernt
    • Das Flag "scalar" bei select() wurde entfernt, verwenden Sie stattdessen select.as_scalar().

    • Das Attribut "shortname" bei bindparam() wurde entfernt.

    • Die Flags postgres_returning, firebird_returning bei insert(), update(), delete() sind veraltet, verwenden Sie stattdessen die neue Methode returning().

    • Das Flag fold_equivalents bei join ist veraltet (bleibt erhalten, bis es implementiert ist).

    Referenzen: #1131

schema

  • [schema]

    Die Methode __contains__() von MetaData akzeptiert nun Strings oder Table-Objekte als Argumente. Wenn ein Table übergeben wird, wird das Argument zuerst in table.key konvertiert, d.h. "[schemaname.]<tablename>"

    Referenzen: #1541

  • [schema]

    Die veralteten Methoden MetaData.connect() und ThreadLocalMetaData.connect() wurden entfernt. Senden Sie das Attribut "bind", um Metadaten zu binden.

  • [schema]

    Die veraltete Methode metadata.table_iterator() wurde entfernt (verwenden Sie stattdessen sorted_tables).

  • [schema]

    Veraltete PassiveDefault – verwenden Sie stattdessen DefaultClause.

  • [schema]

    Das Argument "metadata" wurde von DefaultGenerator und seinen Unterklassen entfernt, bleibt aber lokal bei Sequence vorhanden, das ein eigenständiges Konstrukt in DDL ist.

  • [schema]

    Öffentliche Veränderbarkeit von Index- und Constraint-Objekten entfernt

    • ForeignKeyConstraint.append_element()

    • Index.append_column()

    • UniqueConstraint.append_column()

    • PrimaryKeyConstraint.add()

    • PrimaryKeyConstraint.remove()

    Diese sollten deklarativ konstruiert werden (d.h. in einer einzigen Konstruktion).

  • [schema]

    Die Attribute "start" und "increment" bei Sequence erzeugen nun standardmäßig "START WITH" und "INCREMENT BY" bei Oracle und PostgreSQL. Firebird unterstützt diese Schlüsselwörter derzeit nicht.

    Referenzen: #1545

  • [schema]

    UniqueConstraint, Index, PrimaryKeyConstraint akzeptieren Listen von Spaltennamen oder Spaltenobjekten als Argumente.

  • [schema]

    Andere entfernte Dinge
    • Table.key (keine Ahnung, wozu das diente)

    • Table.primary_key ist nicht zuweisbar – verwenden Sie stattdessen table.append_constraint(PrimaryKeyConstraint(…))

    • Column.bind (erhältlich über column.table.bind)

    • Column.metadata (erhältlich über column.table.metadata)

    • Column.sequence (verwenden Sie stattdessen column.default)

    • ForeignKey(constraint=some_parent) (ist jetzt privat _constraint)

  • [schema]

    Das Flag use_alter bei ForeignKey ist nun eine Kurzwahloption für Operationen, die manuell mit dem DDL()-Ereignissystem erstellt werden können. Eine Nebenwirkung dieser Refaktorierung ist, dass ForeignKeyConstraint-Objekte mit use_alter=True auf SQLite *nicht* ausgegeben werden, da SQLite ALTER für Fremdschlüssel nicht unterstützt.

  • [schema]

    ForeignKey- und ForeignKeyConstraint-Objekte kopieren nun korrekt alle ihre öffentlichen Schlüsselwortargumente.

    Referenzen: #1605

postgresql

  • [postgresql]

    Neue Dialekte: pg8000, zxjdbc und pypostgresql unter py3k.

  • [postgresql]

    Der Dialekt "postgres" heißt jetzt "postgresql"! Verbindungszeichenfolgen sehen so aus:

    postgresql://scott:tiger@localhost/test postgresql+pg8000://scott:tiger@localhost/test

    Der Name "postgres" bleibt aus Gründen der Abwärtskompatibilität in folgenden Fällen erhalten:

    • Es gibt einen Dummy-Dialekt "postgres.py", der es alten URLs ermöglicht, zu funktionieren, d.h. postgres://scott:tiger@localhost/test

    • Der Name "postgres" kann aus dem alten Modul "databases" importiert werden, z. B. "from sqlalchemy.databases import postgres" sowie "dialects", "from sqlalchemy.dialects.postgres import base as pg", was eine Deprecation-Warnung ausgibt.

    • Spezielle Ausdrucksargumente heißen nun "postgresql_returning" und "postgresql_where", aber die älteren Namen "postgres_returning" und "postgres_where" funktionieren weiterhin mit einer Deprecation-Warnung.

  • [postgresql]

    "postgresql_where" akzeptiert nun SQL-Ausdrücke, die auch Literale enthalten können, welche bei Bedarf zitiert werden.

  • [postgresql]

    Der psycopg2-Dialekt verwendet nun die "unicode extension" von psycopg2 bei allen neuen Verbindungen, wodurch alle String/Text/etc.-Typen die Notwendigkeit der Nachbearbeitung von Bytestrings in Unicode (ein teurer Schritt aufgrund seines Umfangs) überspringen können. Andere Dialekte, die Unicode nativ zurückgeben (pg8000, zxjdbc), überspringen ebenfalls die Unicode-Nachbearbeitung.

  • [postgresql]

    Neuer ENUM-Typ hinzugefügt, der als schema-level Konstrukt existiert und den generischen Enum-Typ erweitert. Er assoziiert sich automatisch mit Tabellen und deren übergeordneten Metadaten, um die entsprechenden CREATE TYPE/DROP TYPE-Befehle bei Bedarf auszugeben, unterstützt Unicode-Labels, unterstützt Reflexion.

    Referenzen: #1511

  • [postgresql]

    INTERVAL unterstützt ein optionales "precision"-Argument, das dem von PG akzeptierten Argument entspricht.

  • [postgresql]

    Verwendung der neuen Funktion dialect.initialize() zur Einrichtung versionsabhängigen Verhaltens.

  • [postgresql]

    Etwas bessere Unterstützung für %-Zeichen in Tabellen-/Spaltennamen; psycopg2 kann keinen gebundenen Parameter-Namen von %(foobar)s handhaben, und SQLA möchte keinen Overhead hinzufügen, nur um diesen einen nicht vorhandenen Anwendungsfall zu behandeln.

    Referenzen: #1279

  • [postgresql]

    Das Einfügen von NULL in eine Primärschlüssel- + Fremdschlüsselspalte löst den "not null constraint"-Fehler aus, nicht den Versuch, eine nicht existierende "col_id_seq"-Sequenz auszuführen.

    Referenzen: #1516

  • [postgresql]

    autoincrement SELECT-Anweisungen, d.h. solche, die aus einem Prozeduraufruf mit Zeilenmodifikation auswählen, funktionieren nun mit dem Server-Side-Cursor-Modus (der benannte Cursor wird für solche Anweisungen nicht verwendet).

  • [postgresql]

    Der PostgreSQL-Dialekt kann pg "devel"-Versionszeichenfolgen, d.h. "8.5devel", ordnungsgemäß erkennen.

    Referenzen: #1636

  • [postgresql]

    psycopg2 respektiert nun die Anweisungsoption "stream_results". Diese Option überschreibt die Verbindungseinstellung "server_side_cursors". Wenn sie true ist, werden Server-Side-Cursor für die Anweisung verwendet. Wenn sie false ist, werden sie nicht verwendet, auch wenn "server_side_cursors" auf der Verbindung true ist.

    Referenzen: #1619

mysql

  • [mysql]

    Neue Dialekte: oursql, ein neuer nativer Dialekt, MySQL Connector/Python, ein nativer Python-Port von MySQLdb und natürlich zxjdbc auf Jython.

  • [mysql]

    VARCHAR/NVARCHAR wird ohne Längenangabe nicht gerendert, es wird ein Fehler ausgelöst, bevor es an MySQL übergeben wird. Dies wirkt sich nicht auf CAST aus, da VARCHAR ohnehin nicht in MySQL CAST erlaubt ist, der Dialekt rendert in diesen Fällen CHAR/NCHAR.

  • [mysql]

    Alle _detect_XXX()-Funktionen werden nun einmal unter dialect.initialize() ausgeführt.

  • [mysql]

    Etwas bessere Unterstützung für %-Zeichen in Tabellen-/Spaltennamen; MySQLdb kann keine %-Zeichen in SQL verarbeiten, wenn executemany() verwendet wird, und SQLA möchte keinen Overhead hinzufügen, nur um diesen einen nicht vorhandenen Anwendungsfall zu behandeln.

    Referenzen: #1279

  • [mysql]

    Die BINARY- und MSBinary-Typen generieren nun in allen Fällen "BINARY". Das Weglassen des "length"-Parameters erzeugt "BINARY" ohne Längenangabe. Verwenden Sie BLOB, um eine Binärspalte ohne Längenangabe zu erzeugen.

  • [mysql]

    der „quoting=’quoted’” Parameter für MSEnum/ENUM ist veraltet. Es ist am besten, sich auf das automatische Quoting zu verlassen.

  • [mysql]

    ENUM untererbt jetzt vom neuen generischen Enum-Typ und behandelt auch Unicode-Werte implizit, wenn die gegebenen Labelnamen Unicode-Objekte sind.

  • [mysql]

    Eine Spalte vom Typ TIMESTAMP hat jetzt standardmäßig NULL, wenn „nullable=False“ nicht an Column() übergeben wird und kein Standardwert vorhanden ist. Dies ist nun konsistent mit allen anderen Typen und rendert im Falle von TIMESTAMP explizit „NULL“ aufgrund von MySQLs „Umschaltung“ der Standard-Nullbarkeit für TIMESTAMP-Spalten.

    Referenzen: #1539

sqlite

  • [sqlite]

    DATE, TIME und DATETIME Typen können jetzt optionale Argumente storage_format und regexp erhalten. storage_format kann verwendet werden, um diese Typen mit einem benutzerdefinierten String-Format zu speichern. regexp erlaubt die Verwendung eines benutzerdefinierten regulären Ausdrucks, um String-Werte aus der Datenbank abzugleichen.

  • [sqlite]

    Time und DateTime Typen verwenden jetzt standardmäßig einen strengeren regulären Ausdruck, um Strings aus der Datenbank abzugleichen. Verwenden Sie das regexp-Argument, wenn Sie Daten in einem Legacy-Format verwenden.

  • [sqlite]

    __legacy_microseconds__ bei SQLite Time und DateTime Typen wird nicht mehr unterstützt. Sie sollten stattdessen das Argument storage_format verwenden.

  • [sqlite]

    Date, Time und DateTime Typen sind nun strenger bei dem, was sie als Bind-Parameter akzeptieren: Der Date-Typ akzeptiert nur Date-Objekte (und Datetime-Objekte, da sie von Date erben), Time akzeptiert nur Time-Objekte und DateTime akzeptiert nur Date- und Datetime-Objekte.

  • [sqlite]

    Table() unterstützt ein Keyword-Argument „sqlite_autoincrement“, das das SQLite-Schlüsselwort „AUTOINCREMENT“ auf die einzelne Integer-Primärschlüsselspalte anwendet, wenn DDL generiert wird. Verhindert die Generierung einer separaten PRIMARY KEY-Beschränkung.

    Referenzen: #1016

mssql

  • [mssql]

    MSSQL + Pyodbc + FreeTDS funktioniert nun größtenteils, mit möglichen Ausnahmen bezüglich Binärdaten sowie Unicode-Schema-Bezeichnern.

  • [mssql]

    Das Flag „has_window_funcs“ wurde entfernt. LIMIT/OFFSET-Nutzung verwendet wie immer ROW NUMBER, und wenn auf einer älteren Version von SQL Server, schlägt die Operation fehl. Das Verhalten ist genau dasselbe, außer dass der Fehler von SQL Server anstelle des Dialekts ausgelöst wird und keine Flag-Einstellung erforderlich ist, um ihn zu aktivieren.

  • [mssql]

    Das Flag „auto_identity_insert“ wurde entfernt. Diese Funktion wird immer wirksam, wenn eine INSERT-Anweisung eine Spalte überschreibt, von der bekannt ist, dass sie eine Sequenz darauf hat. Wie bei „has_window_funcs“, wenn der zugrunde liegende Treiber dies nicht unterstützt, können Sie diese Operation ohnehin nicht durchführen, sodass es keinen Sinn hat, ein Flag zu haben.

  • [mssql]

    Verwendung der neuen Funktion dialect.initialize() zur Einrichtung versionsabhängigen Verhaltens.

  • [mssql]

    Referenzen auf Sequenzen, die nicht mehr verwendet werden, wurden entfernt. Implizite Identitäten in MSSQL funktionieren genauso wie implizite Sequenzen in anderen Dialekten. Explizite Sequenzen werden durch die Verwendung von „default=Sequence()“ aktiviert. Weitere Informationen finden Sie in der Dokumentation des MSSQL-Dialekts.

oracle

  • [oracle]

    Unittests bestehen zu 100% mit cx_oracle!

  • [oracle]

    Unterstützung für den „native unicode“-Modus von cx_Oracle, der nicht erfordert, dass NLS_LANG gesetzt ist. Verwenden Sie die neueste Version 5.0.2 oder höher von cx_oracle.

  • [oracle]

    Ein NCLOB-Typ wurde zu den Basistypen hinzugefügt.

  • [oracle]

    use_ansi=False wird nicht in die FROM/WHERE-Klausel einer Anweisung gelangen, die aus einer Unterabfrage auswählt, die auch JOIN/OUTERJOIN verwendet.

  • [oracle]

    Der native INTERVAL-Typ wurde dem Dialekt hinzugefügt. Dieser unterstützt bisher nur das Intervall vom Typ TAG BIS SEKUNDE, da cx_oracle keine Unterstützung für JAHR BIS MONAT hat.

    Referenzen: #1467

  • [oracle]

    Die Verwendung des CHAR-Typs führt dazu, dass cx_oracle’s FIXED_CHAR DBAPI-Typ an Anweisungen gebunden wird.

  • [oracle]

    Der Oracle-Dialekt verfügt nun über NUMBER, das wie der NUMBER-Typ von Oracle fungieren soll. Es ist der primäre numerische Typ, der von der Tabellenspiegelung zurückgegeben wird, und versucht, Decimal()/float/int basierend auf den Präzisions-/Skalierungsparametern zurückzugeben.

    Referenzen: #885

  • [oracle]

    func.char_length ist eine generische Funktion für LENGTH.

  • [oracle]

    ForeignKey(), das onupdate=<value> enthält, gibt eine Warnung aus und nicht ON UPDATE CASCADE, was von Oracle nicht unterstützt wird.

  • [oracle]

    Die Methode keys() von RowProxy() gibt jetzt die Ergebnisspaltennamen zurück, die normalisiert sind, um SQLAlchemy-Case-Insensitive-Namen zu sein. Das bedeutet, sie sind kleingeschrieben für Case-Insensitive-Namen, während DBAPI sie normalerweise als GROSSBUCHSTABEN zurückgibt. Dies macht row keys() mit weiteren SQLAlchemy-Operationen kompatibel.

  • [oracle]

    Verwendung der neuen Funktion dialect.initialize() zur Einrichtung versionsabhängigen Verhaltens.

  • [oracle]

    Die Verwendung von types.BigInteger mit Oracle generiert NUMBER(19).

    Referenzen: #1125

  • [oracle]

    Die Funktion „case sensitivity“ erkennt während der Spiegelung einen Spaltennamen, der vollständig kleingeschrieben ist, und fügt „quote=True“ zur generierten Column hinzu, sodass die richtige Anführungszeichen beibehalten wird.

misc

  • [major] [release]

    Die vollständige Liste der Funktionsbeschreibungen finden Sie unter https://docs.sqlalchemy.de/en/latest/changelog/migration_06.html. Dieses Dokument ist noch in Arbeit.

  • [major] [release]

    Alle Fehlerbehebungen und Funktionserweiterungen der letzten Version 0.5 und darunter sind ebenfalls in 0.6 enthalten.

  • [major] [release]

    Zielplattformen umfassen nun Python 2.4/2.5/2.6, Python 3.1, Jython2.5.

  • [engines]

    Die Transaktionsisolationsstufe kann mit create_engine(… isolation_level=”…”); angegeben werden, verfügbar auf PostgreSQL und SQLite.

    Referenzen: #443

  • [engines]

    Connection verfügt über execution_options(), eine generative Methode, die Schlüsselwörter akzeptiert, die beeinflussen, wie die Anweisung im Verhältnis zum DBAPI ausgeführt wird. Unterstützt derzeit „stream_results“, wodurch psycopg2 einen serverseitigen Cursor für diese Anweisung verwendet, sowie „autocommit“, das der neue Speicherort für die Option „autocommit“ von select() und text() ist. select() und text() haben auch .execution_options() sowie ORM Query().

  • [engines]

    Der Import für Entrypoint-gesteuerte Dialekte wurde korrigiert, sodass er nicht mehr auf einen albernen tb_info-Trick angewiesen ist, um den Importfehlerstatus zu ermitteln.

    Referenzen: #1630

  • [engines]

    Die Methode first() wurde zu ResultProxy hinzugefügt, die die erste Zeile zurückgibt und den Ergebnissatz sofort schließt.

  • [engines]

    RowProxy-Objekte sind nun pickelbar, d. h. das Objekt, das von result.fetchone(), result.fetchall() usw. zurückgegeben wird.

  • [engines]

    RowProxy hat keine close()-Methode mehr, da die Zeile keine Referenz mehr auf das übergeordnete Element hält. Rufen Sie stattdessen close() auf dem übergeordneten Element ResultProxy auf oder verwenden Sie autoclose.

  • [engines]

    Die internen Strukturen von ResultProxy wurden überarbeitet, um die Anzahl der Methodenaufrufe beim Abrufen von Spalten stark zu reduzieren. Dies kann bei der Abfrage großer Ergebnismengen eine erhebliche Geschwindigkeitssteigerung (bis zu mehr als 100 %) bieten. Die Verbesserung ist größer beim Abrufen von Spalten, auf die keine Typenverarbeitung angewendet wird, und bei der Verwendung von Ergebnissen als Tupel (anstatt als Wörterbücher). Vielen Dank an Elixirs Gaëtan de Menten für diese dramatische Verbesserung!

    Referenzen: #1586

  • [engines]

    Datenbanken, die auf das Postfetch von „zuletzt eingefügter ID“ angewiesen sind, um einen generierten Sequenzwert zu erhalten (d. h. MySQL, MS-SQL), funktionieren jetzt korrekt, wenn eine zusammengesetzte Primärschlüsselspalte vorhanden ist, die „autoincrement“-Spalte nicht die erste Primärschlüsselspalte in der Tabelle ist.

  • [engines]

    Die Methode last_inserted_ids() wurde in den Deskriptor „inserted_primary_key“ umbenannt.

  • [engines]

    Das Setzen von echo=False in create_engine() setzt den Log-Level jetzt auf WARN anstelle von NOTSET. Dies dient dazu, dass die Protokollierung für eine bestimmte Engine deaktiviert werden kann, auch wenn die Protokollierung für „sqlalchemy.engine“ insgesamt aktiviert ist. Beachten Sie, dass die Standardeinstellung für „echo“ None ist.

    Referenzen: #1554

  • [engines]

    ConnectionProxy verfügt nun über Wrapper-Methoden für alle Transaktionslebenszyklus-Ereignisse, einschließlich begin(), rollback(), commit() begin_nested(), begin_prepared(), prepare(), release_savepoint() usw.

  • [engines]

    Die Protokollierung des Connection-Pools verwendet nun sowohl die INFO- als auch die DEBUG-Protokollstufen für die Protokollierung. INFO ist für wichtige Ereignisse wie ungültige Verbindungen, DEBUG für die gesamte Protokollierung von Erwerb/Rückgabe. echo_pool kann False, None, True oder „debug“ sein, genauso wie echo funktioniert.

  • [engines]

    Alle pyodbc-Dialekte unterstützen nun zusätzliche pyodbc-spezifische Schlüsselwortargumente „ansi“, „unicode_results“, „autocommit“.

    Referenzen: #1621

  • [engines]

    Der „threadlocal“-Engine wurde neu geschrieben und vereinfacht und unterstützt nun SAVEPOINT-Operationen.

  • [engines]

    veraltet oder entfernt
    • result.last_inserted_ids() ist veraltet. Verwenden Sie result.inserted_primary_key.

    • dialect.get_default_schema_name(connection) ist jetzt öffentlich über dialect.default_schema_name zugänglich.

    • Das Argument „connection“ von engine.transaction() und engine.run_callable() wurde entfernt – Connection selbst hat nun diese Methoden. Alle vier Methoden akzeptieren *args und **kwargs, die an den gegebenen Callable sowie an die operierende Verbindung übergeben werden.

  • [reflection/inspection]

    Die Tabellenspiegelung wurde erweitert und in eine neue API namens „sqlalchemy.engine.reflection.Inspector“ verallgemeinert. Das Inspector-Objekt bietet detaillierte Informationen über eine Vielzahl von Schema-Informationen, mit Raum für Erweiterungen, einschließlich Tabellennamen, Spaltennamen, View-Definitionen, Sequenzen, Indizes usw.

  • [reflection/inspection]

    Views sind nun als normale Table-Objekte spiegelbar. Derselbe Table-Konstruktor wird verwendet, mit der Einschränkung, dass „effektive“ Primär- und Fremdschlüsselbeschränkungen nicht Teil der Spiegelungsergebnisse sind; diese müssen bei Bedarf explizit angegeben werden.

  • [reflection/inspection]

    Das bestehende autoload=True-System verwendet nun Inspector im Hintergrund, sodass jeder Dialekt nur „rohe“ Daten über Tabellen und andere Objekte zurückgeben muss – Inspector ist der einzige Ort, an dem diese Informationen zu Table-Objekten kompiliert werden, um maximale Konsistenz zu gewährleisten.

  • [ddl]

    Das DDL-System wurde stark erweitert. Die Klasse DDL() erweitert nun das allgemeinere DDLElement(), das die Basis für viele neue Konstrukte bildet.

    • CreateTable()

    • DropTable()

    • AddConstraint()

    • DropConstraint()

    • CreateIndex()

    • DropIndex()

    • CreateSequence()

    • DropSequence()

    Diese unterstützen „on“ und „execute-at()“ genauso wie das einfache DDL(). Benutzerdefinierte DDLElement-Unterklassen können erstellt und mit der sqlalchemy.ext.compiler-Erweiterung mit einem Compiler verknüpft werden.

  • [ddl]

    Die Signatur des „on“-Callable, das an DDL() und DDLElement() übergeben wird, wurde wie folgt überarbeitet:

    ddl

    Das DDLElement-Objekt selbst

    event

    Der String-Eventname.

    target

    früher „schema_item“, das Table- oder MetaData-Objekt, das das Ereignis auslöst.

    connection

    Das Connection-Objekt, das für den Vorgang verwendet wird.

    **kw

    Schlüsselwortargumente. Im Falle von MetaData vor/nach create/drop wird die Liste der Table-Objekte, für die CREATE/DROP DDL ausgegeben werden soll, als kw-Argument „tables“ übergeben. Dies ist für DDL auf Metadatenebene erforderlich, die von der Anwesenheit bestimmter Tabellen abhängt.

    Das Attribut „schema_item“ von DDL wurde umbenannt in

    „target“.

  • [dialect] [refactor]

    Dialektmodule sind nun in Datenbankdialekte und DBAPI-Implementierungen unterteilt. Verbindungs-URLs werden nun bevorzugt mit dialect+driver://… angegeben, d. h. „mysql+mysqldb://scott:tiger@localhost/test“. Beispiele finden Sie in der Dokumentation 0.6.

  • [dialect] [refactor]

    Der Setuptools-Entrypoint für externe Dialekte heißt nun „sqlalchemy.dialects“.

  • [dialect] [refactor]

    Das Schlüsselwortargument „owner“ wurde von Table entfernt. Verwenden Sie „schema“, um alle Namespaces darzustellen, die dem Tabellennamen vorangestellt werden sollen.

  • [dialect] [refactor]

    server_version_info wird zu einem statischen Attribut.

  • [dialect] [refactor]

    Dialekte erhalten ein initialisiere()-Ereignis bei der ersten Verbindung, um Verbindungseigenschaften zu ermitteln.

  • [dialect] [refactor]

    Dialekte erhalten ein visit_pool-Ereignis, um die Möglichkeit zu haben, Pool-Listener einzurichten.

  • [dialect] [refactor]

    Zwischengespeicherte TypeEngine-Klassen werden pro Dialektklasse statt pro Dialekt zwischengespeichert.

  • [dialect] [refactor]

    New UserDefinedType sollte als Basisklasse für neue Typen verwendet werden, was das 0.5-Verhalten von get_col_spec() beibehält.

  • [dialect] [refactor]

    Die Methode result_processor() aller Typklassen akzeptiert nun ein zweites Argument „coltype“, das das DBAPI-Typargument von cursor.description ist. Dieses Argument kann einigen Typen helfen, die effizienteste Verarbeitung von Ergebniswerten zu entscheiden.

  • [dialect] [refactor]

    Der veraltete Dialect.get_params() wurde entfernt.

  • [dialect] [refactor]

    Dialect.get_rowcount() wurde in den Deskriptor „rowcount“ umbenannt und ruft cursor.rowcount direkt auf. Dialekte, die für bestimmte Aufrufe einen Rowcount festlegen müssen, sollten die Methode überschreiben, um ein anderes Verhalten zu bieten.

  • [dialect] [refactor]

    DefaultRunner und seine Unterklassen wurden entfernt. Die Aufgabe dieses Objekts wurde vereinfacht und in ExecutionContext verschoben. Dialekte, die Sequenzen unterstützen, sollten eine fire_sequence()-Methode zu ihrer ExecutionContext-Implementierung hinzufügen.

    Referenzen: #1566

  • [dialect] [refactor]

    Funktionen und Operatoren, die vom Compiler generiert werden, verwenden nun (fast) reguläre Dispatch-Funktionen der Form „visit_<opname>“ und „visit_<funcname>_fn“ zur benutzerdefinierten Verarbeitung. Dies ersetzt die Notwendigkeit, die Wörterbücher „functions“ und „operators“ in Compiler-Unterklassen mit einfachen Besucher-Methoden zu kopieren, und ermöglicht es Compiler-Unterklassen, die vollständige Kontrolle über das Rendering zu haben, da das vollständige _Function- oder _BinaryExpression-Objekt übergeben wird.

  • [firebird]

    Die Methode keys() von RowProxy() gibt jetzt die Ergebnisspaltennamen zurück, die normalisiert sind, um SQLAlchemy-Case-Insensitive-Namen zu sein. Das bedeutet, sie sind kleingeschrieben für Case-Insensitive-Namen, während DBAPI sie normalerweise als GROSSBUCHSTABEN zurückgibt. Dies macht row keys() mit weiteren SQLAlchemy-Operationen kompatibel.

  • [firebird]

    Verwendung der neuen Funktion dialect.initialize() zur Einrichtung versionsabhängigen Verhaltens.

  • [firebird]

    Die Funktion „case sensitivity“ erkennt während der Spiegelung einen Spaltennamen, der vollständig kleingeschrieben ist, und fügt „quote=True“ zur generierten Column hinzu, sodass die richtige Anführungszeichen beibehalten wird.

  • [types]

    Die Konstruktion von Typen innerhalb von Dialekten wurde komplett überarbeitet. Dialekte definieren nun ausschließlich öffentlich verfügbare Typen als GROSSBUCHSTABEN-Namen und interne Implementierungstypen mit Unterstrich-Bezeichnern (d. h. sind privat). Das System, mit dem Typen in SQL und DDL ausgedrückt werden, wurde in das Compilersystem verschoben. Dies hat zur Folge, dass es in den meisten Dialekten wesentlich weniger Typobjekte gibt. Ein detailliertes Dokument zu dieser Architektur für Dialektautoren befindet sich in lib/sqlalchemy/dialects/type_migration_guidelines.txt.

  • [types]

    Typen raten nun keine Standardparameter mehr. Insbesondere Numeric, Float, NUMERIC, FLOAT, DECIMAL generieren keine Länge oder Skala, es sei denn, dies wird angegeben.

  • [types]

    types.Binary wird in types.LargeBinary umbenannt, es produziert nur BLOB, BYTEA oder einen ähnlichen „langen Binärtyp“. Neue Basis-BINARY- und VARBINARY-Typen wurden hinzugefügt, um auf diese MySQL/MS-SQL-spezifischen Typen agnostisch zuzugreifen.

    Referenzen: #1664

  • [types]

    String/Text/Unicode-Typen überspringen nun die unicode()-Prüfung für jeden Ergebnisspaltenwert, wenn der Dialekt den DBAPI als nativen Rückgabe von Python-Unicode-Objekten erkannt hat. Diese Prüfung wird beim ersten Verbindungsaufbau durchgeführt, indem „SELECT CAST ‚some text‘ AS VARCHAR(10)“ oder Ähnliches abgefragt wird, und dann geprüft wird, ob das zurückgegebene Objekt ein Python-Unicode ist. Dies ermöglicht eine enorme Leistungssteigerung für native Unicode-DBAPIs, einschließlich pysqlite/sqlite3, psycopg2 und pg8000.

  • [types]

    Die meisten Ergebnisprozessoren von Typen wurden auf mögliche Geschwindigkeitsverbesserungen hin überprüft. Insbesondere die folgenden generischen Typen wurden optimiert, was zu unterschiedlichen Geschwindigkeitsverbesserungen führte: Unicode, PickleType, Interval, TypeDecorator, Binary. Auch die folgenden DBAPI-spezifischen Implementierungen wurden verbessert: Time, Date und DateTime unter SQLite, ARRAY unter PostgreSQL, Time unter MySQL, Numeric (as_decimal=False) unter MySQL, oursql und pypostgresql, DateTime unter cx_oracle und LOB-basierte Typen unter cx_oracle.

  • [types]

    Die Spiegelung von Typen gibt nun den exakten GROSSBUCHSTABEN-Typ aus types.py zurück oder den GROSSBUCHSTABEN-Typ aus dem Dialekt selbst, wenn der Typ kein Standard-SQL-Typ ist. Dies bedeutet, dass die Spiegelung nun genauere Informationen über gespiegelte Typen liefert.

  • [types]

    Ein neuer generischer Enum-Typ wurde hinzugefügt. Enum ist ein Schem-bewusstes Objekt zur Unterstützung von Datenbanken, die spezifische DDL für die Verwendung von Enum oder Äquivalenten benötigen; im Fall von PG kümmert es sich um die Details von CREATE TYPE, und auf anderen Datenbanken ohne native Enum-Unterstützung generiert es VARCHAR + eine Inline-CHECK-Beschränkung, um das Enum zu erzwingen.

    Referenzen: #1109, #1511

  • [types]

    Der Interval-Typ enthält ein „native“-Flag, das steuert, ob native INTERVAL-Typen (PostgreSQL + Oracle) ausgewählt werden, falls verfügbar, oder nicht. Die Argumente „day_precision“ und „second_precision“ wurden ebenfalls hinzugefügt, die entsprechend an diese nativen Typen weitergegeben werden. In Verbindung mit.

    Referenzen: #1467

  • [types]

    Der Boolean-Typ generiert auf Backends, die keine native Boolean-Unterstützung haben, eine CHECK-Beschränkung „col IN (0, 1)“ zusammen mit dem auf int/smallint basierenden Spaltentyp. Dies kann bei Bedarf mit create_constraint=False deaktiviert werden. Beachten Sie, dass MySQL weder native Boolean- noch CHECK-Beschränkungsunterstützung hat, sodass diese Funktion auf dieser Plattform nicht verfügbar ist.

    Referenzen: #1589

  • [types]

    PickleType verwendet nun == für den Vergleich von Werten, wenn mutable=True ist, es sei denn, das Argument „comparator“ mit einer Vergleichsfunktion wird dem Typ übergeben. Objekte, die gepickelt werden, werden anhand der Identität verglichen (was den Zweck von mutable=True vereitelt), wenn __eq__() nicht überschrieben ist oder keine Vergleichsfunktion bereitgestellt wird.

  • [types]

    Die Standardargumente „precision“ und „scale“ von Numeric und Float wurden entfernt und lauten nun standardmäßig None. NUMERIC und FLOAT werden standardmäßig ohne numerische Argumente gerendert, es sei denn, diese Werte werden angegeben.

  • [types]

    AbstractType.get_search_list() wurde entfernt – die Spiele, die dafür verwendet wurden, sind nicht mehr notwendig.

  • [types]

    Ein generischer BigInteger-Typ wurde hinzugefügt, der zu BIGINT oder NUMBER(19) kompiliert.

    Referenzen: #1125

  • [types]

    sqlsoup wurde überarbeitet, um explizit einen Sitzungsstil von 0.5 zu unterstützen, mit autocommit=False, autoflush=True. Das Standardverhalten von SQLSoup erfordert nun die übliche Verwendung von commit() und rollback(), die zu seiner Schnittstelle hinzugefügt wurden. Eine explizite Session oder scoped_session kann an den Konstruktor übergeben werden, wodurch diese Argumente überschrieben werden können.

  • [types]

    db.<sometable>.update() und delete() von sqlsoup rufen nun entsprechend query(cls).update() und delete() auf.

  • [types]

    sqlsoup verfügt nun über execute() und connection(), die die gleichnamigen Sitzungsmethoden aufrufen und sicherstellen, dass die Bindung im Kontext des SqlSoup-Objekts erfolgt.

  • [types]

    sqlsoup-Objekte haben nicht mehr das Attribut ‚query‘ – es wird für das Nutzungsparadigma von sqlsoup nicht benötigt und stört eine Spalte, die tatsächlich ‚query‘ heißt.

  • [types]

    Die Signatur des callable proxy_factory, der an association_proxy übergeben wird, ist nun (lazy_collection, creator, value_attr, association_proxy) und fügt ein viertes Argument hinzu, das das übergeordnete AssociationProxy-Argument ist. Ermöglicht Serialisierbarkeit und Unterklassenbildung der integrierten Sammlungen.

    Referenzen: #1259

  • [types]

    association_proxy hat nun grundlegende Comparator-Methoden .any(), .has(), .contains(), ==, !=, dank Scott Torborg.

    Referenzen: #1372