SQLAlchemy 2.0 Dokumentation
Änderungen und Migration
- SQLAlchemy 2.0 - Major Migration Guide
- Was ist neu in SQLAlchemy 2.0?
- 2.0 Changelog
- 1.4 Changelog
- 1.3 Changelog
- 1.2 Changelog
- 1.1 Changelog
- 1.0 Changelog
- 0.9 Changelog
- 0.8 Changelog
- 0.7 Changelog
- 0.6 Changelog
- 0.5 Changelog
- 0.4 Changelog¶
- 0.3 Changelog
- 0.2 Changelog
- 0.1 Changelog
- Was ist neu in SQLAlchemy 1.4?
- Was ist neu in SQLAlchemy 1.3?
- Was ist neu in SQLAlchemy 1.2?
- Was ist neu in SQLAlchemy 1.1?
- Was ist neu in SQLAlchemy 1.0?
- Was ist neu in SQLAlchemy 0.9?
- Was ist neu in SQLAlchemy 0.8?
- Was ist neu in SQLAlchemy 0.7?
- Was ist neu in SQLAlchemy 0.6?
- Was ist neu in SQLAlchemy 0.5?
- Was ist neu in SQLAlchemy 0.4?
Projektversionen
- Vorherige: 0.5 Changelog
- Nächste: 0.3 Changelog
- Nach oben: Startseite
- Auf dieser Seite
0.4 Changelog¶
0.4.8¶
Veröffentlicht: So 12. Okt 2008orm¶
[orm] ¶
Fehler behoben bezüglich inherit_condition, das mit „A=B“ statt „B=A“ übergeben wurde und zu Fehlern führte
Referenzen: #1039
[orm] ¶
Änderungen an neuen, geänderten und gelöschten Sammlungen in SessionExtension.before_flush() werden für diesen Flush wirksam.
[orm] ¶
label()-Methode zu InstrumentedAttribute hinzugefügt, um die Vorwärtskompatibilität mit 0.5 zu gewährleisten.
sql¶
mysql¶
sqlite¶
[sqlite] ¶
Eine benutzerdefinierte strftime()-Funktion bereitgestellt, die Daten vor 1900 verarbeitet.
Referenzen: #968
[sqlite] ¶
Die Konvertierungslogik für Zeichenketten (und Unicode, UnicodeText usw.) wurde im sqlite-Dialekt deaktiviert, um den neuen Bedarf von pysqlite 2.5.0 zu berücksichtigen, dass nur Python-Unicode-Objekte akzeptiert werden; https://web.archive.org/web/20090614054912/https://itsystementwicklung.de/pipermail/list-pysqlite/2008-March/000018.html
oracle¶
0.4.7p1¶
Veröffentlicht: Do 31. Juli 2008orm¶
[orm] ¶
„add()“ und „add_all()“ zu scoped_session-Methoden hinzugefügt. Workaround für 0.4.7
from sqlalchemy.orm.scoping import ScopedSession, instrument setattr(ScopedSession, "add", instrument("add")) setattr(ScopedSession, "add_all", instrument("add_all"))
[orm] ¶
Nicht-2.3-kompatible Verwendung von set() und Generatorausdruck innerhalb von relation() behoben.
0.4.7¶
Veröffentlicht: Sa 26. Juli 2008orm¶
[orm] ¶
Der contains()-Operator, wenn er mit Many-to-Many verwendet wird, aliasiert die sekundäre (Assoziations-)Tabelle, damit mehrere contains()-Aufrufe nicht miteinander in Konflikt geraten
Referenzen: #1058
[orm] ¶
Fehler behoben, der verhinderte, dass merge() in Verbindung mit comparable_property() funktionierte
[orm] ¶
Die Einstellung enable_typechecks=False bei relation() erlaubt nun nur noch Untertypen mit erbenden Mappern. Völlig unrelated Typen oder Untertypen, die nicht mit Mapper-Vererbung gegen den Zielmapper eingerichtet sind, sind weiterhin nicht erlaubt.
[orm] ¶
Flag is_active zu Sessions hinzugefügt, um zu erkennen, wann eine Transaktion läuft. Dieses Flag ist immer True bei einer „transaktionalen“ (in 0.5 einer nicht-„autocommit“) Session.
Referenzen: #976
sql¶
[sql] ¶
Fehler behoben beim Aufrufen von select([literal(‘foo’)]) oder select([bindparam(‘foo’)]).
schema¶
[schema] ¶
create_all(), drop_all(), create(), drop() lösen nun einen Fehler aus, wenn der Tabellenname oder der Schemaname mehr Zeichen enthält, als das konfigurierte Zeichenlimit des Dialekts zulässt. Einige DBs können zu lange Tabellennamen während der Nutzung verarbeiten, und SQLA kann das auch. Aber verschiedene Reflexions-/checkfirst-während-der-Erstellung-Szenarien schlagen fehl, da wir nach dem Namen in den DB-Katalogtabellen suchen.
Referenzen: #571
[schema] ¶
Der Indexname, der generiert wird, wenn Sie bei einer Spalte „index=True“ angeben, wird auf die für den Dialekt passende Länge gekürzt. Zusätzlich kann ein Index mit einem zu langen Namen nicht explizit mit Index.drop() gelöscht werden, ähnlich wie.
mysql¶
[mysql] ¶
„CALL“ zur Liste der SQL-Schlüsselwörter hinzugefügt, die Ergebnismengen zurückgeben.
oracle¶
[oracle] ¶
Oracle get_default_schema_name() „normalisiert“ den Namen vor der Rückgabe, was bedeutet, dass er einen Kleinbuchstaben-Namen zurückgibt, wenn die Kennung als case-insensitiv erkannt wird.
[oracle] ¶
das Erstellen/Löschen von Tabellen berücksichtigt den Schemanamen bei der Suche nach der vorhandenen Tabelle, sodass Tabellen in anderen Eigentümer-Namensräumen mit demselben Namen nicht kollidieren
Referenzen: #709
[oracle] ¶
Cursor haben nun „arraysize“ auf 50 gesetzt, dessen Wert über das Argument „arraysize“ in create_engine() mit dem Oracle-Dialekt konfiguriert werden kann. Dies dient der Berücksichtigung der Standardeinstellung von cx_oracle von „1“, was zu vielen Roundtrips nach Oracle führt. Dies funktioniert gut in Verbindung mit BLOB/CLOB-gebundenen Cursor, von denen es eine beliebige Anzahl gibt, aber nur für die Lebensdauer dieser Zeilenanforderung (daher ist BufferedColumnRow immer noch nötig, aber weniger).
Referenzen: #1062
[oracle] ¶
- sqlite
SLFloat-Typ hinzugefügt, der der SQLite REAL-Typ-Affinität entspricht. Zuvor wurde nur SLNumeric bereitgestellt, das die NUMERIC-Affinität erfüllt, aber das ist nicht dasselbe wie REAL.
misc¶
0.4.6¶
Veröffentlicht: Sa 10. Mai 2008orm¶
[orm] ¶
Korrektur des kürzlichen relation()-Refactorings, die exotische viewonly-Relationen behebt, die mehrfach zwischen lokalen und entfernten Tabellen joinen, mit einer gemeinsamen Spalte, die zwischen den Joins geteilt wird.
[orm] ¶
Auch viewonly relation()-Konfigurationen, die über mehrere Tabellen joinen, wiederhergestellt.
[orm] ¶
Experimentelles relation()-Flag hinzugefügt, um bei primaryjoins über Funktionen etc. zu helfen, _local_remote_pairs=[tuples]. Dies ergänzt eine komplexe primaryjoin-Bedingung, die es Ihnen ermöglicht, die einzelnen Spaltenpaare anzugeben, aus denen die lokale und entfernte Seite der Relation besteht. Auch die SQL-Generierung für Lazy-Loads wurde verbessert, um das Platzieren von Bind-Parametern innerhalb von Funktionen und anderen Ausdrücken zu ermöglichen. (teilweiser Fortschritt in Richtung)
Referenzen: #610
[orm] ¶
Single-Table-Inheritance repariert, sodass Sie problemlos von einem Joined-Table-Inheriting-Mapper ableiten können.
Referenzen: #1036
[orm] ¶
Fehler „concatenate tuple“ behoben, der bei Query.order_by() auftreten konnte, wenn eine Klauselanpassung stattgefunden hatte.
Referenzen: #1027
[orm] ¶
Alte Assertion entfernt, dass gemappte wählbare Elemente „Aliasnamen“ erfordern – der Mapper erstellt nun selbst einen Alias, wenn keiner vorhanden ist. In diesem Fall müssen Sie jedoch die Klasse und nicht das gemappte wählbare Element als Quelle der Spaltenattribute verwenden – daher wird immer noch eine Warnung ausgegeben.
[orm] ¶
Korrekturen an der „exists“-Funktion bei Vererbung (any(), has(), ~contains()); der vollständige Zieljoin wird in die EXISTS-Klausel für Relationen, die zu Unterklassen verlinken, gerendert.
[orm] ¶
Verwendung der append_result()-Erweiterungsmethode für primäre Query-Zeilen wiederhergestellt, wenn die Erweiterung vorhanden ist und nur eine einzelne Entität als Ergebnis zurückgegeben wird.
[orm] ¶
Auch viewonly relation()-Konfigurationen, die über mehrere Tabellen joinen, wiederhergestellt.
[orm] ¶
Alte Assertion entfernt, dass gemappte wählbare Elemente „Aliasnamen“ erfordern – der Mapper erstellt nun selbst einen Alias, wenn keiner vorhanden ist. In diesem Fall müssen Sie jedoch die Klasse und nicht das gemappte wählbare Element als Quelle der Spaltenattribute verwenden – daher wird immer noch eine Warnung ausgegeben.
[orm] ¶
mapper._save_obj() verfeinert, der unnötigerweise __ne__() auf Skalarwerten während des Flushes aufrief
Referenzen: #1015
[orm] ¶
Eine Funktion für Eager Loading hinzugefügt, bei der Subqueries, die als column_property() mit expliziten Labelnamen (was übrigens nicht notwendig ist) gesetzt sind, beim Instanziieren des Eager-Joins anonymisiert werden, um Konflikte mit Subqueries oder Spalten desselben Namens im Elternobjekt zu vermeiden.
Referenzen: #1019
[orm] ¶
Set-basierte Sammlungen |=, -=, ^= und &= sind strenger bezüglich ihrer Operanden und operieren nur auf Sets, Frozensets oder Unterklassen des Sammlungs-Typs. Zuvor akzeptierten sie jedes duck-typisierte Set.
[orm] ¶
Ein Beispiel dynamic_dict/dynamic_dict.py hinzugefügt, das einen einfachen Weg zeigt, Dictionary-Verhalten über einen dynamic_loader zu legen.
sql¶
[sql] ¶
COLLATE-Unterstützung hinzugefügt über den Operator .collate(<collation>) und die SQL-Funktion collate(<expr>, <collation>).
[sql] ¶
Fehler bei union() behoben, wenn dieser auf nicht-Tabellen-verbundene SELECT-Anweisungen angewendet wurde
[sql] ¶
Verbessertes Verhalten von text()-Ausdrücken, wenn sie als FROM-Klauseln verwendet werden, z. B. select().select_from(text(“sometext”))
Referenzen: #1014
[sql] ¶
Column.copy() beachtet den Wert „autoincrement“, behebt die Verwendung mit Migrate
Referenzen: #1021
mssql¶
[mssql] ¶
„odbc_autotranslate“-Parameter zu Engine/dburi-Parametern hinzugefügt. Jede gegebene Zeichenkette wird an die ODBC-Verbindungszeichenkette übergeben als
”AutoTranslate=%s” % odbc_autotranslate
Referenzen: #1005
[mssql] ¶
„odbc_options“-Parameter zu Engine/dburi-Parametern hinzugefügt. Die gegebene Zeichenkette wird einfach an die von SQLAlchemy generierte ODBC-Verbindungszeichenkette angehängt.
Dies sollte die Notwendigkeit, eine Vielzahl von ODBC-Optionen hinzuzufügen, in Zukunft überflüssig machen.
misc¶
[declarative] [extension] ¶
Joined-Table-Inheritance-Mapper verwenden eine etwas gelockerte Funktion zur Erstellung der „inherit condition“ zur Elterntabelle, sodass andere Fremdschlüssel zu noch nicht deklarierten Tabellenobjekten keinen Fehler auslösen.
[declarative] [extension] ¶
Fehler bei reentrant mapper compile hang behoben, wenn ein deklarierter Attribut innerhalb von ForeignKey verwendet wird, z. B. ForeignKey(MyOtherClass.someattribute)
[engines] ¶
Pool-Listener können nun als Dictionary von Callables oder als (möglicherweise partielles) Duck-Type von PoolListener bereitgestellt werden, Ihre Wahl.
[engines] ¶
„rollback_returned“-Option zu Pool hinzugefügt, die das Rollback() deaktiviert, das beim Zurückgeben von Verbindungen ausgegeben wird. Dieses Flag ist nur sicher bei einer Datenbank, die keine Transaktionen unterstützt (d. h. MySQL/MyISAM).
[ext] ¶
Set-basierte Assoziations-Proxys |=, -=, ^= und &= sind strenger bezüglich ihrer Operanden und operieren nur auf Sets, Frozensets oder anderen Assoziations-Proxys. Zuvor akzeptierten sie jedes duck-typisierte Set.
[firebird] ¶
Die eingebaute Funktion „SUBSTRING(:string FROM :start FOR :length)“ wird behandelt.
0.4.5¶
Veröffentlicht: Fr 04. April 2008orm¶
[orm] ¶
Eine kleine Verhaltensänderung bei session.merge() – existierende Objekte werden anhand der Primärschlüsselattribute überprüft, nicht unbedingt _instance_key. Daher ist die weit verbreitete Anforderung, dass
x = MyObject(id=1) x = sess.merge(x)
nun tatsächlich MyObject mit der ID #1 aus der Datenbank lädt, falls vorhanden. merge() kopiert weiterhin den Zustand des gegebenen Objekts auf das persistente, sodass ein Beispiel wie das obige typischerweise „None“ von allen Attributen von „x“ auf die persistente Kopie kopiert hätte. Dies kann mit session.expire(x) rückgängig gemacht werden.
[orm] ¶
Außerdem wurde das Verhalten von merge() behoben, bei dem Sammlungs-Elemente, die im Ziel, aber nicht in der zusammengeführten Sammlung vorhanden waren, nicht aus dem Ziel entfernt wurden.
[orm] ¶
Eine aggressivere Prüfung auf „ungekompilierte Mapper“ hinzugefügt, was besonders für die deklarative Schicht hilfreich ist
Referenzen: #995
[orm] ¶
Die Methodik hinter „primaryjoin“/„secondaryjoin“ wurde refaktoriert. Das Verhalten sollte etwas intelligenter sein, hauptsächlich in Bezug auf Fehlermeldungen, die auf eine besser lesbare Form reduziert wurden. In einer geringen Anzahl von Szenarien kann es die korrekte Fremdschlüssel besser auflösen als zuvor.
[orm] ¶
comparable_property() hinzugefügt, fügt Query Comparator-Verhalten zu regulären, nicht verwalteten Python-Eigenschaften hinzu
[orm] [‘machines’] [Company.employees.of_type(Engineer)] ¶
Die Funktionalität von query.with_polymorphic() wurde zu mapper() als Konfigurationsoption hinzugefügt.
- Es wird in mehreren Formen eingestellt
with_polymorphic=’*’ with_polymorphic=[mappers] with_polymorphic=(‘*’, selectable) with_polymorphic=([mappers], selectable)
Dies steuert die standardmäßige polymorphe Lade-Strategie für vererbte Mapper. Wenn kein auswählbares Objekt angegeben ist, werden für alle angeforderten joined-table-erbbaren Mapper äußere Joins erstellt. Beachten Sie, dass die automatische Erstellung von Joins nicht mit Concrete-Table-Inheritance kompatibel ist.
Das vorhandene select_table-Flag auf mapper() ist nun veraltet und entspricht with_polymorphic(‘*’, select_table). Beachten Sie, dass die zugrunde liegenden „Innereien“ von select_table vollständig entfernt und durch den neueren, flexibleren Ansatz ersetzt wurden.
Der neue Ansatz erlaubt auch automatisch Eager-Loads für Unterklassen, wenn diese vorhanden sind, zum Beispiel
sess.query(Company).options(eagerload_all())
um Company-Objekte zu laden, deren Mitarbeiter und die ‚machines‘-Sammlung von Mitarbeitern, die zufällig Engineers sind. Eine „with_polymorphic“-Query-Option wird bald eingeführt, die die Kontrolle über with_polymorphic() bei Relationen pro Query ermöglicht.
[orm] ¶
Zwei „experimentelle“ Funktionen zu Query hinzugefügt, „experimentell“, da ihr spezifischer Name/Verhalten noch nicht in Stein gemeißelt ist: _values() und _from_self(). Wir hätten gerne Feedback dazu.
_values(*columns) erhält eine Liste von Spaltenausdrücken und gibt eine neue Query zurück, die nur diese Spalten zurückgibt. Wenn ausgewertet, ist der Rückgabewert eine Liste von Tupeln, genau wie bei add_column() oder add_entity(). Der einzige Unterschied ist, dass „Entität Null“, d. h. die gemappte Klasse, nicht in den Ergebnissen enthalten ist. Dies bedeutet, dass es endlich Sinn macht, group_by() und having() auf Query zu verwenden, die bisher nutzlos herumlagen.
Eine zukünftige Änderung dieser Methode könnte beinhalten, dass ihre Fähigkeit, zu joinen, zu filtern und andere Optionen zuzulassen, die nicht mit einem „Ergebnis-Set“ zusammenhängen, entfernt wird. Das Feedback, das wir suchen, ist, wie Leute _values() verwenden wollen… d. h. ganz am Ende, oder ziehen es Leute vor, nach der Ausführung weiter zu generieren.
_from_self() kompiliert die SELECT-Anweisung für die Query (ohne Eager-Loader) und gibt eine neue Query zurück, die von diesem SELECT auswählt. Sie können also eine Query von einer Query abfragen, ohne die SELECT-Anweisung manuell extrahieren zu müssen. Dies gibt Operationen wie query[3:5]._from_self().filter(some criterion) einen Sinn. Es gibt hier nicht viel Kontroverses, außer dass man schnell hoch verschachtelte, weniger effiziente Queries erstellen kann, und wir hätten gerne Feedback zur Namensgebung.
[orm] ¶
query.order_by() und query.group_by() akzeptieren mehrere Argumente mit *args (wie select() bereits tut).
[orm] ¶
Einige komfortable Deskriptoren für Query hinzugefügt: query.statement gibt die vollständige SELECT-Konstruktion zurück, query.whereclause gibt nur den WHERE-Teil der SELECT-Konstruktion zurück.
[orm] ¶
Behandelt/abgedeckt den Fall der Verwendung eines False/0-Wertes als polymorphen Diskriminator.
[orm] ¶
Fehler behoben, der die Verwendung von synonym()-Attributen mit Vererbung verhinderte
[orm] ¶
SQL-Funktions-Abschneiden von nachgestellten Unterstrichen behoben
Referenzen: #996
[orm] ¶
Wenn Attribute auf einer ausstehenden Instanz abgelaufen sind, wird kein Fehler ausgelöst, wenn die „refresh“-Aktion ausgelöst wird und kein Ergebnis gefunden wird.
[orm] ¶
Session.execute kann nun Bindungen aus Metadaten finden
[orm] ¶
Definition von „selbstreferenziell“ angepasst auf alle zwei Mapper mit einem gemeinsamen Elternteil (dies beeinflusst, ob aliased=True beim Join mit Query erforderlich ist).
[orm] ¶
Einige Korrekturen am Argument „from_joinpoint“ von query.join(), sodass, wenn der vorherige Join aliased war und dieser nicht, der Join trotzdem erfolgreich stattfindet.
[orm] ¶
- Verschiedene Korrekturen bei „cascade deletes“
Fehler bei „cascade delete“-Operation von dynamischen Relationen behoben, die in 0.4.2 nur für die Fremdschlüssel-Nullifizierung implementiert war und nicht für tatsächliche kaskadierende Löschungen
Löschen-Kaskade ohne Löschen-Waise-Kaskade bei einem Many-to-One löscht keine Waisen, die vom Elternteil getrennt wurden, bevor session.delete() auf dem Elternteil aufgerufen wird (One-to-Many hatte dies bereits).
Löschen-Kaskade mit Löschen-Waise löscht Waisen, unabhängig davon, ob sie mit ihrem ebenfalls gelöschten Elternteil verbunden bleiben.
delete-orphan-Kaskade wird bei Relationen, die auf Oberklassen vorhanden sind, bei Verwendung von Vererbung korrekt erkannt.
Referenzen: #895
[orm] ¶
Order_by-Berechnung in Query behoben, um mapper-configurierte order_by korrekt zu aliasieren, wenn select_from() verwendet wird
[orm] ¶
Diff-Logik refaktoriert, die beim Ersetzen einer Sammlung durch eine andere aktiviert wird, in collections.bulk_replace, nützlich für alle, die mehrstufige Sammlungen erstellen.
[orm] ¶
Kaskaden-Traversal-Algorithmus von rekursiv auf iterativ umgestellt, um tiefe Objektgraphen zu unterstützen.
sql¶
[sql] ¶
Schem qualifizierte Tabellen platzieren nun den Schemanamen vor dem Tabellennamen in allen Spaltenausdrücken sowie bei der Generierung von Spaltenlabels. Dies verhindert Namenskollisionen zwischen Schemas in allen Fällen
Referenzen: #999
[sql] ¶
Erlaubt nun SELECTs, die alle FROM-Klauseln korrelieren und keine eigene FROM-Klausel haben. Diese werden typischerweise in einem Skalar-Kontext verwendet, z. B. SELECT x, (SELECT x WHERE y) FROM table. Erfordert expliziten correlate()-Aufruf.
[sql] ¶
’name’ ist kein erforderliches Konstruktorargument mehr für Column(). Es (und .key) kann nun bis zur Hinzufügung der Spalte zu einer Tabelle aufgeschoben werden.
[sql] ¶
like(), ilike(), contains(), startswith(), endswith() nehmen ein optionales Schlüsselwortargument „escape=<somestring>“ an, das als Escape-Zeichen mit der Syntax „x LIKE y ESCAPE ‚<somestring>‘“ gesetzt wird.
[sql] ¶
random() ist nun eine generische SQL-Funktion und wird in die zufällige Implementierung der Datenbank kompiliert, falls vorhanden.
[sql] ¶
update().values() und insert().values() nehmen Schlüsselwortargumente entgegen.
[sql] ¶
Ein Problem in select() bezüglich der Generierung von FROM-Klauseln behoben; in seltenen Fällen konnten zwei Klauseln erzeugt werden, wenn eine die andere aufheben sollte. Einige ORM-Queries mit vielen Eager-Loads könnten dieses Symptom gezeigt haben.
[sql] ¶
Die case()-Funktion nimmt jetzt auch ein Dictionary als Parameter für whens. Sie interpretiert die "THEN"-Ausdrücke standardmäßig als Werte, d.h. case([(x==y, “foo”)] ) interpretiert „foo“ als gebundenen Wert, nicht als SQL-Ausdruck. Verwenden Sie in diesem Fall text(expr) für literale SQL-Ausdrücke. Für das Kriterium selbst dürfen dies literale Strings nur dann sein, wenn das Schlüsselwort „value“ vorhanden ist, andernfalls erzwingt SA die explizite Verwendung von text() oder literal().
mysql¶
[mysql] ¶
Die Verbindungsinformationsschlüssel, die das Dialekt zum Zwischenspeichern von Servereinstellungen verwendet, haben sich geändert und sind jetzt namengeschützt.
mssql¶
[mssql] ¶
Reflektierte Tabellen laden nun automatisch andere Tabellen, auf die durch Fremdschlüssel in der automatisch geladenen Tabelle verwiesen wird.
Referenzen: #979
[mssql] ¶
executemany-Prüfung hinzugefügt, um den Abruf von Identitäten zu überspringen.
Referenzen: #916
[mssql] ¶
Stubs für den kleinen Datentyp hinzugefügt.
Referenzen: #884
[mssql] ¶
Ein neuer Parameter 'driver' für das pyodbc-Dialekt hinzugefügt. Wird in die ODBC-Verbindungszeichenfolge eingefügt, wenn er angegeben ist, standardmäßig auf 'SQL Server'.
[mssql] ¶
Ein neuer Parameter 'max_identifier_length' für das pyodbc-Dialekt hinzugefügt.
[mssql] ¶
Verbesserungen an pyodbc + Unix. Wenn Sie diese Kombination bisher nicht zum Laufen gebracht haben, probieren Sie es bitte erneut.
oracle¶
[oracle] ¶
Das Schlüsselwort „owner“ in Table ist nun veraltet und steht exakt für das Schlüsselwort „schema“. Tabellen können nun mit alternativen „owner“-Attributen reflektiert werden, die explizit im Table-Objekt angegeben sind oder nicht „schema“ verwenden.
[oracle] ¶
Die gesamte „magische“ Suche nach Synonymen, DBLINKs usw. während der Tabellenreflexion ist standardmäßig deaktiviert, es sei denn, Sie geben „oracle_resolve_synonyms=True“ im Table-Objekt an. Das Auflösen von Synonymen führt notwendigerweise zu etwas unsauberen Vermutungen, die wir lieber standardmäßig weglassen. Wenn das Flag gesetzt ist, werden Tabellen und zugehörige Tabellen in allen Fällen gegen Synonyme aufgelöst, d.h. wenn ein Synonym für eine bestimmte Tabelle existiert, wird die Reflexion es bei der Reflexion zugehöriger Tabellen verwenden. Dies ist ein klebenderes Verhalten als zuvor, weshalb es standardmäßig deaktiviert ist.
misc¶
[declarative] [extension] ¶
Die Funktion „synonym“ ist nun direkt mit „declarative“ verwendbar. Übergeben Sie die dekorierte Eigenschaft mit dem Schlüsselwortargument „descriptor“, z.B.: somekey = synonym(‚_somekey‘, descriptor=property(g, s))
[declarative] [extension] ¶
Die Funktion „deferred“ ist mit „declarative“ verwendbar. Die einfachste Verwendung ist die gemeinsame Deklaration von deferred und Column, z.B.: data = deferred(Column(Text))
[declarative] [extension] ¶
Declarative hat auch @synonym_for(…) und @comparable_using(…) erhalten, Frontends für synonym und comparable_property.
[declarative] [extension] ¶
Verbesserungen an der Mapper-Kompilierung bei Verwendung von deklarativen; bereits kompilierte Mapper lösen weiterhin Kompilierungen anderer unkompilierter Mapper aus, wenn sie verwendet werden.
Referenzen: #995
[declarative] [extension] ¶
Declarative schließt die Einrichtung für Columns ohne Namen ab, was eine trockenere Syntax ermöglicht.
- class Foo(Base)
__tablename__ = ‘foos’ id = Column(Integer, primary_key=True)
[declarative] [extension] ¶
Vererbung in deklarativen kann deaktiviert werden, indem „inherits=None“ an __mapper_args__ übergeben wird.
[declarative] [extension] ¶
declarative_base() nimmt ein optionales Kwarg „mapper“ entgegen, das ein beliebiger Callable/Klasse/Methode ist, die einen Mapper erzeugt, wie z.B. declarative_base(mapper=scopedsession.mapper). Diese Eigenschaft kann auch auf einzelne deklarative Klassen gesetzt werden, indem die Eigenschaft „__mapper_cls__“ verwendet wird.
[postgres] ¶
PG-Serverseitige Cursor wurden wieder in Form gebracht, feste Unit-Tests als Teil der Standard-Testsuite hinzugefügt. Bessere Einzigartigkeit für die Cursor-ID hinzugefügt.
Referenzen: #1001
0.4.4¶
Veröffentlicht: Mi 12. März 2008orm¶
[orm] ¶
any(), has(), contains(), ~contains(), Attributebene == und != funktionieren nun korrekt mit selbstreferenziellen Beziehungen – die Klausel innerhalb des EXISTS wird auf der „remote“-Seite mit einem Alias versehen, um sie von der übergeordneten Tabelle zu unterscheiden. Dies gilt für selbstreferenzielle Single-Table- ebenso wie für vererbungsbasierte selbstreferenzielle Beziehungen.
[orm] ¶
Das Verhalten der Operatoren == und != auf Relationsebene bei Vergleichen mit NULL für Eins-zu-Eins-Beziehungen wurde repariert.
Referenzen: #985
[orm] ¶
Fehler behoben, bei dem Session.expire()-Attribute auf einer polymorphisch zugeordneten Instanz, die von einem select_table-Mapper zugeordnet wurde, nicht geladen wurden.
[orm] ¶
query.with_polymorphic() hinzugefügt – gibt eine Liste von Klassen an, die von der Basisklasse abstammen und der FROM-Klausel der Abfrage hinzugefügt werden. Ermöglicht die Verwendung von Unterklassen in Filterkriterien sowie die vorab ladende Abfrage der Attribute dieser Unterklassen.
[orm] ¶
Ihre Rufe wurden erhört: Das Entfernen eines ausstehenden Elements aus einem Attribut oder einer Sammlung mit delete-orphan löscht das Element aus der Sitzung; es wird kein FlushError ausgelöst. Beachten Sie, dass auch wenn Sie das ausstehende Element explizit mit session.save() gespeichert haben, die Entfernung des Attributs/der Sammlung es trotzdem entfernt.
[orm] ¶
session.refresh() und session.expire() lösen einen Fehler aus, wenn sie auf Instanzen aufgerufen werden, die nicht persistent in der Sitzung sind.
[orm] ¶
Potenzieller generativer Fehler behoben, wenn dieselbe Abfrage zur Erzeugung mehrerer Abfrageobjekte mit join() verwendet wurde.
[orm] ¶
Fehler behoben, der in 0.4.3 eingeführt wurde, bei dem das Laden einer bereits persistenten, mit Joined Table Inheritance zugeordneten Instanz eine nutzlose „sekundäre“ Ladung von ihrer Joined Table auslöste, wenn die Standardeinstellung „select“ polymorphic_fetch verwendet wurde. Dies lag daran, dass Attribute während des ersten Ladens als abgelaufen markiert wurden und nach dem vorherigen „sekundären“ Laden nicht wieder entmarkiert wurden. Attribute werden nun basierend auf ihrer Anwesenheit in __dict__ nach erfolgreichem Laden oder Commit-Vorgang entmarkiert.
[orm] ¶
Die Query-Methoden apply_sum(), apply_max(), apply_min(), apply_avg() sind veraltet. Bessere Methoden kommen...
[orm] ¶
relation() kann einen Callable für sein erstes Argument akzeptieren, der die zu beziehende Klasse zurückgibt. Dies dient dazu, deklarative Pakete beim Definieren von Beziehungen zu unterstützen, bevor die Klassen vorhanden sind.
[orm] ¶
Ein neuer "höherstufiger" Operator namens "of_type()" wurde hinzugefügt: wird in join() sowie bei any() und has() verwendet, qualifiziert die Unterklasse, die in Filterkriterien verwendet wird, z.B.
- query.filter(Company.employees.of_type(Engineer).
any(Engineer.name==’foo’))
oder
- query.join(Company.employees.of_type(Engineer)).
filter(Engineer.name==’foo’)
[orm] ¶
Präventiver Code gegen einen potenziellen Bug bei verlorengegangenen Referenzen in flush().
[orm] ¶
Ausdrücke, die in filter(), filter_by() und anderen verwendet werden, wenn sie eine Klausel verwenden, die aus einer Relation unter Verwendung der Identität eines untergeordneten Objekts generiert wurde (z.B. filter(Parent.child==<somechild>)), werten den tatsächlichen Primärschlüsselwert von <somechild> zur Ausführungszeit aus, damit der Autoflush-Schritt der Abfrage abgeschlossen werden kann, wodurch der PK-Wert von <somechild> im Falle, dass <somechild> ausstehend war, bevölkert wird.
[orm] ¶
Das Setzen des relations()-level order by auf eine Spalte in der Many-to-Many-„secondary“-Tabelle funktioniert nun mit Eager Loading; zuvor wurde die „order by“-Klausel nicht gegen den Alias der sekundären Tabelle mit einem Alias versehen.
[orm] ¶
Synonyme, die auf bestehenden Deskriptoren aufbauen, sind nun vollständige Proxies für diese Deskriptoren.
sql¶
[sql] ¶
Aliase von Selects gegen textuelle FROM-Klauseln können nun wieder erstellt werden.
Referenzen: #975
[sql] ¶
Der Wert eines bindparam() kann ein Callable sein, in welchem Fall er zum Zeitpunkt der Statement-Ausführung ausgewertet wird, um den Wert zu erhalten.
[sql] ¶
Ausnahmebehandlung/Wiederverbindungsunterstützung für das Abrufen von Ergebnismengen hinzugefügt. Wiederverbindung funktioniert für die Datenbanken, die bei Ergebnissen einen abfangbaren Datenfehler auslösen (d.h. funktioniert nicht mit MySQL).
Referenzen: #978
[sql] ¶
Zwei-Phasen-API für den "threadlocal"-Engine implementiert, über engine.begin_twophase(), engine.prepare().
Referenzen: #936
[sql] ¶
Fehler behoben, der verhinderte, dass UNIONS geklont werden konnten.
Referenzen: #986
[sql] ¶
Schlüsselwortargument "bind" zu insert(), update(), delete() und DDL() hinzugefügt. Die Eigenschaft ".bind" ist nun auf diesen Statements sowie auf select() zuweisbar.
[sql] ¶
Insert-Statements können nun mit zusätzlichen "prefix"-Wörtern zwischen INSERT und INTO kompiliert werden, für Herstellerspezialerweiterungen wie MySQLs INSERT IGNORE INTO table.
extensions¶
[extensions] ¶
Eine neue, extrem kleine "declarative"-Erweiterung wurde hinzugefügt, die es ermöglicht, Table- und mapper()-Konfigurationen inline unter einer Klassendeklaration vorzunehmen. Diese Erweiterung unterscheidet sich von ActiveMapper und Elixir dadurch, dass sie keine SQLAlchemy-Semantik neu definiert; literale Column-, Table- und relation()-Konstrukte werden verwendet, um das Klassenverhalten und die Tabellendefinition zu definieren.
misc¶
[dialects] ¶
Ungültige SQLite-Verbindungs-URLs lösen nun einen Fehler aus.
[dialects] ¶
Postgres TIMESTAMP wird korrekt gerendert.
Referenzen: #981
[dialects] ¶
PGArray in Postgres ist standardmäßig ein "veränderbarer" Typ; wenn er mit ORM verwendet wird, werden veränderbare Gleichheits-/Kopier-beim-Schreiben-Techniken verwendet, um Änderungen zu testen.
0.4.3¶
Veröffentlicht: Do 14. Feb 2008general¶
orm¶
[orm] ¶
Jeder Session.begin() muss nun von einem entsprechenden commit() oder rollback() begleitet werden, es sei denn, die Sitzung wird mit Session.close() geschlossen. Dies schließt auch das begin() ein, das implizit für eine Sitzung ist, die mit transactional=True erstellt wurde. Die größte Änderung hierbei ist, dass wenn eine mit transactional=True erstellte Sitzung während flush() eine Ausnahme auslöst, Sie Session.rollback() oder Session.close() aufrufen müssen, damit diese Sitzung nach einer Ausnahme fortgesetzt werden kann.
[orm] ¶
Fehler beim Verdoppeln von Collections durch merge() beim Zusammenführen von transienten Entitäten mit Backref-Collections behoben.
Referenzen: #961
[orm] ¶
merge(dont_load=True) akzeptiert keine transienten Entitäten, dies steht im Einklang mit der Tatsache, dass merge(dont_load=True) auch keine „dirty“ Objekte akzeptiert.
[orm] ¶
Eine eigenständige Klassenattribut „query“, die von einer scoped_session generiert wird, wurde hinzugefügt. Dies bietet MyClass.query ohne Verwendung von Session.mapper. Verwendung über
MyClass.query = Session.query_property()
[orm] ¶
Die korrekte Fehlermeldung wird ausgegeben, wenn versucht wird, auf abgelaufene Instanzattribute zuzugreifen, wenn keine Sitzung vorhanden ist.
[orm] ¶
dynamic_loader() / lazy=”dynamic” akzeptiert und verwendet nun den order_by-Parameter auf dieselbe Weise, wie er mit relation() funktioniert.
[orm] ¶
expire_all()-Methode zu Session hinzugefügt. Ruft expire() für alle persistenten Instanzen auf. Dies ist praktisch in Verbindung mit…
[orm] ¶
Instanzen, die teilweise oder vollständig abgelaufen sind, werden ihre abgelaufenen Attribute während eines regulären Query-Vorgangs, der diese Objekte betrifft, bevölkern, wodurch eine unnötige zweite SQL-Anweisung für jede Instanz verhindert wird.
[orm] ¶
Dynamische Relationen erstellen bei Referenzierung eine starke Referenz auf das Elternobjekt, sodass die Abfrage immer noch ein Elternteil hat, auf das sie zugreifen kann, selbst wenn das Elternteil nur innerhalb des Gültigkeitsbereichs eines einzelnen Ausdrucks erstellt (und andernfalls dereferenziert) wird.
Referenzen: #938
[orm] ¶
Ein Mapper()-Flag „eager_defaults“ wurde hinzugefügt. Wenn auf True gesetzt, werden Standardwerte, die während eines INSERT- oder UPDATE-Vorgangs generiert werden, sofort nachgeholt, anstatt bis später aufgeschoben zu werden. Dies ahmt das alte Verhalten von 0.3 nach.
[orm] ¶
query.join() kann nun Klassen-zuordnungsattribute als Argumente akzeptieren. Diese können anstelle von oder in beliebiger Kombination mit Strings verwendet werden. Insbesondere ermöglicht dies die Konstruktion von Joins zu Unterklassen auf einer polymorphen Relation, d.h.
query(Company).join(['employees', Engineer.name])
[orm] [(‘employees’] [Engineer.name] [people.join(engineer))] ¶
query.join() kann auch Tupel aus Attributnamen/einem wählbaren Objekt als Argumente akzeptieren. Dies ermöglicht die Konstruktion von Joins *von* Unterklassen einer polymorphen Relation aus, d.h.
query(Company).join(
)
[orm] ¶
Allgemeine Verbesserungen am Verhalten von join() in Verbindung mit polymorphen Mappern, d.h. das Verbinden von/zu polymorphen Mappern und das korrekte Anwenden von Aliassen.
[orm] ¶
Behoben/verbessert das Verhalten, wenn ein Mapper den natürlichen „Primärschlüssel“ eines zugeordneten Joins bestimmt. Er reduziert Spalten, die über eine Fremdschlüsselbeziehung äquivalent sind, wirksamer. Dies beeinflusst unter anderem, wie viele Argumente an query.get() übergeben werden müssen.
Referenzen: #933
[orm] ¶
Der Lazy Loader kann nun eine Join-Bedingung handhaben, bei der die „gebundene“ Spalte (d.h. diejenige, der die Eltern-ID als Bindungsparameter gesendet wird) mehr als einmal in der Join-Bedingung vorkommt. Insbesondere ermöglicht dies die übliche Aufgabe einer Relation(), die eine elternkorrelierte Unterabfrage enthält, wie z.B. „nur das aktuellste Kindelement auswählen“.
Referenzen: #946
[orm] ¶
Fehler in der polymorphen Vererbung behoben, bei dem eine falsche Ausnahme ausgelöst wurde, wenn die Basis-polymorphic_on-Spalte nicht mit Spalten innerhalb des lokalen wählbaren Objekts eines inheriting mapper mehr als eine Ebene tief übereinstimmte.
[orm] ¶
Fehler in der polymorphen Vererbung behoben, der das Setzen eines funktionierenden „order_by“ auf einem polymorphen Mapper erschwerte.
[orm] ¶
Ein recht teurer Aufruf in Query, der polymorphe Abfragen verlangsamte, wurde behoben.
[orm] ¶
„Passive Defaults“ und andere „Inline“-Defaults können nun während eines flush()-Aufrufs nachgeladen werden, falls erforderlich; insbesondere ermöglicht dies die Konstruktion von relations(), bei denen eine Fremdschlüsselspalte auf eine serverseitig generierte Nicht-Primärschlüsselspalte verweist.
Referenzen: #954
[orm] ¶
- Zusätzliche Session-Transaktionskorrekturen/Änderungen.
Fehler bei der Session-Transaktionsverwaltung behoben: Übergeordnete Transaktionen wurden nicht auf der Verbindung gestartet, wenn eine Verbindung zu einer verschachtelten Transaktion hinzugefügt wurde.
session.transaction bezieht sich nun immer auf die innerste aktive Transaktion, auch wenn commit/rollback direkt auf dem Session-Transaktionsobjekt aufgerufen werden.
Zwei-Phasen-Transaktionen können nun vorbereitet werden.
Wenn die Vorbereitung einer Zwei-Phasen-Transaktion auf einer Verbindung fehlschlägt, werden alle Verbindungen zurückgerollt.
session.close() schloss nicht alle Transaktionen, wenn verschachtelte Transaktionen verwendet wurden.
rollback() setzte die aktuelle Transaktion zuvor fälschlicherweise direkt auf die übergeordnete Transaktion, zu der zurückgerollt werden konnte. Nun rollt es die nächste übergeordnete Transaktion zurück, die sie handhaben kann, setzt aber die aktuelle Transaktion auf ihre übergeordnete Transaktion und deaktiviert die dazwischen liegenden Transaktionen. Inaktive Transaktionen können nur zurückgerollt oder geschlossen werden, jeder andere Aufruf führt zu einem Fehler.
autoflush für commit() hat einfache Untertransaktionen nicht geflusht.
unitofwork flush schloss die fehlgeschlagene Transaktion nicht, wenn sich die Sitzung nicht in einer Transaktion befand und das Commit der Transaktion fehlschlug.
[orm] ¶
Verschiedene Tickets.
sql¶
[sql] ¶
„schema.DDL“ wurde hinzugefügt, eine ausführbare Freiform-DDL-Anweisung. DDLs können isoliert ausgeführt oder an Table- oder MetaData-Instanzen angehängt und automatisch ausgeführt werden, wenn diese Objekte erstellt und/oder gelöscht werden.
[sql] ¶
Tabellenspalten und -beschränkungen können für eine vorhandene Tabelle (wie z. B. eine bereits reflektierte Tabelle) mit dem Flag ‚useexisting=True‘ überschrieben werden, das nun die übergebenen Argumente berücksichtigt.
[sql] ¶
Eine aufrufbare DDL-Erechnittstelle wurde hinzugefügt, die Hooks vor und nach dem Erstellen und Löschen von Tabellen und Metadaten hinzufügt.
[sql] ¶
Generative Methode where(<criterion>) zu delete() und update() Konstrukten hinzugefügt, die ein neues Objekt zurückgibt, bei dem das Kriterium über AND mit dem vorhandenen Kriterium verknüpft ist, genau wie bei select().where().
[sql] ¶
Der Operator "ilike()" wurde zu Spaltenoperationen hinzugefügt. Kompiliert als ILIKE unter Postgres, lower(x) LIKE lower(y) bei allen anderen.
Referenzen: #727
[sql] ¶
„now()“ als generische Funktion hinzugefügt; kompiliert unter SQLite, Oracle und MSSQL als „CURRENT_TIMESTAMP“; „now()“ bei allen anderen.
Referenzen: #943
[sql] ¶
Die Operatoren startswith(), endswith() und contains() verketten nun den Wildcard-Operator mit dem gegebenen Operanden in SQL, d.h. „‚%‘ || <bindparam>“ in allen Fällen, akzeptieren text(‚something‘) Operanden korrekt.
Referenzen: #962
[sql] ¶
cast() akzeptiert text(‚something‘) und andere nicht-literale Operanden korrekt.
Referenzen: #962
[sql] ¶
Fehler im Ergebnisproxy behoben, bei dem anonym generierte Spaltenbeschriftungen nicht mit ihrem direkten String-Namen zugänglich waren.
[sql] ¶
Deferrable constraints können nun definiert werden.
[sql] ¶
Das Schlüsselwortargument „autocommit=True“ wurde zu select() und text() sowie die generative Methode autocommit() auf select() hinzugefügt; für Statements, die die Datenbank durch benutzerdefinierte Mittel ändern, die nicht INSERT/UPDATE/DELETE usw. sind. Dieses Flag aktiviert das „Autocommit“-Verhalten während der Ausführung, wenn keine Transaktion aktiv ist.
Referenzen: #915
[sql] ¶
Das Attribut „.c.“ auf einem wählbaren Objekt erhält nun einen Eintrag für jede Spaltenexpression in seiner Spaltenklausel. Zuvor wurden „unbenannte“ Spalten wie Funktionen und CASE-Anweisungen dort nicht aufgenommen. Nun werden sie aufgenommen, wobei ihre vollständige String-Darstellung verwendet wird, wenn kein „Name“ verfügbar ist.
[sql] ¶
Ein CompositeSelect, d.h. jede union(), union_all(), intersect() usw. stellt nun sicher, dass jede wählbare Einheit die gleiche Anzahl von Spalten enthält. Dies entspricht der entsprechenden SQL-Anforderung.
[sql] ¶
Der anonyme „label“, der für ansonsten unbeschriftete Funktionen und Ausdrücke generiert wird, breitet sich nun zur Kompilierungszeit nach außen aus für Ausdrücke wie select([select([func.foo()])]).
[sql] ¶
Aufbauend auf den obigen Ideen baut CompositeSelects nun seine „.c.“-Sammlung basierend auf den Namen in der ersten wählbaren Einheit auf; corresponding_column() funktioniert nun vollständig für alle eingebetteten wählbaren Einheiten.
[sql] ¶
Oracle und andere kodieren SQL für Standardwerte wie Sequenzen usw. korrekt, auch wenn keine Unicode-Identifikatoren verwendet werden, da der Identifikator-Präparator einen zwischengespeicherten Unicode-Identifikator zurückgeben kann.
[sql] ¶
Spalten- und Klauselvergleiche mit Datumszeitobjekten auf der linken Seite des Ausdrucks funktionieren nun (d < table.c.col). (Datumszeiten auf der rechten Seite haben schon immer funktioniert, die Ausnahme auf der linken Seite ist eine Eigenart der Datumszeit-Implementierung.)
misc¶
[dialects] ¶
Bessere Unterstützung für Schemas in SQLite (verknüpft durch ATTACH DATABASE … AS name). In einigen Fällen in der Vergangenheit wurden für SQLite Schema-Namen aus dem generierten SQL weggelassen. Dies ist nicht mehr der Fall.
[dialects] ¶
table_names in SQLite erfasst nun auch temporäre Tabellen.
[dialects] ¶
Automatische Erkennung eines nicht spezifizierten MySQL ANSI_QUOTES-Modus während Reflexionsoperationen, Unterstützung für die Änderung des Modus während des Betriebs. Manuelle Moduseinstellung ist weiterhin erforderlich, wenn keine Reflexion verwendet wird.
[dialects] ¶
Reflexion von TIME-Spalten unter SQLite behoben.
[dialects] ¶
Schließlich wurde der PGMacAddr-Typ zu Postgres hinzugefügt.
Referenzen: #580
[dialects] ¶
Reflektieren Sie die Sequenz, die einem PK-Feld zugeordnet ist (typischerweise mit einem BEFORE INSERT-Trigger) unter Firebird.
[dialects] ¶
Oracle sammelt die korrekten Spalten in der Ergebnisspaltenzuordnung, wenn eine LIMIT/OFFSET-Unterabfrage generiert wird, und ermöglicht so, dass Spalten ordnungsgemäß Ergebnisspalten zugeordnet werden, auch wenn die Langnamenbeschneidung greift.
Referenzen: #941
[dialects] ¶
MSSQL enthält jetzt EXEC im _is_select-Regexp, was die Verwendung von zeilenrückgebenden gespeicherten Prozeduren ermöglichen sollte.
[dialects] ¶
MSSQL enthält jetzt eine experimentelle Implementierung von LIMIT/OFFSET unter Verwendung der ANSI SQL row_number()-Funktion, sodass MSSQL-2005 oder höher erforderlich ist. Um die Funktion zu aktivieren, fügen Sie "has_window_funcs" zu den Schlüsselwortargumenten für connect hinzu oder fügen Sie "?has_window_funcs=1" zu Ihren dburi-Abfrageargumenten hinzu.
[ext] ¶
ext.activemapper wurde geändert, um eine nicht-transaktionale Sitzung für den Objektspeicher zu verwenden.
[ext] ¶
Die Ausgabereihenfolge von "[‘a’] + obj.proxied" binären Operationen für assoziationsproxierte Listen wurde korrigiert.
0.4.2p3¶
Veröffentlicht: Mi, 09. Jan 2008general¶
[general] ¶
Das Unterversionsnummerierungsschema wurde geändert, um den Regeln der setuptools-Versionsnummer zu entsprechen; easy_install -u sollte jetzt diese Version gegenüber 0.4.2 erhalten.
orm¶
[orm] ¶
Fehler mit session.dirty bei Verwendung von "mutable scalars" (wie PickleTypes) behoben.
[orm] ¶
Eine aussagekräftigere Fehlermeldung hinzugefügt, wenn beim Leeren einer Relation(), die nicht lokal zugeordnete Spalten in ihrer primären oder sekundären Join-Bedingung hat, ein Fehler auftritt.
[orm] ¶
Es werden jetzt *alle* Fehler in InstanceState.__cleanup() unterdrückt.
[orm] ¶
Fehler in der Attributhistorie behoben, bei dem die Zuweisung einer neuen Sammlung zu einem sammlungsbasierten Attribut, das bereits ausstehende Änderungen hatte, eine falsche Historie erzeugte.
Referenzen: #922
[orm] ¶
Fehler beim Kaskadieren von löschen-Waisenobjekten behoben, bei dem das zweimalige Setzen desselben Objekts auf ein Skalarattribut es als Waise protokollieren konnte.
Referenzen: #925
[orm] ¶
Kaskadierung bei einer += Zuweisung an eine listenbasierte Relation behoben.
[orm] ¶
Synonyme können jetzt gegen noch nicht existierende Props erstellt werden, die später über add_property() hinzugefügt werden. Dies betrifft häufig Backrefs. (d. h. Sie können Synonyme für Backrefs erstellen, ohne sich Gedanken über die Reihenfolge der Operationen machen zu müssen)
Referenzen: #919
[orm] ¶
Fehler behoben, der bei einem polymorphen "union"-Mapper auftreten konnte, der auf "deferred" Laden von vererbenden Tabellen zurückfällt.
[orm] ¶
Die Sammlung "columns" eines Mappers/einer zugeordneten Klasse (d.h. 'c') bezieht sich auf die zugeordnete Tabelle und nicht auf die select_table im Falle des polymorphen "union"-Ladens (dies sollte nicht bemerkbar sein).
[orm] ¶
Ein ziemlich kritischer Fehler behoben, bei dem dieselbe Instanz mehr als einmal in der new-Sammlung der UnitOfWork aufgeführt werden konnte; dies trat am häufigsten bei der Verwendung einer Kombination aus vererbenden Mappern und ScopedSession.mapper auf, da die mehrfachen __init__-Aufrufe pro Instanz das Objekt mit unterschiedlichen _state-Objekten speichern() konnten.
[orm] ¶
Ein sehr rudimentäres Yielding-Iterator-Verhalten zu Query hinzugefügt. Rufen Sie query.yield_per(<Anzahl der Zeilen>) auf und werten Sie die Query in einem iterativen Kontext aus; jede Sammlung von N Zeilen wird verpackt und geliefert. Verwenden Sie diese Methode mit äußerster Vorsicht, da sie nicht versucht, eager geladene Sammlungen über Stapelgrenzen hinweg zu synchronisieren, noch wird sie sich gut verhalten, wenn dieselbe Instanz in mehr als einem Stapel vorkommt. Dies bedeutet, dass eine eager geladene Sammlung geleert wird, wenn sie in mehr als einem Stapel referenziert wird, und in allen Fällen werden Attribute auf Instanzen überschrieben, die in mehr als einem Stapel vorkommen.
[orm] ¶
In-place Set-Mutationsoperatoren für Set-Sammlungen und assoziationsproxierte Sets behoben.
Referenzen: #920
sql¶
[sql] ¶
Der Texttyp wird jetzt ordnungsgemäß exportiert und löst keine Warnung bei DDL-Erstellung aus; String-Typen ohne Länge lösen nur Warnungen während CREATE TABLE aus.
Referenzen: #912
[sql] ¶
Neuer UnicodeText-Typ hinzugefügt, um einen kodierten, unbegrenzten Texttyp anzugeben.
[sql] ¶
Fehler in union() behoben, sodass select()-Anweisungen, die nicht von FromClause-Objekten abgeleitet sind, unioned werden können.
[sql] ¶
Der Name TEXT wurde in Text geändert, da es sich um einen "generischen" Typ handelt; Der Name TEXT ist bis 0.5 veraltet. Das "Upgrade"-Verhalten von String zu Text, wenn keine Länge vorhanden ist, ist ebenfalls bis 0.5 veraltet; es wird eine Warnung ausgegeben, wenn es für CREATE TABLE-Anweisungen verwendet wird (String ohne Länge für SQL-Ausdruckszwecke ist weiterhin in Ordnung).
Referenzen: #912
[sql] ¶
Die generative Methode select.order_by(None) / group_by(None) konnte die ORDER BY/GROUP BY-Kriterien nicht zurücksetzen, behoben.
Referenzen: #924
misc¶
[dialects] ¶
Reflektion von MySQL-Standardwerten für leere Zeichenketten behoben.
[ext] ¶
Unterstützung für '+', '*', '+=' und '*=' für assoziationsproxierte Listen.
[dialects] ¶
MSSQL - Die Prüfung auf "date"/"datetime" in MSDate/MSDateTime-Unterklassen wurde verfeinert, sodass eingehende "datetime"-Objekte nicht mehr fälschlicherweise als "date"-Objekte und umgekehrt interpretiert werden.
Referenzen: #923
[dialects] ¶
Der fehlende Aufruf des Ergebnisverarbeitungsprozessors für den PGArray-Typ wurde behoben.
Referenzen: #913
0.4.2¶
Veröffentlicht: Mi, 02. Jan 2008orm¶
[orm] ¶
Eine wesentliche Verhaltensänderung bei sammlungsbasierten Backrefs: Sie lösen keine Lazy Loads mehr aus! "Reverse"-Hinzufügungen und -Entfernungen werden in die Warteschlange gestellt und mit der Sammlung zusammengeführt, wenn sie tatsächlich gelesen und geladen wird; sie lösen jedoch keine vorherige Ladung aus. Für Benutzer, die dieses Verhalten bemerkt haben, sollte dies in einigen Fällen bequemer sein als die Verwendung dynamischer Relationen; für diejenigen, die es nicht bemerkt haben, werden Sie möglicherweise feststellen, dass Ihre Apps in einigen Situationen deutlich weniger Abfragen verwenden als zuvor.
Referenzen: #871
[orm] ¶
Unterstützung für veränderliche Primärschlüssel hinzugefügt. Primärschlüsselspalten können frei geändert werden, und die Identität der Instanz ändert sich beim Leeren. Darüber hinaus werden Update-Kaskadierungen von Fremdschlüsselreferenten (primärer Schlüssel oder nicht) entlang von Relationen unterstützt, entweder in Verbindung mit der ON UPDATE CASCADE-Funktion der Datenbank (erforderlich für Datenbanken wie Postgres) oder direkt vom ORM in Form von UPDATE-Anweisungen ausgegeben, indem das Flag "passive_cascades=False" gesetzt wird.
[orm] ¶
Vererbende Mapper erben jetzt direkt die MapperExtensions ihres übergeordneten Mappers, sodass alle Methoden für eine bestimmte MapperExtension auch für Unterklassen aufgerufen werden. Wie immer kann jede MapperExtension entweder EXT_CONTINUE zurückgeben, um die Erweiterungsverarbeitung fortzusetzen, oder EXT_STOP, um die Verarbeitung zu stoppen. Die Reihenfolge der Mapperauflösung ist: <auf dem Mapper der Klassen deklarierte Erweiterungen> <auf dem Mapper der übergeordneten Klassen deklarierte Erweiterungen> <global deklarierte Erweiterungen>.
Beachten Sie, dass, wenn Sie dieselbe Erweiterungsklasse separat instanziieren und sie dann für zwei Mapper in derselben Vererbungskette einzeln anwenden, die Erweiterung auf die vererbende Klasse zweimal angewendet wird und jede Methode zweimal aufgerufen wird.
Um eine Mapper-Erweiterung explizit auf jede vererbende Klasse anzuwenden, aber jede Methode nur einmal pro Operation aufzurufen, verwenden Sie dieselbe Instanz der Erweiterung für beide Mapper.
Referenzen: #490
[orm] ¶
MapperExtension.before_update() und after_update() werden jetzt symmetrisch aufgerufen; zuvor konnte eine Instanz, die keine geänderten Spaltenattribute hatte (aber eine relation()-Änderung aufwies), mit before_update() aufgerufen werden, aber nicht mit after_update().
Referenzen: #907
[orm] ¶
Spalten, die in der SELECT-Anweisung einer Query fehlen, werden jetzt automatisch beim Laden verzögert.
[orm] ¶
zugeordnete Klassen, die von "object" erben und keine __init__()-Methode bereitstellen, lösen jetzt TypeError aus, wenn nicht leere *args oder **kwargs beim Erstellen von Instanzen vorhanden sind (und nicht von Erweiterungen wie ScopedSession.mapper verbraucht werden), konsistent mit dem Verhalten normaler Python-Klassen.
Referenzen: #908
[orm] ¶
Query-Fehler behoben, wenn filter_by() eine Relation mit None vergleicht.
Referenzen: #899
[orm] ¶
Verbesserte Unterstützung für das Pickling von zugeordneten Entitäten. Instanzbezogene Lazy/Deferred/Expired-Aufrufbare sind jetzt serialisierbar, sodass sie mit _state serialisiert und deserialisiert werden.
[orm] ¶
Neues Synonym()-Verhalten: Ein Attribut wird auf der zugeordneten Klasse platziert, wenn noch keines existiert, in allen Fällen. Wenn bereits eine Eigenschaft auf der Klasse existiert, dekoriert das Synonym die Eigenschaft mit den entsprechenden Vergleichsoperatoren, sodass sie wie jedes andere zugeordnete Attribut in Spaltenausdrücken verwendet werden kann (d.h. in filter() usw. verwendbar). Das Flag "proxy=True" ist veraltet und hat keine Bedeutung mehr. Darüber hinaus generiert das Flag "map_column=True" automatisch eine ColumnProperty, die dem Namen des Synonyms entspricht, d.h.: 'somename':synonym('_somename', map_column=True) ordnet die Spalte namens 'somename' dem Attribut '_somename' zu. Siehe das Beispiel in der Mapper-Dokumentation.
Referenzen: #801
[orm] ¶
Query.select_from() ersetzt jetzt alle vorhandenen FROM-Kriterien durch das angegebene Argument; das frühere Verhalten, eine Liste von FROM-Klauseln zu erstellen, war im Allgemeinen nicht nützlich, da es für filter()-Aufrufe erforderlich war, Join-Kriterien zu erstellen, und in filter() eingeführte neue Tabellen sich bereits selbst zur FROM-Klausel hinzufügen. Das neue Verhalten ermöglicht nicht nur Joins von der Haupttabelle, sondern auch SELECT-Anweisungen. Filterkriterien, ORDER BYs und EAGER LOAD-Klauseln werden gegen die angegebene Anweisung "aliased".
[orm] ¶
Die diesmonatige Refaktorierung der Attributinstrumentierung ändert das "Copy-on-Load"-Verhalten, das wir seit Mitte 0.3 mit "Copy-on-Modify" hatten, in den meisten Fällen. Dies reduziert die Latenz von Ladeoperationen erheblich und erledigt insgesamt weniger Arbeit, da nur Attribute, die tatsächlich geändert werden, ihren "commited state" kopieren. Nur "mutable scalar"-Attribute (d.h. ein gepickeltes Objekt oder ein anderes veränderliches Element) behalten das alte Verhalten, der Grund für die Änderung von Copy-on-Load überhaupt.
[orm] [attrname] ¶
Eine leichte Verhaltensänderung bei Attributen: Das Löschen eines Attributs bewirkt *nicht* mehr, dass der LazyLoader dieses Attributs erneut ausgelöst wird. Das "del" bewirkt, dass der effektive Wert des Attributs "None" ist. Um den "Loader" für ein Attribut erneut auszulösen, verwenden Sie session.expire(instance,).
[orm] ¶
query.filter(SomeClass.somechild == None) generiert beim Vergleich einer Many-to-One-Eigenschaft mit None ordnungsgemäß "id IS NULL", einschließlich der Tatsache, dass NULL auf der rechten Seite steht.
[orm] ¶
query.order_by() berücksichtigt aliased Joins, d.h. query.join('orders', aliased=True).order_by(Order.id).
[orm] ¶
eagerload(), lazyload(), eagerload_all() nehmen ein optionales zweites Klassen- oder Mapperargument entgegen, das den Mapper auswählt, auf den die Option angewendet werden soll. Dies kann unter anderen Mappern auswählen, die mit add_entity() hinzugefügt wurden.
[orm] ¶
Eagerloading funktioniert mit über add_entity() hinzugefügten Mappern.
[orm] ¶
Kaskadierendes Löschen wurde zu "dynamischen" Relationen hinzugefügt, genau wie bei regulären Relationen. Wenn das Flag passive_deletes (ebenfalls neu hinzugefügt) nicht gesetzt ist, löst das Löschen des übergeordneten Elements eine vollständige Ladung der untergeordneten Elemente aus, damit diese entsprechend gelöscht oder aktualisiert werden können.
[orm] ¶
Ebenfalls bei dynamischen Relationen wurde das korrekte Verhalten von count() sowie andere Hilfsmethoden implementiert.
[orm] ¶
Korrektur der Kaskadierung bei polymorphen Relationen, sodass Kaskadierungen von einem Objekt zu einer polymorphen Sammlung weiter entlang der für jedes Element der Sammlung spezifischen Attributen kaskadieren.
[orm] ¶
query.get() und query.load() berücksichtigen keine vorhandenen Filter oder andere Kriterien; diese Methoden suchen *immer* nach der angegebenen ID in der Datenbank oder geben die aktuelle Instanz aus der Identitätskarte zurück, wobei alle vorhandenen Filter-, Join-, Group_by- oder anderen konfigurierten Kriterien ignoriert werden.
Referenzen: #893
[orm] ¶
Unterstützung für version_id_col in Verbindung mit vererbenden Mappern hinzugefügt. version_id_col wird typischerweise auf dem Basis-Mapper in einer Vererbungsbeziehung gesetzt, wo es für alle vererbenden Mapper wirksam ist.
Referenzen: #883
[orm] ¶
Gelockerte Regeln für column_property()-Ausdrücke mit Labels; jede ColumnElement wird jetzt akzeptiert, da der Compiler nicht gekennzeichnete ColumnElements automatisch kennzeichnet. Ein auswählbares Element wie eine select()-Anweisung erfordert immer noch die Konvertierung in ColumnElement über as_scalar() oder label().
[orm] ¶
Backref-Fehler behoben, bei dem Sie instance.attr nicht löschen konnten, wenn attr None war.
[orm] ¶
Mehrere ORM-Attribute wurden entfernt oder privat gemacht: mapper.get_attr_by_column(), mapper.set_attr_by_column(), mapper.pks_by_table, mapper.cascade_callable(), MapperProperty.cascade_callable(), mapper.canload(), mapper.save_obj(), mapper.delete_obj(), mapper._mapper_registry, attributes.AttributeManager.
[orm] ¶
Die Zuweisung eines inkompatiblen Sammlungstyps an ein Relation-Attribut löst jetzt TypeError anstelle von sqlalchemy's ArgumentError aus.
[orm] ¶
Die Massenzuweisung einer MappedCollection löst jetzt einen Fehler aus, wenn ein Schlüssel im eingehenden Wörterbuch nicht mit dem Schlüssel übereinstimmt, den die keyfunc der Sammlung für diesen Wert verwenden würde.
Referenzen: #886
[orm] [newval1] [newval2] ¶
Benutzerdefinierte Sammlungen können jetzt eine @converter-Methode angeben, um Objekte, die in der "Massen"-Zuweisung verwendet werden, in einen Strom von Werten zu übersetzen, wie z. B.:
obj.col = # or obj.dictcol = {'foo': newval1, 'bar': newval2}Die MappedCollection verwendet diesen Hook, um sicherzustellen, dass eingehende Schlüssel/Wert-Paare aus Sicht der Sammlung sinnvoll sind.
[orm] ¶
Fehler einer Endlosschleife behoben, wenn lazy="dynamic" auf beiden Seiten einer bidirektionalen Beziehung verwendet wird.
Referenzen: #872
[orm] ¶
Weitere Korrekturen an der LIMIT/OFFSET-Aliasing, die mit Query + Eagerloads angewendet wurde, in diesem Fall bei Zuordnung zu einer SELECT-Anweisung.
Referenzen: #904
[orm] ¶
Korrektur des selbst-referenziellen Eager-Ladens, sodass, wenn dieselbe zugeordnete Instanz in zwei oder mehr verschiedenen Spaltensätzen desselben Ergebnisdatensatzes vorkommt, ihre eager geladene Sammlung unabhängig davon, ob alle Zeilen einen Satz von "eager" Spalten für diese Sammlung enthalten, gefüllt wird. Dies würde sich auch als KeyError beim Abrufen von Ergebnissen mit aktivierter join_depth zeigen.
[orm] ¶
Fehler behoben, bei dem Query keine Unterabfrage auf die SQL-Anweisung anwendete, wenn LIMIT in Verbindung mit einem vererbenden Mapper verwendet wurde, bei dem der Eager-Loader nur im übergeordneten Mapper vorhanden war.
[orm] ¶
Die Fehlermeldung, die auftritt, wenn Sie versuchen, eine Instanz mit demselben Identitätsschlüssel wie eine bereits in der Sitzung vorhandene Instanz zu aktualisieren(), wurde verdeutlicht.
[orm] ¶
Einige Klarstellungen und Korrekturen zu merge(instance, dont_load=True). Fehler behoben, bei dem Lazy Loader auf zurückgegebenen Instanzen deaktiviert wurden. Außerdem unterstützen wir derzeit nicht das Mergen einer Instanz, die unbestätigte Änderungen aufweist, falls dont_load=True verwendet wird... dies löst jetzt einen Fehler aus. Dies liegt an der Komplexität des Mergens des "commited state" der gegebenen Instanz, um korrekt mit der neu kopierten Instanz sowie anderen geänderten Zuständen übereinzustimmen. Da der Anwendungsfall für dont_load=True Caching ist, sollten die gegebenen Instanzen sowieso keine unbestätigten Änderungen aufweisen. Wir kopieren die Instanzen auch ohne Verwendung von Events, sodass die 'dirty'-Liste in der neuen Sitzung unbeeinflusst bleibt.
[orm] ¶
Fehler behoben, der auftreten konnte, wenn session.begin_nested() in Verbindung mit mehr als einer Verschachtelungsebene von enclosing session.begin()-Anweisungen verwendet wurde.
[orm] ¶
session.refresh() mit einer Instanz, die einen benutzerdefinierten entity_name hat, behoben.
Referenzen: #914
sql¶
[sql] ¶
Generische Funktionen! Wir führen eine Datenbank bekannter SQL-Funktionen ein, wie current_timestamp, coalesce und erstellen explizite Funktionsobjekte, die sie darstellen. Diese Objekte haben eingeschränkte Argumentlisten, sind typaware und können auf dialektspezifische Weise kompiliert werden. Wenn Sie also func.char_length("foo", "bar") sagen, wird ein Fehler ausgelöst (zu viele Argumente), func.coalesce(datetime.date(2007, 10, 5), datetime.date(2005, 10, 15)) weiß, dass sein Rückgabetyp ein Datum ist. Wir haben bisher nur wenige Funktionen repräsentiert, werden das System aber weiter ausbauen.
Referenzen: #615
[sql] ¶
Verbesserte automatische Wiederverbindungsunterstützung; eine Verbindung kann sich jetzt automatisch wieder verbinden, nachdem ihre zugrunde liegende Verbindung ungültig geworden ist, ohne die Verbindung erneut über die Engine herstellen zu müssen. Dies ermöglicht es einer ORM-Sitzung, die an eine einzelne Verbindung gebunden ist, keine Wiederverbindung zu benötigen. Offene Transaktionen auf der Verbindung müssen nach der Ungültigkeit der zugrunde liegenden Verbindung zurückgerollt werden, sonst wird ein Fehler ausgelöst. Auch ein Fehler wurde behoben, bei dem die Trennungserkennung für cursor(), rollback() oder commit() nicht aufgerufen wurde.
[sql] ¶
Neues Flag zu String und create_engine() hinzugefügt, assert_unicode=(True|False|'warn'|None). Standardmäßig False oder None bei create_engine() und String, 'warn' beim Unicode-Typ. Wenn True, führt dies dazu, dass alle Unicode-Konvertierungsoperationen eine Ausnahme auslösen, wenn ein Nicht-Unicode-Bytestring als Bindungsparameter übergeben wird. 'warn' führt zu einer Warnung. Es wird dringend empfohlen, dass alle Unicode-fähigen Anwendungen ordnungsgemäß Python-Unicode-Objekte verwenden (d.h. u'hallo' und nicht 'hallo'), damit Daten korrekt übertragen werden.
[sql] ¶
Die Erzeugung von "einzigartigen" Bindungsparametern wurde vereinfacht, um denselben "eindeutigen Identifikationsmechanismus" wie alles andere zu verwenden. Dies beeinträchtigt den Benutzercode nicht, außer jeglichem Code, der möglicherweise fest gegen die generierten Namen codiert war. Generierte Bindungsparameter haben jetzt das Format ":<paramname>_<num>", während zuvor nur die zweite Bindung desselben Namens diese Form hatte.
[sql] ¶
select().as_scalar() löst eine Ausnahme aus, wenn die Auswahl genau einen Ausdruck in ihrer Spaltenklausel hat.
[sql] ¶
bindparam()-Objekte selbst können als Schlüssel für execute() verwendet werden, d.h. statement.execute({bind1:'foo', bind2:'bar'}).
[sql] ¶
Neue Methoden zu TypeDecorator hinzugefügt, process_bind_param() und process_result_value(), die automatisch von der Verarbeitung des zugrunde liegenden Typs profitieren. Ideal für die Verwendung mit Unicode oder Pickletype. TypeDecorator sollte jetzt der primäre Weg sein, um das Verhalten jedes vorhandenen Typs zu erweitern, einschließlich anderer TypeDecorator-Unterklassen wie PickleType.
[sql] ¶
Selectables (und andere) geben eine Warnung aus, wenn zwei Spalten in ihrer exportierten Spaltensammlung nach Namen kollidieren.
[sql] ¶
Tabellen mit Schemas können weiterhin in SQLite verwendet werden, der Schemaname wird einfach verworfen.
Referenzen: #890
[sql] ¶
Die verschiedenen "Literal"-Generierungsfunktionen wurden geändert, um einen anonymen Bindungsparameter zu verwenden. Hier ändert sich nicht viel, außer dass ihre Labels jetzt ":param_1", ":param_2" anstelle von ":literal" lauten.
[sql] ¶
Spaltenbezeichnungen in der Form "tablename.columname", d.h. mit einem Punkt, werden jetzt unterstützt.
[sql] ¶
Das Keyword-Argument from_obj für select() kann ein Skalar oder eine Liste sein.
misc¶
[dialects] ¶
Der SQLite SLDate-Typ rendert den "Mikrosekunden"-Teil eines Datetime- oder Zeitobjekts nicht mehr fälschlicherweise.
[dialects] ¶
- oracle
Unterstützung für die Erkennung von Trennungen für Oracle hinzugefügt.
Einige Bereinigungen bei binären/rohen Typen, sodass cx_oracle.LOB ad-hoc erkannt wird.
Referenzen: #902
[dialects] ¶
- MSSQL
PyODBC hat kein globales "set nocount on" mehr.
Behebung von nicht-identischen Ganzzahl-PKs bei autoload.
Bessere Unterstützung für convert_unicode.
Weniger strenge Datums-/Zeitkonvertierung für pyodbc/adodbapi.
Schema-qualifizierte Tabellen / autoload.
[backend] [firebird] ¶
Reflektiert Domains (teilweise behoben) und PassiveDefaults korrekt.
Referenzen: #410
[3562] [backend] [firebird] ¶
Zurückgesetzt auf die Verwendung der Standard-Poolklasse (war in 0.4.0 aus Testgründen auf SingletonThreadPool gesetzt).
[backend] [firebird] ¶
Ordnet func.length() 'char_length' zu (leicht überschreibbar mit dem UDF 'strlen' in alten Firebird-Versionen).
0.4.1¶
Veröffentlicht: So, 18. Nov 2007orm¶
[orm] ¶
Eager-Loading mit angewendetem LIMIT/OFFSET fügt nicht mehr die Primärtabelle, die mit einer limitierten Unterabfrage von sich selbst verbunden ist, hinzu; die Eager-Loads verbinden sich jetzt direkt mit der Unterabfrage, die auch die Spalten der Primärtabelle für den Ergebnisdatensatz bereitstellt. Dies eliminiert einen JOIN aus allen Eager-Loads mit LIMIT/OFFSET.
Referenzen: #843
[orm] ¶
session.refresh() und session.expire() unterstützen jetzt ein zusätzliches Argument "attribute_names", eine Liste einzelner Attributschlüsselnamen, die aktualisiert oder abgelaufen sind, was teilweise Neuladungen von Attributen auf einer bereits geladenen Instanz ermöglicht.
Referenzen: #802
[orm] ¶
Der Operator op() wurde zu instrumentierten Attributen hinzugefügt; z. B. User.name.op('ilike')('%somename%').
Referenzen: #767
[orm] ¶
Zugeordnete Klassen können jetzt __eq__, __hash__ und __nonzero__ Methoden mit beliebiger Semantik definieren. Das ORM behandelt jetzt alle zugeordneten Instanzen nur auf Identitätsbasis. (z. B. 'is' vs '==').
Referenzen: #676
[orm] ¶
Der "properties"-Zugriff auf Mapper wurde entfernt; er löst jetzt eine informative Ausnahme aus, die die Verwendung von mapper.get_property() und mapper.iterate_properties erklärt.
[orm] ¶
Die Methode having() wurde zu Query hinzugefügt und wendet HAVING auf die generierte Anweisung an, genauso wie filter() an die WHERE-Klausel anhängt.
[orm] ¶
Das Verhalten von query.options() basiert nun vollständig auf Pfaden, d.h. eine Option wie eagerload_all(‘x.y.z.y.x’) wendet Eagerloading nur auf diese Pfade an, d.h. nicht auf ‘x.y.x’; eagerload(‘children.children’) gilt nur für exakt zwei Ebenen, etc.
Referenzen: #777
[orm] ¶
PickleType vergleicht bei der Initialisierung mit mutable=False mit == und nicht mit dem is-Operator. Um is oder einen anderen Comparator zu verwenden, senden Sie eine benutzerdefinierte Vergleichsfunktion über PickleType(comparator=my_custom_comparator).
[orm] ¶
Query wirft keinen Fehler, wenn Sie distinct() und ein order_by() mit UnaryExpressions (oder anderen) zusammen verwenden.
Referenzen: #848
[orm] ¶
order_by()-Ausdrücke aus verbundenen Tabellen werden beim Verwenden von distinct() ordnungsgemäß zur Spaltenklausel hinzugefügt.
Referenzen: #786
[orm] ¶
Fehler behoben, bei dem Query.add_column() kein klassengebundenes Attribut als Argument akzeptierte; Query löst auch einen Fehler aus, wenn ein ungültiges Argument an add_column() gesendet wurde (zur Zeit von instances()).
Referenzen: #858
[orm] ¶
Mehr Prüfungen für Garbage-Collection-Dereferenzen in InstanceState.__cleanup() hinzugefügt, um „gc ignored“-Fehler beim Herunterfahren der Anwendung zu reduzieren.
[orm] ¶
Die Session-API wurde gefestigt.
[orm] ¶
Es ist ein Fehler, ein Objekt, das bereits persistent ist, mit session.save() zu speichern.
Referenzen: #840
[orm] ¶
Es ist ein Fehler, ein Objekt, das *nicht* persistent ist, mit session.delete() zu löschen.
[orm] ¶
session.update() und session.delete() lösen einen Fehler aus, wenn eine Instanz aktualisiert oder gelöscht wird, die sich bereits mit einer anderen Identität in der Session befindet.
[orm] ¶
Die Session prüft sorgfältiger, wenn sie „Objekt X bereits in einer anderen Session“ bestimmt; z.B. wenn Sie eine Reihe von Objekten pickeln und entpickeln (z.B. wie in einer Pylons HTTP-Session oder ähnlich), können diese in eine neue Session ohne Konflikte übernommen werden.
[orm] ¶
merge() enthält ein Schlüsselwortargument „dont_load=True“. Wenn dieses Flag gesetzt ist, lädt die Merge-Operation keine Daten aus der Datenbank als Reaktion auf eingehende abgetrennte Objekte und akzeptiert das eingehende abgetrennte Objekt so, als wäre es bereits in dieser Session vorhanden. Verwenden Sie dies, um abgetrennte Objekte aus externen Caching-Systemen in die Session zu mergen.
[orm] ¶
Deferred-Spaltenattribute lösen keine Ladeoperation mehr aus, wenn das Attribut zugewiesen wird. In diesen Fällen ist der neu zugewiesene Wert bedingungslos im UPDATE-Statement der Flushes vorhanden.
[orm] ¶
Ein Truncation-Fehler beim erneuten Zuweisen eines Teils einer Sammlung (obj.relation = obj.relation[1:]) wurde behoben.
Referenzen: #834
[orm] ¶
Die Konfiguration des Backref-Codes wurde vereinfacht, Backrefs, die bestehende Eigenschaften überschreiben, lösen nun einen Fehler aus.
Referenzen: #832
[orm] ¶
Verbessertes Verhalten von add_property() etc., behoben in Bezug auf synonym/deferred.
Referenzen: #831
[orm] ¶
Das Verhalten von clear_mappers() wurde korrigiert, um sich besser zu bereinigen.
[orm] ¶
Korrektur des „Row-Switch“-Verhaltens, d.h. wenn ein INSERT/DELETE in ein einziges UPDATE zusammengefasst wird; Many-to-Many-Beziehungen am Elternobjekt werden korrekt aktualisiert.
Referenzen: #841
[orm] ¶
Fehler bei `__hash__` für Association-Proxies behoben – diese Sammlungen sind nicht hashbar, genau wie ihre veränderlichen Python-Gegenstücke.
[orm] ¶
Proxying von `save_or_update`, `__contains__` und `__iter__` Methoden für Scoped-Sessions hinzugefügt.
[orm] ¶
Sehr schwer reproduzierbarer Fehler behoben, bei dem die FROM-Klausel von Query durch bestimmte generative Aufrufe verschmutzt werden konnte.
Referenzen: #852
sql¶
[sql] ¶
Der Schlüsselwortparameter „shortname“ bei bindparam() wurde als veraltet markiert.
[sql] ¶
Enthält-Operator hinzugefügt (generiert eine „LIKE %<other>%“-Klausel).
[sql] ¶
Anonyme Spaltenausdrücke werden automatisch beschriftet. z.B. select([x* 5]) erzeugt „SELECT x * 5 AS anon_1“. Dies ermöglicht die Labelnamen in cursor.description, die dann entsprechend den Verarbeitungsregeln für Ergebnissspalten zugeordnet werden können. (Wir können keine Positionsverfolgung für Ergebnisspalten-Übereinstimmungen zuverlässig verwenden, da text()-Ausdrücke mehrere Spalten darstellen können).
[sql] ¶
Operatorüberladung wird nun von TypeEngine-Objekten gesteuert – der bisher einzige integrierte Operatorüberladung ist, dass String-Typen „+“ als String-Konkatenationsoperator überladen. Benutzerdefinierte Typen können ihre eigenen Operatorüberladungen definieren, indem sie die Methode adapt_operator(self, op) überschreiben.
[sql] ¶
Untypisierte Bindungsparameter auf der rechten Seite eines binären Ausdrucks erhalten den Typ der linken Seite der Operation, um die entsprechende Bindungsparameterverarbeitung besser zu ermöglichen.
Referenzen: #819
[sql] ¶
Regulärer Ausdrucksschritt aus den meisten Statement-Kompilierungen entfernt. Behebt auch
Referenzen: #833
[sql] ¶
Fehlerhafte leere (null-spaltige) SQLite-Inserts behoben, die Inserts auf Tabellen mit nur einer autoincrementierenden Spalte zulassen.
[sql] ¶
Korrektur der Ausdrucksübersetzung von `text()`-Klauseln; dies behebt verschiedene ORM-Szenarien, bei denen literaler Text für SQL-Ausdrücke verwendet wird.
[sql] ¶
ClauseParameters-Objekt entfernt; compiled.params gibt nun ein reguläres Dictionary zurück, ebenso wie result.last_inserted_params() / last_updated_params().
[sql] ¶
INSERT-Anweisungen in Bezug auf Primärschlüsselspalten mit SQL-Ausdruck-basierten Standardgeneratoren korrigiert; SQL-Ausdruck wird wie gewohnt inline ausgeführt, löst aber keine „postfetch“-Bedingung für die Spalte aus, für jene DBs, die dies über cursor.lastrowid bereitstellen.
[sql] ¶
func.-Objekte können ge-pickelt/ent-pickelt werden.
Referenzen: #844
[sql] ¶
Das System zur „Ziel“-Spalten über wählbare Ausdrücke wurde umgeschrieben und vereinfacht. Auf der SQL-Seite wird dies durch die Methode „corresponding_column()“ repräsentiert. Diese Methode wird stark vom ORM verwendet, um Elemente eines Ausdrucks an ähnliche, aliasierte Ausdrücke „anzupassen“ und um Ergebnisspalten, die ursprünglich an eine Tabelle oder ein wählbares Element gebunden waren, an einen aliasierten, „entsprechenden“ Ausdruck zu binden. Die neue Überarbeitung bietet ein vollständig konsistentes und genaues Verhalten.
[sql] ¶
Feld („info“) zum Speichern beliebiger Daten auf Schema-Elementen hinzugefügt.
Referenzen: #573
[sql] ¶
Die Sammlung „properties“ auf Connections wurde in „info“ umbenannt, um den schreibbaren Sammlungen des Schemas zu entsprechen. Der Zugriff ist bis 0.5 weiterhin über den Namen „properties“ möglich.
[sql] ¶
Die close()-Methode bei Transaktionen mit strategy='threadlocal' wurde korrigiert.
[sql] ¶
Korrektur der kompilierten Bindungsparameter, um None nicht fälschlicherweise zu befüllen.
Referenzen: #853
[sql] ¶
<Engine|Connection>._execute_clauseelement wird zu einer öffentlichen Methode Connectable.execute_clauseelement.
misc¶
[dialects] ¶
Experimentelle Unterstützung für MaxDB (nur Versionen >= 7.6.03.007) hinzugefügt.
[dialects] ¶
Oracle wird nun „DATE“ als OracleDateTime-Spalte und nicht als OracleDate widerspiegeln.
[dialects] ¶
Bewusstsein für Schemanamen in der Oracle-Funktion `table_names()` hinzugefügt, behebt `metadata.reflect(schema='someschema')`.
Referenzen: #847
[dialects] ¶
Anonyme Bezeichnungen für Funktionsauswahlen in MSSQL wurden deterministisch gemacht.
[dialects] ¶
SQLite wird „DECIMAL“ als numerische Spalte widerspiegeln.
[dialects] ¶
Die Erkennung von Zugriffs-DAOs wurde zuverlässiger gemacht.
Referenzen: #828
[dialects] ¶
Das Dialektattribut `preexecute_sequences` wurde in `preexecute_pk_sequences` umbenannt. Für Out-of-Tree-Dialekte, die den alten Namen verwenden, gibt es einen Attribut-Proxy.
[dialects] ¶
Testabdeckung für die Reflexion unbekannter Typen hinzugefügt. SQLite/MySQL-Handling der Typenreflexion für unbekannte Typen korrigiert.
[dialects] ¶
REAL für den MySQL-Dialekt hinzugefügt (für Benutzer, die den REAL_AS_FLOAT SQL-Modus nutzen).
[dialects] ¶
MySQL Float, MSFloat und MSDouble, die ohne Argumente konstruiert werden, erzeugen nun DDL ohne Argumente, z.B. 'FLOAT'.
[misc] ¶
Unbenutzte Funktion `util.hash()` entfernt.
0.4.0¶
Veröffentlicht: Mi, 17. Okt 2007[no_tags] ¶
(siehe 0.4.0beta1 für den Beginn wichtiger Änderungen gegenüber 0.3, sowie https://sqlalchemy.de/trac/wiki/WhatsNewIn04 )
[no_tags] ¶
Erste Sybase-Unterstützung hinzugefügt (bisher mxODBC).
Referenzen: #785
[no_tags] ¶
Partielle Indexunterstützung für PostgreSQL hinzugefügt. Verwenden Sie das Schlüsselwort `postgres_where` auf dem Index.
[no_tags] ¶
String-basierter Query-Parameter-Parser / Konfigurationsdatei-Parser versteht breitere String-Werte für Booleans.
Referenzen: #817
[no_tags] ¶
Die Operation `backref.remove(obj)` schlägt nicht fehl, wenn die Sammlung auf der anderen Seite das Element nicht enthält; unterstützt noload-Sammlungen.
Referenzen: #813
[no_tags] ¶
`__len__` aus „dynamischen“ Sammlungen entfernt, da dies die Ausgabe einer SQL „count()“-Operation erfordern würde und somit alle Listenbewertungen zu redundanter SQL zwingen.
Referenzen: #818
[no_tags] ¶
Inline-Optimierungen bei `locate_dirty()` hinzugefügt, die `flush()` wiederholte Aufrufe erheblich beschleunigen können, wie es bei `autoflush=True` der Fall ist.
Referenzen: #816
[no_tags] ¶
Der Test `_requires_quotes` des `IdentifierPreprarer` ist nun Regex-basiert. Alle Out-of-Tree-Dialekte, die benutzerdefinierte Sätze von `legal_characters` oder `illegal_initial_characters` bereitstellen, müssen zu Regexes wechseln oder `_requires_quotes` überschreiben.
[no_tags] ¶
Firebird hat `supports_sane_rowcount` und `supports_sane_multi_rowcount` auf `False` gesetzt aufgrund von Ticket #370 (der richtige Weg).
[no_tags] ¶
- Verbesserungen und Korrekturen bei der Firebird-Reflexion.
FBDialect imitiert nun OracleDialect in Bezug auf die Groß-/Kleinschreibung von TABELLEN- und SPALTENNennungen (siehe Thema „case_sensitive remotion“ in dieser Datei).
FBDialect.table_names() bringt keine Systemtabellen (Ticket:796).
FB spiegelt nun die `nullable`-Eigenschaft der Spalte korrekt wider.
[no_tags] ¶
Korrektur der Kenntnis des SQL-Kompilierers von Top-Level-Spaltenbezeichnungen, wie sie in der Ergebnismenge verwendet werden; verschachtelte Auswahlen, die dieselben Spaltennamen enthalten, beeinträchtigen das Ergebnis nicht und stehen nicht im Konflikt mit Metadaten von Ergebnissspalten.
[no_tags] ¶
query.get() und verwandte Funktionen (wie Many-to-One Lazyloading) verwenden zur Kompilierungszeit aliasierte Bindungsparameternamen, um Namenskonflikte mit bereits im zugeordneten Wählbaren vorhandenen Bindungsparametern zu vermeiden.
[no_tags] ¶
Korrektur von drei- und mehrstufigem Select- und Deferred-Vererbungsladen (d.h. abc-Vererbung ohne select_table).
Referenzen: #795
[no_tags] ¶
Ident, das an id_chooser in shard.py übergeben wird, ist immer eine Liste.
[no_tags] ¶
Das Argument-lose `ResultProxy._row_processor()` ist nun das Klassenattribut `_process_row`.
[no_tags] ¶
Unterstützung für die Rückgabe von Werten aus Inserts und Updates für PostgreSQL 8.2+ hinzugefügt.
Referenzen: #797
[no_tags] ¶
PG-Reflexion: Wenn der Standard-Schemaname explizit als „schema“-Argument in einer Tabelle verwendet wird, geht sie davon aus, dass dies die gewünschte Konvention des Benutzers ist, und setzt explizit das „schema“-Argument in fremdschlüsselbezogenen reflektierten Tabellen. Dadurch passen diese nur zu Konstruktoren von Tabellen, die ebenfalls das explizite „schema“-Argument verwenden (auch wenn es das Standard-Schema ist). Mit anderen Worten: SA geht davon aus, dass der Benutzer in dieser Verwendung konsistent ist.
[no_tags] ¶
Reflexion von BOOL/BOOLEAN unter SQLite korrigiert.
Referenzen: #808
[no_tags] ¶
Unterstützung für UPDATE mit LIMIT bei MySQL hinzugefügt.
[no_tags] ¶
Ein null-Fremdschlüssel bei einem m2o löst kein Lazyload aus.
Referenzen: #803
[no_tags] ¶
Oracle konvertiert nicht mehr implizit in Unicode für nicht-typisierte Ergebnismengen (d.h. wenn keine TypeEngine/String/Unicode-Typ verwendet wird; zuvor wurden DBAPI-Typen erkannt und unabhängig davon konvertiert). Dies sollte das Problem beheben.
Referenzen: #800
[no_tags] ¶
Korrektur der Generierung anonymer Bezeichnungen für lange Tabellen-/Spaltennamen.
Referenzen: #806
[no_tags] ¶
Der Firebird-Dialekt verwendet nun `SingletonThreadPool` als `poolclass`.
[no_tags] ¶
Firebird verwendet nun `dialect.preparer`, um Sequenznamen zu formatieren.
[no_tags] ¶
Fehlerbehebung bei PostgreSQL und mehreren Zwei-Phasen-Transaktionen. Zwei-Phasen-Commits und Rollbacks führten nicht mehr automatisch zu einer neuen Transaktion, wie es bei üblichen DBAPI-Commits/Rollbacks der Fall ist.
Referenzen: #810
[no_tags] ¶
Eine Option wurde zum `_ScopedExt`-Mapper-Erweiterung hinzugefügt, um neue Objekte bei der Objektinitialisierung nicht automatisch in der Session zu speichern.
[no_tags] ¶
Oracle-Syntax für Nicht-ANSI-Joins korrigiert.
[no_tags] ¶
PickleType und Interval-Typen (auf DBs, die sie nicht nativ unterstützen) sind nun etwas schneller.
[no_tags] ¶
Float- und Time-Typen für Firebird (FBFloat und FBTime) hinzugefügt. BLOB SUB_TYPE für TEXT- und Binärtypen korrigiert.
[no_tags] ¶
Die API für den `in_`-Operator wurde geändert. `in_()` akzeptiert nun ein einzelnes Argument, das eine Sequenz von Werten oder ein Wählbares ist. Die alte API, bei der Werte als Varargs übergeben wurden, funktioniert weiterhin, ist aber veraltet.
0.4.0beta6¶
Veröffentlicht: Do, 27. Sep 2007[no_tags] ¶
Die Identitätsmap der Session referenziert nun standardmäßig *schwach*, verwenden Sie `weak_identity_map=False`, um ein reguläres Dictionary zu verwenden. Das von uns verwendete schwache Dictionary ist angepasst, um Instanzen zu erkennen, die „dirty“ sind, und eine temporäre starke Referenz auf diese Instanzen zu halten, bis die Änderungen gespült werden.
[no_tags] ¶
Die Mapper-Kompilierung wurde neu organisiert, sodass die meiste Kompilierung bei der Mapper-Konstruktion erfolgt. Dies ermöglicht uns, weniger Aufrufe von `mapper.compile()` zu haben und auch klassenbasierte Eigenschaften eine Kompilierung zu erzwingen (z.B. `User.addresses == 7` kompiliert alle Mapper; dies ist). Das einzige Vorbehalt ist hier, dass ein vererbender Mapper seinen vererbenden Mapper bei der Konstruktion sucht; Mapper innerhalb von Vererbungsbeziehungen müssen also in Vererbungsreihenfolge konstruiert werden (was sowieso der Normalfall sein sollte).
Referenzen: #758
[no_tags] ¶
„FETCH“ wurde zu den von Postgres erkannten Schlüsselwörtern hinzugefügt, um eine Ergebniszeilen haltende Anweisung anzuzeigen (d.h. zusätzlich zu „SELECT“).
[no_tags] ¶
Vollständige Liste der SQLite-Reserveschlüsselwörter hinzugefügt, damit diese korrekt maskiert werden.
[no_tags] ¶
Die Beziehung zwischen der Generierung von „eager load“-Aliassen durch die Query und `Query.instances()`, das tatsächlich die eilig geladenen Zeilen abruft, wurde verschärft. Wenn die Aliase nicht speziell für diese Anweisung von `EagerLoader` generiert wurden, greift der `EagerLoader` nicht, wenn die Zeilen abgerufen werden. Dies verhindert, dass Spalten versehentlich als Teil eines Eager-Loads gegriffen werden, obwohl sie nicht dafür bestimmt waren, was mit Text-SQL sowie einigen Vererbungssituationen passieren kann. Es ist besonders wichtig, da die „anonyme Aliasierung“ von Spalten nun einfache Integer-Zählungen zur Generierung von Bezeichnungen verwendet.
[no_tags] ¶
Das Argument „parameters“ von `clauseelement.compile()` wurde entfernt und durch „column_keys“ ersetzt. Die an `execute()` gesendeten Parameter interagieren mit der Kompilierung von Insert-/Update-Anweisungen nur in Bezug auf die vorhandenen Spaltennamen, nicht jedoch auf die Werte für diese Spalten. Dies führt zu konsistenterem `execute`/`executemany`-Verhalten und vereinfacht die interne Handhabung.
[no_tags] ¶
Das Schlüsselwortargument ‚comparator‘ wurde zu `PickleType` hinzugefügt. Standardmäßig führt „mutable“ `PickleType` einen „Deep-Compare“ von Objekten anhand ihrer `dumps()`-Darstellung durch. Dies funktioniert jedoch nicht für Dictionaries. Gepickelte Objekte, die eine angemessene `__eq__()`-Implementierung bereitstellen, können mit „PickleType(comparator=operator.eq)“ eingerichtet werden.
Referenzen: #560
[no_tags] ¶
Die Methode `session.is_modified(obj)` wurde hinzugefügt; sie führt den gleichen „History“-Vergleich durch, der auch bei einem Flush-Vorgang stattfindet; das Setzen von `include_collections=False` ergibt das gleiche Ergebnis, das beim Flush verwendet wird, um zu bestimmen, ob ein UPDATE für die Zeile der Instanz ausgegeben werden soll.
[no_tags] ¶
Das Argument „schema“ wurde zu `Sequence` hinzugefügt; verwenden Sie dies mit PostgreSQL/Oracle, wenn die Sequenz in einem alternativen Schema liegt. Implementiert einen Teil von, sollte beheben.
[no_tags] ¶
Reflexion des leeren Strings für MySQL-Enums korrigiert.
[no_tags] ¶
Der MySQL-Dialekt wurde geändert, um die ältere Syntax `LIMIT
, ` anstelle von `LIMIT OFFSET ` zu verwenden, für Benutzer von 3.23. Referenzen: #794
[no_tags] ¶
Das Flag `passive_deletes="all"` wurde zu `relation()` hinzugefügt; dies deaktiviert das Nullsetzen aller Fremdschlüsselattribute während eines Flushes, bei dem das übergeordnete Objekt gelöscht wird.
[no_tags] ¶
Spalten-Standardwerte und `onupdates`, die inline ausgeführt werden, fügen Klammern für Subqueries und andere klammerbedürftige Ausdrücke hinzu.
[no_tags] ¶
Das Verhalten von String/Unicode-Typen, die bei fehlender Länge automatisch in TEXT/CLOB konvertiert werden, tritt nun *nur* für einen exakten Typ von String oder Unicode ohne Argumente auf. Wenn Sie VARCHAR oder NCHAR (Unterklassen von String/Unicode) ohne Länge verwenden, werden diese vom Dialekt als VARCHAR/NCHAR interpretiert; hier findet keine „magische“ Konvertierung statt. Dies ist ein weniger überraschendes Verhalten und hilft insbesondere Oracle dabei, stringbasierte Bindungsparameter als VARCHARs und nicht als CLOBs zu behalten.
Referenzen: #793
[no_tags] ¶
Korrekturen an ShardedSession, um mit Deferred-Spalten zu funktionieren.
Referenzen: #771
[no_tags] ¶
Die benutzerdefinierte Funktion `shard_chooser()` muss das Argument `clause=None` akzeptieren; dies ist das `ClauseElement`, das an `session.execute(statement)` übergeben wird und zur Bestimmung der korrekten Shard-ID verwendet werden kann (da `execute()` keine Instanz entgegennimmt).
[no_tags] ¶
Der Operator-Rang von NOT wurde angepasst, um mit „==“ und anderen vergleichbar zu sein, sodass `~(x <operator> y)` NOT (x <op> y) erzeugt, was mit älteren MySQL-Versionen besser kompatibel ist. Dies gilt nicht für „~(x==y)“, da es wie in 0.3 zu „x != y“ kompiliert, gilt aber weiterhin für Operatoren wie BETWEEN.
Referenzen: #764
[no_tags] ¶
Weitere Tickets:,,.
0.4.0beta5¶
kein Veröffentlichungsdatum[no_tags] ¶
Korrekturen an Connection Pools; die bessere Leistung von beta4 bleibt erhalten, aber Fehler wie „connection overflow“ und andere, die vorhanden waren, wurden behoben (z.B.).
Referenzen: #754
[no_tags] ¶
Fehler bei der Bestimmung der korrekten Sync-Klauseln aus benutzerdefinierten Vererbungsbedingungen behoben.
Referenzen: #769
[no_tags] ¶
Die `engine_from_config`-Koerzierung für die QueuePool-Größe/Überlauf wurde erweitert.
Referenzen: #763
[no_tags] ¶
MySQL-Views können wieder reflektiert werden.
Referenzen: #748
[no_tags] ¶
AssociationProxy kann nun benutzerdefinierte Getter und Setter annehmen.
[no_tags] ¶
Behobenes fehlerhaftes BETWEEN in ORM-Abfragen.
[no_tags] ¶
OrderedProperties-Pickling behoben
Referenzen: #762
[no_tags] ¶
SQL-Ausdrucks-Defaults und Sequenzen werden nun für alle Nicht-Primärschlüsselspalten während eines INSERT oder UPDATE und für alle Spalten während eines executemany()-Aufrufs „inline“ ausgeführt. Das inline=True-Flag bei jeder INSERT- oder UPDATE-Anweisung erzwingt ebenfalls dasselbe Verhalten mit einem einzigen execute(). result.postfetch_cols() ist eine Sammlung von Spalten, für die die vorherige einzelne INSERT- oder UPDATE-Anweisung einen SQL-seitigen Standardausdruck enthielt.
[no_tags] ¶
PG executemany()-Verhalten behoben
Referenzen: #759
[no_tags] ¶
Postgres spiegelt Tabellen mit autoincrement=False für Primärschlüsselspalten, die keine Defaults haben.
[no_tags] ¶
Postgres umschließt executemany() nicht mehr mit einzelnen execute()-Aufrufen, sondern bevorzugt die Leistung. „rowcount“/„concurrency“-Prüfungen bei gelöschten Elementen (die executemany verwenden) sind bei PG deaktiviert, da psycopg2 keinen korrekten rowcount für executemany() meldet.
[fixed] [tickets] ¶
Referenzen: #742
[fixed] [tickets] ¶
Referenzen: #748
[fixed] [tickets] ¶
Referenzen: #760
[fixed] [tickets] ¶
Referenzen: #762
[fixed] [tickets] ¶
Referenzen: #763
0.4.0beta4¶
Veröffentlicht: Mi, 22. Aug. 2007[no_tags] ¶
Aufgeräumt, was in Ihrem Namespace landet, wenn Sie „from sqlalchemy import *“.
[no_tags] ¶
„table“ und „column“ werden nicht mehr importiert. Sie bleiben über direkte Referenz (wie in ‚sql.table‘ und ‚sql.column‘) oder einen Glob-Import aus dem sql-Paket verfügbar. Es war zu einfach, versehentlich eine sql.expressions.table anstelle von schema.Table zu verwenden, wenn man gerade erst mit SQLAlchemy begann, ebenso column.
[no_tags] ¶
Interne Klassen wie ClauseElement, FromClause, NullTypeEngine usw. werden ebenfalls nicht mehr in Ihren Namespace importiert.
[no_tags] ¶
Der Kompatibilitätsname „Smallinteger“ (kleines i!) wird nicht mehr importiert, bleibt aber vorerst in schema.py. SmallInteger (großes I!) wird weiterhin importiert.
[no_tags] ¶
Der Verbindungspool verwendet intern eine „threadlocal“-Strategie, um dieselbe Verbindung, die bereits an einen Thread gebunden ist, für „kontextuelle“ Verbindungen zurückzugeben; dies sind die Verbindungen, die verwendet werden, wenn Sie eine „verbindunglose“ Ausführung wie insert().execute() durchführen. Dies ist wie eine „teilweise“ Version der „threadlocal“-Engine-Strategie, aber ohne den thread-lokalen Transaktionsanteil davon. Wir hoffen, dass dies den Overhead des Verbindungspools sowie die Datenbanknutzung reduziert. Sollte es sich jedoch negativ auf die Stabilität auswirken, werden wir es sofort zurücknehmen.
[no_tags] ¶
Korrektur bei der Verarbeitung von Bindungsparametern, sodass „False“-Werte (wie leere Strings) weiterhin verarbeitet/kodiert werden.
[no_tags] ¶
Korrektur des „generativen“ Verhaltens von select(), sodass das Aufrufen von column(), select_from(), correlate() und with_prefix() das ursprüngliche select-Objekt nicht verändert.
Referenzen: #752
[no_tags] ¶
Ein „Legacy“-Adapter für Typen hinzugefügt, sodass benutzerdefinierte TypeEngine- und TypeDecorator-Klassen, die convert_bind_param() und/oder convert_result_value() definieren, weiterhin funktionieren. Unterstützt auch das Aufrufen der Super()-Version dieser Methoden.
[no_tags] ¶
session.prune() hinzugefügt, das im Cache einer Session gespeicherte Instanzen, die nicht mehr referenziert werden, entfernt. (Ein Dienstprogramm für starke Referenzidentitätszuordnungen).
[no_tags] ¶
close()-Methode zu Transaction hinzugefügt. Schließt eine Transaktion mit Rollback ab, wenn es sich um die äußerste Transaktion handelt, ansonsten wird sie einfach beendet, ohne die äußere Transaktion zu beeinträchtigen.
[no_tags] ¶
Transaktionale und nicht-transaktionale Session integrieren sich besser mit gebundenen Verbindungen; ein close() stellt sicher, dass der transaktionale Zustand der Verbindung derselbe ist, der auf ihr bestand, bevor sie an die Session gebunden wurde.
[no_tags] ¶
SQL-Operatorfunktionen wurden zu Modul-Level-Operatoren geändert, wodurch SQL-Ausdrücke pickelbar werden.
Referenzen: #735
[no_tags] ¶
Kleine Anpassung an mapper class.__init__, um das Verhalten von Py2.6 object.__init__() zu ermöglichen.
[no_tags] ¶
Das Argument ‚prefix‘ für select() behoben.
[no_tags] ¶
Connection.begin() akzeptiert kein nested=True mehr, diese Logik liegt nun komplett in begin_nested().
[no_tags] ¶
Korrekturen am neuen „dynamischen“ relation loader, der Kaskaden betrifft.
[fixed] [tickets] ¶
Referenzen: #735
[fixed] [tickets] ¶
Referenzen: #752
0.4.0beta3¶
Veröffentlicht: Do, 16. Aug. 2007[no_tags] ¶
Optimierung von SQL-Typen
[no_tags] ¶
Neue Performance-Tests zeigen, dass ein kombinierter Massen-INSERT/Massen-SELECT-Test 68 % weniger Funktionsaufrufe aufweist als derselbe Test auf 0.3.
[no_tags] ¶
Allgemeine Leistungssteigerung der Ergebnisiteration beträgt etwa 10-20 %.
[no_tags] ¶
In types.AbstractType sind convert_bind_param() und convert_result_value() zu bind_processor()- und result_processor()-Methoden migriert, die Callables zurückgeben. Wenn kein Callable zurückgegeben wird, wird keine Vor-/Nachverarbeitungsfunktion aufgerufen.
[no_tags] ¶
Hooks wurden in base/sql/defaults integriert, um das Aufrufen von Bindungsparameter-/Ergebnisprozessoren zu optimieren, sodass der Overhead von Methodenaufrufen minimiert wird.
[no_tags] ¶
Unterstützung für executemany()-Szenarien hinzugefügt, sodass unnötige Logik für die „letzte Zeilen-ID“ nicht ausgelöst wird und Parameter nicht übermäßig durchlaufen werden.
[no_tags] ¶
‚inherit_foreign_keys‘-Argument zu mapper() hinzugefügt.
[no_tags] ¶
Unterstützung für String-Datum-Passthrough in SQLite hinzugefügt.
[fixed] [tickets] ¶
Referenzen: #738
[fixed] [tickets] ¶
Referenzen: #739
[fixed] [tickets] ¶
Referenzen: #743
[fixed] [tickets] ¶
Referenzen: #744
0.4.0beta2¶
Veröffentlicht: Di, 14. Aug. 2007oracle¶
[oracle] [improvements.] ¶
Auto-Commit nach LOAD DATA INFILE für MySQL.
[oracle] [improvements.] ¶
Eine rudimentäre SessionExtension-Klasse wurde hinzugefügt, die benutzerdefinierte Funktionalität an den Grenzen von flush(), commit() und rollback() ermöglicht.
[oracle] [improvements.] ¶
engine_from_config()-Funktion wurde hinzugefügt, um die Erstellung von create_engine() aus einer .ini-Konfiguration zu erleichtern.
[oracle] [improvements.] ¶
base_mapper() wird zu einem einfachen Attribut.
[oracle] [improvements.] ¶
session.execute() und scalar() können nach einer Tabelle suchen, an die gebunden werden soll, basierend auf dem gegebenen ClauseElement.
[oracle] [improvements.] ¶
Session extrapolatiert automatisch Tabellen aus Mappern mit Bindungen und verwendet auch base_mapper, damit Vererbungshierarchien automatisch gebunden werden.
[oracle] [improvements.] ¶
Die ClauseVisitor-Traversierung wurde zurück zu inline und nicht-rekursiv verschoben.
misc¶
0.4.0beta1¶
Veröffentlicht: So, 12. Aug. 2007orm¶
[orm] ¶
Geschwindigkeit! Zusammen mit den jüngsten Geschwindigkeitssteigerungen von ResultProxy wurde die Gesamtzahl der Funktionsaufrufe für große Ladevorgänge erheblich reduziert.
[orm] ¶
test/perf/masseagerload.py meldet, dass 0.4 die geringste Anzahl von Funktionsaufrufen aller SA-Versionen (0.1, 0.2 und 0.3) aufweist.
[orm] ¶
Neue collection_class-API und Implementierung. Sammlungen werden nun über Dekorationen anstelle von Proxying instrumentiert. Sie können nun Sammlungen haben, die ihre eigene Mitgliedschaft verwalten, und Ihre Klasseninstanz wird direkt auf der Relationseigenschaft angezeigt. Die Änderungen sind für die meisten Benutzer transparent.
Referenzen: #213
[orm] ¶
InstrumentedList (wie sie war) wurde entfernt, und Relationseigenschaften haben keine ‚clear()‘, ‚.data‘ oder andere hinzugefügte Methoden mehr, abgesehen von denen, die vom Sammlungs-Typ bereitgestellt werden. Sie können diese natürlich selbst zu einer benutzerdefinierten Klasse hinzufügen.
[orm] ¶
Zuweisungen vom Typ __setitem__ lösen nun Entfernungsereignisse für den bestehenden Wert aus, falls vorhanden.
[orm] ¶
Als Sammlungs-Typen verwendete Dictionaries müssen die __iter__-Semantik nicht mehr ändern; itervalues() wird stattdessen standardmäßig verwendet. Dies ist eine rückwärts inkompatible Änderung.
[orm] ¶
Das Unterklassen von dict für eine zugeordnete Sammlung ist in den meisten Fällen nicht mehr erforderlich. orm.collections bietet fertige Implementierungen, die Objekte nach einer angegebenen Spalte oder einer benutzerdefinierten Funktion Ihrer Wahl schlüsseln.
[orm] ¶
Die Sammlungszuweisung erfordert nun einen kompatiblen Typ; das Zuweisen von None zum Leeren einer Sammlung oder das Zuweisen einer Liste an eine Dictionary-Sammlung führt nun zu einem Argumentfehler.
[orm] ¶
AttributeExtension wurde in interfaces verschoben und .delete heißt jetzt .remove. Die Signatur der Ereignismethode wurde ebenfalls vertauscht.
[orm] ¶
Umfangreiche Überarbeitung von Query.
[orm] ¶
Alle selectXXX-Methoden sind veraltet. Generative Methoden sind nun der Standardweg für Dinge, d.h. filter(), filter_by(), all(), one() usw. Veraltete Methoden sind mit ihren neuen Ersetzungen in der Dokumentation versehen.
[orm] ¶
Klassen-Level-Eigenschaften können nun als Query-Elemente verwendet werden... kein ‚.c.‘ mehr! „Class.c.propname“ wird nun durch „Class.propname“ ersetzt. Alle Klauseloperatoren werden unterstützt, ebenso wie übergeordnete Operatoren wie Class.prop==<eine Instanz> für Skalarattribute, Class.prop.contains(<eine Instanz>) und Class.prop.any(<ein Ausdruck>) für sammlungsbasierte Attribute (alle sind auch negierbar). Tabellenbasierte Spaltenausdrücke sowie Spalten, die über ‚c‘ an zugeordnete Klassen angehängt sind, sind natürlich weiterhin vollständig verfügbar und können frei mit den neuen Attributen vermischt werden.
Referenzen: #643
[orm] ¶
Alte query.select_by_attributename()-Funktionalität entfernt.
[orm] ¶
Die Alias-Logik, die für das Eager Loading verwendet wird, wurde verallgemeinert, sodass sie auch die vollständige automatische Alias-Unterstützung für Query hinzufügt. Es ist nicht mehr notwendig, einen expliziten Alias zu erstellen, um sich mehrmals mit denselben Tabellen zu verbinden; *auch für selbstreferenzierende Beziehungen*.
join() und outerjoin() akzeptieren das Argument „aliased=True“. Dies bewirkt, dass ihre Joins auf Aliastabellen aufgebaut werden; nachfolgende Aufrufe von filter() und filter_by() übersetzen alle Tabellenausdrücke (ja, echte Ausdrücke, die die ursprüngliche zugeordnete Tabelle verwenden) für die Dauer dieses Joins (d.h. bis reset_joinpoint() oder ein anderer join() aufgerufen wird) in den der Alias-Tabelle.
join() und outerjoin() akzeptieren das Argument „id=<irgendein String>“. Wenn „aliased=True“ verwendet wird, kann die ID über add_entity(cls, id=<irgendein String>) referenziert werden, damit Sie die verknüpften Instanzen auswählen können, auch wenn sie von einem Alias stammen.
join() und outerjoin() funktionieren jetzt auch mit selbstreferenzierenden Beziehungen! Mit „aliased=True“ können Sie beliebig viele Ebenen tief verbinden, z.B. query.join([‚children‘, ‚children‘], aliased=True); die Filterkriterien werden gegen die rechteste verknüpfte Tabelle angewendet.
[orm] ¶
query.populate_existing() hinzugefügt, kennzeichnet die Abfrage so, dass alle Attribute und Sammlungen aller Instanzen, die von der Abfrage berührt werden, neu geladen werden, einschließlich der eager-geladenen Entitäten.
Referenzen: #660
[orm] ¶
eagerload_all() hinzugefügt, ermöglicht eagerload_all(‚x.y.z‘), um das Eager Loading aller Eigenschaften im angegebenen Pfad zu spezifizieren.
[orm] ¶
Umfangreiche Überarbeitung von Session.
[orm] ¶
Neue Funktion, die eine Session „konfiguriert“, genannt „sessionmaker()“. Senden Sie verschiedene Schlüsselwortargumente einmal an diese Funktion, sie gibt eine neue Klasse zurück, die eine Session mit diesem Stereotyp erstellt.
[orm] ¶
SessionTransaction wurde aus der „öffentlichen“ API entfernt. Sie können nun begin()/commit()/rollback() auf der Session selbst aufrufen.
[orm] ¶
Session unterstützt auch SAVEPOINT-Transaktionen; rufen Sie begin_nested() auf.
[orm] ¶
Session unterstützt Zwei-Phasen-Commit-Verhalten bei vertikaler oder horizontaler Partitionierung (d.h. Verwendung von mehr als einer Engine). Verwenden Sie twophase=True.
[orm] ¶
Das Session-Flag „transactional=True“ erzeugt eine Session, die sich bei der ersten Verwendung immer in einer Transaktion befindet. Nach commit(), rollback() oder close() endet die Transaktion; sie beginnt jedoch bei der nächsten Verwendung neu.
[orm] ¶
Session unterstützt „autoflush=True“. Dies führt einen flush() vor jeder Abfrage aus. Verwenden Sie dies in Verbindung mit transactional, und Sie können einfach speichern/aktualisieren() und dann abfragen, die neuen Objekte werden vorhanden sein. Verwenden Sie commit() am Ende (oder flush(), wenn nicht-transaktional), um verbleibende Änderungen zu committen.
[orm] ¶
Die neue Funktion scoped_session() ersetzt SessionContext und assignmapper. Baut auf dem Konzept von „sessionmaker()“ auf, um eine Klasse zu erstellen, deren Session()-Konstruktion die thread-lokale Session zurückgibt. Oder rufen Sie alle Session-Methoden als Klassenmethoden auf, z.B. Session.save(foo); Session.commit(). genau wie in den alten „objectstore“-Zeiten.
[orm] ¶
Neues Argument „binds“ zu Session hinzugefügt, um die Konfiguration mehrerer Bindungen mit der sessionmaker()-Funktion zu unterstützen.
[orm] ¶
Eine rudimentäre SessionExtension-Klasse wurde hinzugefügt, die benutzerdefinierte Funktionalität an den Grenzen von flush(), commit() und rollback() ermöglicht.
[orm] ¶
Query-basierte relation()s verfügbar mit dynamic_loader(). Dies ist eine *beschreibbare* Sammlung (unterstützt append() und remove()), die auch ein Live-Query-Objekt ist, wenn sie für Lesevorgänge aufgerufen wird. Ideal für den Umgang mit sehr großen Sammlungen, bei denen nur eine teilweise Ladung erwünscht ist.
[orm] ¶
INSERT/UPDATE-Ausdrücke, die in flush() eingebettet sind. Weisen Sie einem Instanzattribut einen beliebigen SQL-Ausdruck zu, z.B. „sometable.c.column + 1“. Beim Flush erkennt der Mapper den Ausdruck und bettet ihn direkt in die INSERT- oder UPDATE-Anweisung ein; das Attribut wird auf der Instanz verzögert, sodass es beim nächsten Zugriff den neuen Wert lädt.
[orm] ¶
Ein rudimentäres Sharding-System (horizontale Skalierung) wird eingeführt. Dieses System verwendet eine modifizierte Session, die Lese- und Schreibvorgänge auf mehrere Datenbanken verteilen kann, basierend auf benutzerdefinierten Funktionen, die die „Sharding-Strategie“ definieren. Instanzen und ihre Abhängigkeiten können auf mehrere Datenbanken verteilt und abgefragt werden, basierend auf Attributwerten, Round-Robin-Ansätzen oder jedem anderen benutzerdefinierten System.
Referenzen: #618
[orm] ¶
Eager Loading wurde erweitert, um noch mehr Joins an mehr Stellen zu ermöglichen. Es funktioniert nun in beliebiger Tiefe entlang selbstreferenzierender und zyklischer Strukturen. Beim Laden von zyklischen Strukturen geben Sie „join_depth“ bei relation() an, die angibt, wie oft die Tabelle mit sich selbst verbunden werden soll; jede Ebene erhält einen eindeutigen Tabellenalias. Die Aliasnamen selbst werden zur Kompilierungszeit mit einem einfachen Zählschema generiert und sind viel angenehmer für das Auge, sowie natürlich vollständig deterministisch.
Referenzen: #659
[orm] ¶
Zusammengesetzte Spalten-Eigenschaften hinzugefügt. Dies ermöglicht es Ihnen, einen Typ zu erstellen, der durch mehr als eine Spalte repräsentiert wird, wenn Sie die ORM verwenden. Instanzen des neuen Typs sind in Abfrageausdrücken, Vergleichen, query.get()-Klauseln usw. voll funktionsfähig und verhalten sich, als wären sie reguläre Skalarwerte mit einer einzelnen Spalte... außer, dass sie es nicht sind! Verwenden Sie die Funktion composite(cls, *columns) innerhalb des „properties“-Dictionary des Mappers, und Instanzen von cls werden als ein einziges Attribut erstellt/zugeordnet, das aus den Werten besteht, die den *columns* entsprechen.
Referenzen: #211
[orm] ¶
Verbesserte Unterstützung für benutzerdefinierte column_property()-Attribute, die korrelierte Unterabfragen enthalten, funktioniert jetzt besser mit Eager Loading.
[orm] ¶
Primärschlüssel-„Kollaps“-Verhalten; der Mapper analysiert alle Spalten im gegebenen wählbaren Element auf „Äquivalenz“ des Primärschlüssels, d.h. Spalten, die über eine Fremdschlüsselbeziehung oder über eine explizite inherit_condition äquivalent sind. Hauptsächlich für Joined-Table-Vererbungsszenarien, in denen unterschiedlich benannte PK-Spalten in erbenden Tabellen zu einem einzelnen oder weniger Werten umfassenden Primärschlüssel „kollabieren“ sollten. Korrigiert Dinge wie.
Referenzen: #611
[orm] ¶
Joined-Table-Vererbung generiert nun die Primärschlüsselspalten aller geerbten Klassen nur gegen die Stamm-Tabelle des Joins. Dies bedeutet, dass jede Zeile in der Stamm-Tabelle eindeutig für eine einzelne Instanz ist. Wenn dies aus seltenen Gründen nicht erwünscht ist, überschreiben explizite primary_key-Einstellungen auf einzelnen Mappern dies.
[orm] ¶
Wenn „polymorphic“-Flags mit Joined-Table- oder Single-Table-Vererbung verwendet werden, werden alle Identitätsschlüssel gegen die Stammklasse der Vererbungshierarchie generiert; dies ermöglicht query.get(), polymorphisch zu arbeiten, mit denselben Cache-Semantiken wie ein nicht-polymorpher get. Beachten Sie, dass dies derzeit nicht mit Concrete-Vererbung funktioniert.
[orm] ¶
Sekundäres Vererbungsladen: polymorphe Mapper können *ohne* ein select_table-Argument konstruiert werden. Erbende Mapper, deren Tabellen nicht in der ursprünglichen Ladung repräsentiert waren, geben sofort eine zweite SQL-Abfrage aus, einmal pro Instanz (d.h. nicht sehr effizient für große Listen), um die verbleibenden Spalten zu laden.
[orm] ¶
Das sekundäre Vererbungsladen kann seine zweite Abfrage auch in eine spaltenbezogene „deferred“-Ladung verschieben, über das Argument „polymorphic_fetch“, das auf ‚select‘ oder ‚deferred‘ gesetzt werden kann.
[orm] ¶
Es ist nun möglich, nur eine Teilmenge der verfügbaren wählbaren Spalten auf Mapper-Eigenschaften abzubilden, mit include_columns/exclude_columns..
Referenzen: #696
[orm] ¶
undefer_group() MapperOption hinzugefügt, setzt eine Menge von „deferred“ Spalten, die mit einer „group“ verbunden sind, um als „undeferred“ geladen zu werden.
[orm] ¶
Neufassung der Logik für „deterministische Aliasnamen“, um sie in die SQL-Schicht zu integrieren. Erzeugt viel einfachere Alias- und Labelnamen im Stil von Hibernate.
sql¶
[sql] ¶
Geschwindigkeit! Klauselkompilierung sowie die Mechanik von SQL-Konstrukten wurden in erheblichem Maße optimiert und vereinfacht, was zu einer Verbesserung des Overheads für die Konstruktion/Kompilierung von Anweisungen von 0.3 um 20-30 % führt.
[sql] ¶
Alle „type“-Schlüsselwortargumente, wie z.B. bei bindparam(), column(), Column() und func.<something>(), wurden in „type_“ umbenannt. Diese Objekte nennen ihr „type“-Attribut weiterhin „type“.
[sql] ¶
Die Einstellung case_sensitive=(True|False) wurde aus Schema-Elementen entfernt, da die Prüfung dieses Zustands viel Methodenaufruf-Overhead hinzufügte und es keinen guten Grund gab, sie jemals auf False zu setzen. Tabellen- und Spaltennamen, die alle Kleinbuchstaben sind, werden als nicht-case-sensitiv behandelt (ja, wir berücksichtigen auch den Oracle-UPPERCASE-Stil).
extensions¶
[extensions] ¶
proxyengine wird vorübergehend entfernt, bis ein tatsächlich funktionierender Ersatz verfügbar ist.
[extensions] ¶
SelectResults wurde durch Query ersetzt. SelectResults / SelectResultsExt existieren weiterhin, geben aber nur ein leicht modifiziertes Query-Objekt zurück, um die Abwärtskompatibilität zu gewährleisten. Die join_to()-Methode von SelectResults ist nicht mehr vorhanden, Sie müssen join() verwenden.
mysql¶
[mysql] ¶
Tabellen- und Spaltennamen, die per Reflection geladen werden, sind nun Unicode.
[mysql] ¶
Alle Standard-Spaltentypen werden nun unterstützt, einschließlich SET.
[mysql] ¶
Tabellenspiegelung kann nun in nur einem Round-Trip durchgeführt werden.
[mysql] ¶
ANSI- und ANSI_QUOTES-SQL-Modi werden nun unterstützt.
[mysql] ¶
Indizes werden nun gespiegelt.
oracle¶
misc¶
[transactions] ¶
Unterstützung für Kontextmanager (with-Anweisung) für Transaktionen hinzugefügt.
[transactions] ¶
Unterstützung für Two-Phase Commit hinzugefügt, funktioniert bisher mit MySQL und PostgreSQL.
[transactions] ¶
Implementierung einer Subtransaktion, die Savepoints verwendet, hinzugefügt.
[transactions] ¶
Unterstützung für Savepoints hinzugefügt.
[metadata] ¶
Tabellen können massenhaft aus der Datenbank reflektiert werden, ohne sie vorher deklarieren zu müssen. MetaData(engine, reflect=True) lädt alle Tabellen, die in der Datenbank vorhanden sind, oder verwendet metadata.reflect() für eine feinere Steuerung.
[metadata] ¶
DynamicMetaData wurde in ThreadLocalMetaData umbenannt
[metadata] ¶
Der Konstruktor von ThreadLocalMetaData nimmt nun keine Argumente mehr entgegen.
[metadata] ¶
BoundMetaData wurde entfernt – reguläres MetaData ist äquivalent.
[metadata] ¶
Numeric- und Float-Typen haben nun ein „asdecimal“-Flag; standardmäßig True für Numeric, False für Float. Wenn True, werden Werte als decimal.Decimal-Objekte zurückgegeben; wenn False, werden Werte als float() zurückgegeben. Die Standardwerte True/False entsprechen bereits dem Verhalten von PG- und MySQLs DBAPI-Modulen.
Referenzen: #646
[metadata] ¶
Neue Implementierung von SQL-Operatoren, die alle hartkodierten Operatoren aus Ausdrucksstrukturen entfernt und in die Kompilierung verschiebt; ermöglicht eine größere Flexibilität bei der Kompilierung von Operatoren; z. B. wird „+“ in einem Zeichenfolgenkontext zu „||“ oder bei MySQL zu „concat(a,b)“ kompiliert; während es in einem numerischen Kontext zu „+“ kompiliert wird. Behoben.
Referenzen: #475
[metadata] ¶
„Anonyme“ Alias- und Labelnamen werden nun zur Kompilierungszeit von SQL auf eine vollständig deterministische Weise generiert… keine zufälligen Hex-IDs mehr.
[metadata] ¶
Signifikante architektonische Überarbeitung von SQL-Elementen (ClauseElement). Alle Elemente teilen sich ein gemeinsames „Mutability“-Framework, das einen konsistenten Ansatz für In-Place-Modifikationen von Elementen sowie für generatives Verhalten ermöglicht. Verbessert die Stabilität des ORM, das stark von Mutationen an SQL-Ausdrücken Gebrauch macht.
[metadata] ¶
select() und union() haben nun ein „generatives“ Verhalten. Methoden wie order_by() und group_by() geben eine *neue* Instanz zurück – die ursprüngliche Instanz bleibt unverändert. Nicht-generative Methoden bleiben ebenfalls erhalten.
[metadata] ¶
Die internen Abläufe von select/union wurden erheblich vereinfacht – alle Entscheidungen bezüglich „ist Subquery“ und „Korrelation“ wurden in die SQL-Generierungsphase verschoben. select()-Elemente werden nun *niemals* von ihren umgebenden Containern oder vom Kompilierungsprozess eines Dialekts mutiert.
[metadata] ¶
Das Argument select(scalar=True) ist veraltet; verwenden Sie select(..).as_scalar(). Das resultierende Objekt folgt der vollständigen „Column“-Schnittstelle und spielt besser innerhalb von Ausdrücken.
[metadata] ¶
select().with_prefix(‘foo’) hinzugefügt, was es erlaubt, beliebige Schlüsselwörter vor der Spaltenklausel von SELECT zu platzieren.
Referenzen: #504
[metadata] ¶
Array-Slice-Unterstützung für row[<index>] hinzugefügt.
Referenzen: #686
[metadata] ¶
Ergebnisdatensätze versuchen besser, die im Cursor.description vorhandenen DBAPI-Typen mit den vom Dialekt definierten TypeEngine-Objekten abzugleichen, die dann für die Ergebnisverarbeitung verwendet werden. Beachten Sie, dass dies nur für textuelles SQL wirksam wird; konstruierte SQL-Anweisungen haben immer eine explizite Typzuordnung.
[metadata] ¶
Ergebnisdatensätze von CRUD-Operationen schließen ihren zugrunde liegenden Cursor sofort und schließen auch die Verbindung automatisch, wenn diese für die Operation definiert ist; dies ermöglicht eine effizientere Nutzung von Verbindungen für aufeinanderfolgende CRUD-Operationen mit geringerer Wahrscheinlichkeit von „hängenden Verbindungen“.
[metadata] ¶
Spalten-Standardwerte und onupdate-Python-Funktionen (d. h. übergeben an ColumnDefault) können null oder ein Argument annehmen; das eine Argument ist der ExecutionContext, von dem aus Sie „context.parameters[someparam]“ aufrufen können, um auf andere an die Anweisung angehängte Bindungsparameterwerte zuzugreifen. Die für die Ausführung verwendete Verbindung ist ebenfalls verfügbar, sodass Sie Anweisungen vorab ausführen können.
Referenzen: #559
[metadata] ¶
Explizite create/drop/execute-Unterstützung für Sequenzen hinzugefügt (d. h. Sie können jedem dieser Methoden auf Sequence einen „connectable“ übergeben).
[metadata] ¶
Bessere Anführungszeichen für Bezeichner bei der Bearbeitung von Schemas.
[metadata] ¶
Standardisiertes Verhalten für Tabellenreflexion, wenn Typen nicht gefunden werden können; NullType wird stattdessen substituiert, und eine Warnung wird ausgegeben.
[metadata] ¶
ColumnCollection (d. h. das „c“-Attribut von Tabellen) folgt den Dictionary-Semantiken für „__contains__“.
Referenzen: #606
[engines] ¶
Geschwindigkeit! Die Mechanismen der Ergebnisverarbeitung und der Bindungsparameterverarbeitung wurden überarbeitet, optimiert und so gestaltet, dass so wenige Methodenaufrufe wie möglich erfolgen. Benchmarks für Massen-INSERT und Massen-Rowset-Iteration zeigen, dass 0.4 über doppelt so schnell ist wie 0.3 und 68 % weniger Funktionsaufrufe verwendet.
[engines] ¶
Sie können jetzt in den Pool-Lebenszyklus eingreifen und SQL-Anweisungen oder andere Logik bei jeder neuen DBAPI-Verbindung, beim Pool-Checkout und -Check-in ausführen.
[engines] ¶
Verbindungen erhalten eine .properties-Sammlung, deren Inhalt auf die Lebensdauer der zugrunde liegenden DBAPI-Verbindung beschränkt ist.
[engines] ¶
Die Argumente auto_close_cursors und disallow_open_cursors wurden aus Pool entfernt; dies reduziert den Overhead, da Cursors normalerweise von ResultProxy und Connection geschlossen werden.
[postgres] ¶
PGArray-Datentyp hinzugefügt für die Verwendung von PostgreSQL-Array-Datentypen.
Die Designs von flambé! dem Drachen und Der Alchemist wurden von Rotem Yaari erstellt und großzügig gespendet.
Erstellt mit Sphinx 7.2.6. Dokumentation zuletzt generiert: Di 11 Mär 2025 14:40:17 EDT