SQLAlchemy 2.0 Dokumentation
SQLAlchemy Core
- API für SQL-Anweisungen und Ausdrücke
- Schema Definition Language
- SQL Datentyp-Objekte
- Die Typenhierarchie
- Benutzerdefinierte Typen
- Base Type API¶
TypeEngineTypeEngine.ComparatorTypeEngine.adapt()TypeEngine.as_generic()TypeEngine.bind_expression()TypeEngine.bind_processor()TypeEngine.coerce_compared_value()TypeEngine.column_expression()TypeEngine.comparator_factoryTypeEngine.compare_values()TypeEngine.compile()TypeEngine.dialect_impl()TypeEngine.evaluates_none()TypeEngine.get_dbapi_type()TypeEngine.hashableTypeEngine.literal_processor()TypeEngine.python_typeTypeEngine.render_bind_castTypeEngine.render_literal_castTypeEngine.result_processor()TypeEngine.should_evaluate_noneTypeEngine.sort_key_functionTypeEngine.with_variant()
ConcatenableIndexierbarNullTypeExternalTypeVariant
- Engine und Connection verwenden
- Grundlagen der Core API
Projektversionen
- Vorher: Benutzerdefinierte Typen
- Nächste: Engine und Verbindungsnutzung
- Nach oben: Startseite
- Auf dieser Seite
- Basis-Typ-API
TypeEngineTypeEngine.ComparatorTypeEngine.adapt()TypeEngine.as_generic()TypeEngine.bind_expression()TypeEngine.bind_processor()TypeEngine.coerce_compared_value()TypeEngine.column_expression()TypeEngine.comparator_factoryTypeEngine.compare_values()TypeEngine.compile()TypeEngine.dialect_impl()TypeEngine.evaluates_none()TypeEngine.get_dbapi_type()TypeEngine.hashableTypeEngine.literal_processor()TypeEngine.python_typeTypeEngine.render_bind_castTypeEngine.render_literal_castTypeEngine.result_processor()TypeEngine.should_evaluate_noneTypeEngine.sort_key_functionTypeEngine.with_variant()
ConcatenableIndexierbarNullTypeExternalTypeVariant
Base Type API¶
| Objektname | Beschreibung |
|---|---|
Ein Mixin, der einen Typ als für die „Verkettung“ (typischerweise von Strings) unterstützend markiert. |
|
Mixin, der Attribute und Verhaltensweisen definiert, die spezifisch für Datentypen von Drittanbietern sind. |
|
Ein Mixin, der einen Typ als für Indexoperationen (wie Array- oder JSON-Strukturen) unterstützend markiert. |
|
Ein unbekannter Typ. |
|
Die ultimative Basisklasse für alle SQL-Datentypen. |
|
veraltet. Das Symbol ist aus Gründen der Abwärtskompatibilität mit Workaround-Rezepten vorhanden, dieser tatsächliche Typ sollte jedoch nicht verwendet werden. |
- class sqlalchemy.types.TypeEngine¶
Die ultimative Basisklasse für alle SQL-Datentypen.
Zu den gängigen Unterklassen von
TypeEnginegehörenString,IntegerundBoolean.Eine Übersicht über das SQLAlchemy-Typensystem finden Sie unter SQL-Datentypobjekte.
Siehe auch
Mitglieder
operate(), reverse_operate(), adapt(), as_generic(), bind_expression(), bind_processor(), coerce_compared_value(), column_expression(), comparator_factory, compare_values(), compile(), dialect_impl(), evaluates_none(), get_dbapi_type(), hashable, literal_processor(), python_type, render_bind_cast, render_literal_cast, result_processor(), should_evaluate_none, sort_key_function, with_variant()
Klassensignatur
class
sqlalchemy.types.TypeEngine(sqlalchemy.sql.visitors.Visitable,typing.Generic)- class Comparator¶
Basisklasse für benutzerdefinierte Vergleichsoperationen, die auf Typenebene definiert sind. Siehe
TypeEngine.comparator_factory.Klassensignatur
class
sqlalchemy.types.TypeEngine.Comparator(sqlalchemy.sql.expression.ColumnOperators,typing.Generic)-
method
sqlalchemy.types.TypeEngine.Comparator.operate(op: OperatorType, *other: Any, **kwargs: Any) → ColumnElement[Any]¶ Operiert auf einem Argument.
Dies ist die niedrigste Ebene der Operation, löst standardmäßig
NotImplementedErroraus.Das Überschreiben dieser Methode in einer Unterklasse kann es ermöglichen, allgemeines Verhalten auf alle Operationen anzuwenden. Zum Beispiel, das Überschreiben von
ColumnOperators, umfunc.lower()auf die linke und rechte Seite anzuwendenclass MyComparator(ColumnOperators): def operate(self, op, other, **kwargs): return op(func.lower(self), func.lower(other), **kwargs)
-
method
sqlalchemy.types.TypeEngine.Comparator.reverse_operate(op: OperatorType, other: Any, **kwargs: Any) → ColumnElement[_CT]¶ Umgekehrte Operation auf ein Argument.
Die Verwendung ist dieselbe wie bei
operate().
-
method
-
method
sqlalchemy.types.TypeEngine.adapt(cls: Type[TypeEngine | TypeEngineMixin], **kw: Any) → TypeEngine¶ Erzeugt eine „angepasste“ Form dieses Typs, unter Verwendung einer „Impl“-Klasse zur Arbeit.
Diese Methode wird intern verwendet, um generische Typen mit „Implementierungstypen“ zu verknüpfen, die für ein bestimmtes Dialekt spezifisch sind.
-
method
sqlalchemy.types.TypeEngine.as_generic(allow_nulltype: bool = False) → TypeEngine¶ Gibt eine Instanz des generischen Typs zurück, der diesem Typ entspricht, unter Verwendung einer heuristischen Regel. Die Methode kann überschrieben werden, wenn diese heuristische Regel nicht ausreicht.
>>> from sqlalchemy.dialects.mysql import INTEGER >>> INTEGER(display_width=4).as_generic() Integer()
>>> from sqlalchemy.dialects.mysql import NVARCHAR >>> NVARCHAR(length=100).as_generic() Unicode(length=100)
Neu ab Version 1.4.0b2.
Siehe auch
Reflektieren mit datenbankunabhängigen Typen – beschreibt die Verwendung von
TypeEngine.as_generic()in Verbindung mit demDDLEvents.column_reflect()-Ereignis, was die beabsichtigte Verwendung ist.
-
method
sqlalchemy.types.TypeEngine.bind_expression(bindvalue: BindParameter[_T]) → ColumnElement[_T] | None¶ Gibt bei einem Bindungswert (d. h. einer Instanz von
BindParameter) einen SQL-Ausdruck an seiner Stelle zurück.Dies ist typischerweise eine SQL-Funktion, die den vorhandenen gebundenen Parameter innerhalb der Anweisung umschließt. Sie wird für spezielle Datentypen verwendet, die Literale benötigen, die in eine datenbankspezifische Funktion eingeschlossen sind, um einen anwendungsspezifischen Wert in ein datenbankspezifisches Format zu konvertieren. Sie ist das SQL-Analogon der Methode
TypeEngine.bind_processor().Diese Methode wird während der **SQL-Kompilierungsphase** einer Anweisung aufgerufen, wenn eine SQL-Zeichenkette gerendert wird. Sie wird **nicht** auf bestimmte Werte angewendet.
Beachten Sie, dass diese Methode, wenn sie implementiert ist, immer genau dieselbe Struktur ohne bedingte Logik zurückgeben sollte, da sie in einem `executemany()`-Aufruf für eine beliebige Anzahl von gebundenen Parametersätzen verwendet werden kann.
Hinweis
Diese Methode wird nur in Bezug auf ein **dialektspezifisches Typobjekt** aufgerufen, das oft **privat für ein verwendetes Dialekt** ist und nicht dasselbe Typobjekt wie das öffentlich sichtbare ist. Daher ist es nicht möglich, eine
TypeEngine-Klasse zu unterklassen, um eine alternativeTypeEngine.bind_expression()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit dieUserDefinedType-Klasse.Um ein alternatives Verhalten für
TypeEngine.bind_expression()bereitzustellen, implementieren Sie eineTypeDecorator-Klasse und stellen Sie eine Implementierung vonTypeDecorator.bind_expression()bereit.Siehe auch
-
method
sqlalchemy.types.TypeEngine.bind_processor(dialect: Dialect) → _BindProcessorType[_T] | None¶ Gibt eine Konvertierungsfunktion für die Verarbeitung von Bindungswerten zurück.
Gibt einen Aufrufbaren zurück, der einen gebundenen Parameterwert als einziges Positionsargument erhält und einen Wert zurückgibt, der an die DB-API gesendet werden soll.
Wenn keine Verarbeitung erforderlich ist, sollte die Methode
Nonezurückgeben.Hinweis
Diese Methode wird nur in Bezug auf ein **dialektspezifisches Typobjekt** aufgerufen, das oft **privat für ein verwendetes Dialekt** ist und nicht dasselbe Typobjekt wie das öffentlich sichtbare ist. Daher ist es nicht möglich, eine
TypeEngine-Klasse zu unterklassen, um eine alternativeTypeEngine.bind_processor()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit dieUserDefinedType-Klasse.Um ein alternatives Verhalten für
TypeEngine.bind_processor()bereitzustellen, implementieren Sie eineTypeDecorator-Klasse und stellen Sie eine Implementierung vonTypeDecorator.process_bind_param()bereit.Siehe auch
- Parameter:
dialect¶ – Das verwendete Dialekt-Objekt.
-
method
sqlalchemy.types.TypeEngine.coerce_compared_value(op: OperatorType | None, value: Any) → TypeEngine[Any]¶ Schlagen Sie einen Typ für einen „koerzierten“ Python-Wert in einem Ausdruck vor.
Gibt einem Typ die Möglichkeit, einen Typ zurückzugeben, in den der Wert koerziert werden soll, basierend auf dem Operator und dem Wert.
Das Standardverhalten hier ist konservativ; wenn die rechte Seite bereits aufgrund ihres Python-Typs in einen SQL-Typ koerziert wurde, wird sie normalerweise unverändert belassen.
Die Erweiterung der Endbenutzerfunktionalität sollte hier im Allgemeinen über
TypeDecoratorerfolgen, der ein liberaleres Verhalten bietet, da er standardmäßig die andere Seite des Ausdrucks in diesen Typ koerziert und somit spezielle Python-Konvertierungen über die vom DBAPI benötigten hinaus auf beide Seiten anwendet. Er bietet auch die öffentliche MethodeTypeDecorator.coerce_compared_value(), die für die Anpassung dieses Verhaltens durch Endbenutzer gedacht ist.
-
method
sqlalchemy.types.TypeEngine.column_expression(colexpr: ColumnElement[_T]) → ColumnElement[_T] | None¶ Gibt beim SELECT-Spaltenausdruck einen umschließenden SQL-Ausdruck zurück.
Dies ist typischerweise eine SQL-Funktion, die einen Spaltenausdruck umschließt, wie er in der Spaltenklausel einer SELECT-Anweisung gerendert wird. Sie wird für spezielle Datentypen verwendet, die erfordern, dass Spalten in eine spezielle Datenbankfunktion eingeschlossen werden, um den Wert vor der Rückgabe an die Anwendung zu konvertieren. Sie ist das SQL-Analogon der Methode
TypeEngine.result_processor().Diese Methode wird während der **SQL-Kompilierungsphase** einer Anweisung aufgerufen, wenn eine SQL-Zeichenkette gerendert wird. Sie wird **nicht** auf bestimmte Werte angewendet.
Hinweis
Diese Methode wird nur in Bezug auf ein **dialektspezifisches Typobjekt** aufgerufen, das oft **privat für ein verwendetes Dialekt** ist und nicht dasselbe Typobjekt wie das öffentlich sichtbare ist. Daher ist es nicht möglich, eine
TypeEngine-Klasse zu unterklassen, um eine alternativeTypeEngine.column_expression()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit dieUserDefinedType-Klasse.Um ein alternatives Verhalten für
TypeEngine.column_expression()bereitzustellen, implementieren Sie eineTypeDecorator-Klasse und stellen Sie eine Implementierung vonTypeDecorator.column_expression()bereit.Siehe auch
-
attribute
sqlalchemy.types.TypeEngine.comparator_factory¶ Alias von
Comparator
-
method
sqlalchemy.types.TypeEngine.compare_values(x: Any, y: Any) → bool¶ Vergleicht zwei Werte auf Gleichheit.
-
method
sqlalchemy.types.TypeEngine.compile(dialect: Dialect | None = None) → str¶ Erzeugt eine Zeichenketten-kompilierte Form dieses
TypeEngine.Wenn ohne Argumente aufgerufen, wird ein „Standard“-Dialekt verwendet, um ein Zeichenketten-Ergebnis zu erzeugen.
-
method
sqlalchemy.types.TypeEngine.dialect_impl(dialect: Dialect) → TypeEngine[_T]¶ Gibt eine dialektspezifische Implementierung für diesen
TypeEnginezurück.
-
method
sqlalchemy.types.TypeEngine.evaluates_none() → Self¶ Gibt eine Kopie dieses Typs zurück, bei der das Flag
should_evaluate_noneauf True gesetzt ist.Z. B.
Table( "some_table", metadata, Column( String(50).evaluates_none(), nullable=True, server_default="no value", ), )
Die ORM verwendet dieses Flag, um anzuzeigen, dass ein positiver Wert von
Nonein einer INSERT-Anweisung an die Spalte übergeben wird, anstatt die Spalte aus der INSERT-Anweisung wegzulassen, was die Auslösung spaltenbezogener Standardwerte zur Folge hat. Es ermöglicht auch Typen mit speziellem Verhalten für den Python-Wert `None`, anzuzeigen, dass der Wert nicht unbedingt in SQL NULL übersetzt werden muss; ein Paradebeispiel hierfür ist ein JSON-Typ, der den JSON-Wert'null'speichern möchte.In allen Fällen kann der tatsächliche SQL-NULL-Wert immer in jede Spalte geschrieben werden, indem die
nullSQL-Konstruktion in einer INSERT-Anweisung verwendet oder mit einem ORM-zugeordneten Attribut verknüpft wird.Hinweis
Das Flag „evaluates none“ gilt **nicht** für einen Wert von
None, der anColumn.defaultoderColumn.server_defaultübergeben wird; in diesen Fällen bedeutetNoneimmer noch „kein Standard“.Siehe auch
NULL erzwingen für eine Spalte mit einem Standardwert – in der ORM-Dokumentation
JSON.none_as_null- PostgreSQL JSON-Interaktion mit diesem Flag.TypeEngine.should_evaluate_none- Klassenflag.
-
method
sqlalchemy.types.TypeEngine.get_dbapi_type(dbapi: module) → Any | None¶ Gibt den entsprechenden Typobjekt aus der zugrundeliegenden DB-API zurück, falls vorhanden.
Dies kann beispielsweise nützlich sein, um
setinputsizes()aufzurufen.
-
attribute
sqlalchemy.types.TypeEngine.hashable = True¶ Flag, wenn False, bedeutet, dass Werte dieses Typs nicht hashbar sind.
Wird vom ORM beim Eindeutigen von Ergebnislisten verwendet.
-
method
sqlalchemy.types.TypeEngine.literal_processor(dialect: Dialect) → _LiteralProcessorType[_T] | None¶ Gibt eine Konvertierungsfunktion für die Verarbeitung von Literalwerten zurück, die direkt ohne Bindungen gerendert werden sollen.
Diese Funktion wird verwendet, wenn der Compiler das Flag "literal_binds" verwendet, das typischerweise in der DDL-Generierung sowie in bestimmten Szenarien verwendet wird, in denen Backends keine gebundenen Parameter akzeptieren.
Gibt einen Aufrufer zurück, der einen literalen Python-Wert als einziges Positionsargument erhält und eine String-Darstellung zurückgibt, die in einer SQL-Anweisung gerendert werden soll.
Hinweis
Diese Methode wird nur relativ zu einem **dialektspezifischen Typobjekt** aufgerufen, das oft **privat für einen verwendeten Dialekt** ist und nicht dasselbe Typobjekt wie das öffentlich sichtbare ist. Daher ist es nicht möglich, eine
TypeEngine-Klasse zu unterklassieren, um eine alternativeTypeEngine.literal_processor()-Methode bereitzustellen, es sei denn, dieUserDefinedType-Klasse wird explizit unterklassiert.Um ein alternatives Verhalten für
TypeEngine.literal_processor()bereitzustellen, implementieren Sie eineTypeDecorator-Klasse und stellen Sie eine Implementierung vonTypeDecorator.process_literal_param()bereit.Siehe auch
-
attribute
sqlalchemy.types.TypeEngine.python_type¶ Gibt den Python-Typobjekt zurück, der von Instanzen dieses Typs erwartet wird, falls bekannt.
Grundsätzlich gibt dies für Typen, die einen Rückgabetyp erzwingen oder bei denen bekannt ist, dass sie dies für alle gängigen DBAPIs tun (wie z. B.
int), diesen Typ zurück.Wenn kein Rückgabetyp definiert ist, wird
NotImplementedErrorausgelöst.Beachten Sie, dass jeder Typ auch NULL in SQL unterstützt, was bedeutet, dass Sie in der Praxis auch von jedem Typ
Nonezurückerhalten können.
-
attribute
sqlalchemy.types.TypeEngine.render_bind_cast = False¶ Rendert Bindungs-Casts für den Modus
BindTyping.RENDER_CASTS.Wenn True, signalisiert dieser Typ (normalerweise ein impliziter Typ auf Dialektebene) dem Compiler, dass ein Cast um einen gebundenen Parameter für diesen Typ gerendert werden soll.
Neu in Version 2.0.
Siehe auch
-
attribute
sqlalchemy.types.TypeEngine.render_literal_cast = False¶ Rendert Casts beim Rendern eines Werts als Inline-Literal, z. B. mit
TypeEngine.literal_processor().Neu in Version 2.0.
-
method
sqlalchemy.types.TypeEngine.result_processor(dialect: Dialect, coltype: object) → _ResultProcessorType[_T] | None¶ Gibt eine Konvertierungsfunktion für die Verarbeitung von Ergebnissen zurück.
Gibt einen Aufrufer zurück, der einen Ergebniswert aus einer Zeile als einziges Positionsargument erhält und einen Wert zurückgibt, der an den Benutzer übergeben werden soll.
Wenn keine Verarbeitung erforderlich ist, sollte die Methode
Nonezurückgeben.Hinweis
Diese Methode wird nur relativ zu einem **dialektspezifischen Typobjekt** aufgerufen, das oft **privat für einen verwendeten Dialekt** ist und nicht dasselbe Typobjekt wie das öffentlich sichtbare ist. Daher ist es nicht möglich, eine
TypeEngine-Klasse zu unterklassieren, um eine alternativeTypeEngine.result_processor()-Methode bereitzustellen, es sei denn, dieUserDefinedType-Klasse wird explizit unterklassiert.Um ein alternatives Verhalten für
TypeEngine.result_processor()bereitzustellen, implementieren Sie eineTypeDecorator-Klasse und stellen Sie eine Implementierung vonTypeDecorator.process_result_value()bereit.Siehe auch
-
attribute
sqlalchemy.types.TypeEngine.should_evaluate_none: bool = False¶ Wenn True, wird die Python-Konstante
Nonevon diesem Typ explizit behandelt.Das ORM verwendet dieses Flag, um anzuzeigen, dass ein positiver Wert von
Nonein einer INSERT-Anweisung an die Spalte übergeben wird, anstatt die Spalte aus der INSERT-Anweisung wegzulassen, was den Effekt hat, spaltenspezifische Standardwerte auszulösen. Es ermöglicht auch Typen, die ein spezielles Verhalten für Python None haben, wie z. B. ein JSON-Typ, anzuzeigen, dass sie den None-Wert explizit behandeln möchten.Um dieses Flag für einen vorhandenen Typ zu setzen, verwenden Sie die Methode
TypeEngine.evaluates_none().Siehe auch
-
attribute
sqlalchemy.types.TypeEngine.sort_key_function: Callable[[Any], Any] | None = None¶ Eine Sortierfunktion, die als Schlüssel für `sorted` übergeben werden kann.
Der Standardwert
Nonebedeutet, dass die von diesem Typ gespeicherten Werte selbst sortierbar sind.Neu seit Version 1.3.8.
-
method
sqlalchemy.types.TypeEngine.with_variant(type_: _TypeEngineArgument[Any], *dialect_names: str) → Self¶ Erzeugt eine Kopie dieses Typobjekts, die den angegebenen Typ verwendet, wenn er auf den Dialekt des angegebenen Namens angewendet wird.
z. B.
from sqlalchemy.types import String from sqlalchemy.dialects import mysql string_type = String() string_type = string_type.with_variant( mysql.VARCHAR(collation="foo"), "mysql", "mariadb" )
Die Variantenabbildung gibt an, dass dieser Typ, wenn er von einem bestimmten Dialekt interpretiert wird, stattdessen in den angegebenen Typ umgewandelt wird, anstatt den primären Typ zu verwenden.
Geändert in Version 2.0: Die Methode
TypeEngine.with_variant()arbeitet nun mit einemTypeEngine-Objekt "in place" und gibt eine Kopie des ursprünglichen Typs zurück, anstatt ein Wrapper-Objekt zurückzugeben; die KlasseVariantwird nicht mehr verwendet.- Parameter:
type_¶ – ein
TypeEngine, der als Variante vom Ursprungstyp ausgewählt wird, wenn ein Dialekt des angegebenen Namens verwendet wird.*dialect_names¶ –
ein oder mehrere Basisnamen des Dialekts, der diesen Typ verwendet. (d. h.
'postgresql','mysql'usw.)Geändert in Version 2.0: mehrere Dialektnamen können für eine Variante angegeben werden.
Siehe auch
Verwendung von "UPPERCASE"- und Backendspezifischen Typen für mehrere Backends - illustriert die Verwendung von
TypeEngine.with_variant().
- class sqlalchemy.types.Concatenable¶
Ein Mixin, der einen Typ als für die „Verkettung“ (typischerweise von Strings) unterstützend markiert.
Mitglieder
Klassensignatur
class
sqlalchemy.types.Concatenable(sqlalchemy.types.TypeEngineMixin)- class Comparator¶
Klassensignatur
class
sqlalchemy.types.Concatenable.Comparator(sqlalchemy.types.Comparator)
-
attribute
sqlalchemy.types.Concatenable.comparator_factory¶ alias von
Comparator
- class sqlalchemy.types.Indexable¶
Ein Mixin, der einen Typ als für Indexoperationen (wie Array- oder JSON-Strukturen) unterstützend markiert.
Mitglieder
Klassensignatur
class
sqlalchemy.types.Indexable(sqlalchemy.types.TypeEngineMixin)- class Comparator¶
Klassensignatur
class
sqlalchemy.types.Indexable.Comparator(sqlalchemy.types.Comparator)
-
attribute
sqlalchemy.types.Indexable.comparator_factory¶ alias von
Comparator
- class sqlalchemy.types.NullType¶
Ein unbekannter Typ.
NullTypewird als Standardtyp für Fälle verwendet, in denen ein Typ nicht bestimmt werden kann, einschließlichWährend der Tabellenreflexion, wenn der Typ einer Spalte vom
Dialectnicht erkannt wirdBeim Erstellen von SQL-Ausdrücken mit einfachen Python-Objekten unbekannter Typen (z. B.
somecolumn == my_special_object)Wenn eine neue
Columnerstellt wird und der angegebene Typ alsNoneübergeben wird oder gar nicht angegeben wird.
Die
NullTypekann problemlos innerhalb von SQL-Ausdrucksaufrufen verwendet werden. Sie hat weder auf der Ebene der Ausdruckserstellung noch auf der Ebene der Bindungs-/Ergebnisverarbeitung ein Verhalten.NullTypeführt zu einemCompileError, wenn der Compiler aufgefordert wird, den Typ selbst zu rendern, z. B. wenn er in einercast()-Operation oder innerhalb einer Schemaerstellungsoperation verwendet wird, wie sie vonMetaData.create_all()oder demCreateTable-Konstrukt aufgerufen wird.Klassensignatur
class
sqlalchemy.types.NullType(sqlalchemy.types.TypeEngine)
- class sqlalchemy.types.ExternalType¶
Mixin, der Attribute und Verhaltensweisen definiert, die spezifisch für Datentypen von Drittanbietern sind.
"Drittanbieter" bezieht sich auf Datentypen, die außerhalb des Geltungsbereichs von SQLAlchemy entweder im Anwendungscode des Endbenutzers oder in externen Erweiterungen von SQLAlchemy definiert sind.
Unterklassen umfassen derzeit
TypeDecoratorundUserDefinedType.Neu in Version 1.4.28.
Mitglieder
Klassensignatur
class
sqlalchemy.types.ExternalType(sqlalchemy.types.TypeEngineMixin)-
attribute
sqlalchemy.types.ExternalType.cache_ok: bool | None = None¶ Zeigt an, ob Anweisungen, die diesen
ExternalTypeverwenden, "sicher zu cachen" sind.Der Standardwert
Nonelöst eine Warnung aus und erlaubt dann nicht das Caching einer Anweisung, die diesen Typ enthält. Setzen Sie aufFalse, um das Caching von Anweisungen, die diesen Typ verwenden, ohne Warnung vollständig zu deaktivieren. Wenn aufTruegesetzt, werden die Klasse des Objekts und die ausgewählten Elemente seines Zustands als Teil des Cache-Schlüssels verwendet. Zum Beispiel die Verwendung einesTypeDecoratorclass MyType(TypeDecorator): impl = String cache_ok = True def __init__(self, choices): self.choices = tuple(choices) self.internal_only = True
Der Cache-Schlüssel für den obigen Typ wäre äquivalent zu
>>> MyType(["a", "b", "c"])._static_cache_key (<class '__main__.MyType'>, ('choices', ('a', 'b', 'c')))
Das Caching-Schema extrahiert Attribute aus dem Typ, die den Namen der Parameter in der Methode
__init__()entsprechen. Oben wird das Attribut "choices" Teil des Cache-Schlüssels, "internal_only" jedoch nicht, da es keinen Parameter namens "internal_only" gibt.Die Anforderungen an cachebare Elemente sind, dass sie hashbar sind und auch, dass sie für gegebene Cache-Werte bei jeder Ausführung dieselbe SQL-Darstellung für Ausdrücke anzeigen, die diesen Typ verwenden.
Um Datentypen zu unterstützen, die sich auf nicht hashbare Strukturen wie Wörterbücher, Mengen und Listen beziehen, können diese Objekte "cachebar" gemacht werden, indem hashbare Strukturen den Attributen zugewiesen werden, deren Namen mit den Namen der Argumente übereinstimmen. Zum Beispiel kann ein Datentyp, der ein Wörterbuch mit Nachschlage-Werten akzeptiert, dieses als sortierte Reihe von Tupeln veröffentlichen. Angenommen, ein zuvor nicht cachebarer Typ als
class LookupType(UserDefinedType): """a custom type that accepts a dictionary as a parameter. this is the non-cacheable version, as "self.lookup" is not hashable. """ def __init__(self, lookup): self.lookup = lookup def get_col_spec(self, **kw): return "VARCHAR(255)" def bind_processor(self, dialect): ... # works with "self.lookup" ...
wobei "lookup" ein Wörterbuch ist. Der Typ kann keinen Cache-Schlüssel generieren
>>> type_ = LookupType({"a": 10, "b": 20}) >>> type_._static_cache_key <stdin>:1: SAWarning: UserDefinedType LookupType({'a': 10, 'b': 20}) will not produce a cache key because the ``cache_ok`` flag is not set to True. Set this flag to True if this type object's state is safe to use in a cache key, or False to disable this warning. symbol('no_cache')
Wenn wir einen solchen Cache-Schlüssel **einrichten** würden, wäre er nicht verwendbar. Wir würden eine Tupelstruktur erhalten, die ein Wörterbuch enthält, das selbst nicht als Schlüssel in einem "Cache-Wörterbuch" wie dem Statement-Cache von SQLAlchemy verwendet werden kann, da Python-Wörterbücher nicht hashbar sind.
>>> # set cache_ok = True >>> type_.cache_ok = True >>> # this is the cache key it would generate >>> key = type_._static_cache_key >>> key (<class '__main__.LookupType'>, ('lookup', {'a': 10, 'b': 20})) >>> # however this key is not hashable, will fail when used with >>> # SQLAlchemy statement cache >>> some_cache = {key: "some sql value"} Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict'
Der Typ kann cachebar gemacht werden, indem ein sortiertes Tupel von Tupeln dem Attribut ".lookup" zugewiesen wird
class LookupType(UserDefinedType): """a custom type that accepts a dictionary as a parameter. The dictionary is stored both as itself in a private variable, and published in a public variable as a sorted tuple of tuples, which is hashable and will also return the same value for any two equivalent dictionaries. Note it assumes the keys and values of the dictionary are themselves hashable. """ cache_ok = True def __init__(self, lookup): self._lookup = lookup # assume keys/values of "lookup" are hashable; otherwise # they would also need to be converted in some way here self.lookup = tuple((key, lookup[key]) for key in sorted(lookup)) def get_col_spec(self, **kw): return "VARCHAR(255)" def bind_processor(self, dialect): ... # works with "self._lookup" ...
wobei der Cache-Schlüssel für
LookupType({"a": 10, "b": 20})ist>>> LookupType({"a": 10, "b": 20})._static_cache_key (<class '__main__.LookupType'>, ('lookup', (('a', 10), ('b', 20))))
Neu in Version 1.4.14: - das Flag
cache_okhinzugefügt, um eine gewisse Konfigurierbarkeit des Cachings fürTypeDecorator-Klassen zu ermöglichen.Neu in Version 1.4.28: - die Mixin
ExternalTypehinzugefügt, die das Flagcache_oksowohl für die KlassenTypeDecoratorals auch fürUserDefinedTypeverallgemeinert.Siehe auch
-
attribute
- class sqlalchemy.types.Variant¶
veraltet. Das Symbol ist aus Gründen der Abwärtskompatibilität mit Workaround-Rezepten vorhanden, dieser tatsächliche Typ sollte jedoch nicht verwendet werden.
Mitglieder
Klassensignatur
class
sqlalchemy.types.Variant(sqlalchemy.types.TypeDecorator)-
method
sqlalchemy.types.Variant.with_variant(type_: _TypeEngineArgument[Any], *dialect_names: str) → Self¶ geerbt von der Methode
TypeEngine.with_variant()der KlasseTypeEngineErzeugt eine Kopie dieses Typobjekts, die den angegebenen Typ verwendet, wenn er auf den Dialekt des angegebenen Namens angewendet wird.
z. B.
from sqlalchemy.types import String from sqlalchemy.dialects import mysql string_type = String() string_type = string_type.with_variant( mysql.VARCHAR(collation="foo"), "mysql", "mariadb" )
Die Variantenabbildung gibt an, dass dieser Typ, wenn er von einem bestimmten Dialekt interpretiert wird, stattdessen in den angegebenen Typ umgewandelt wird, anstatt den primären Typ zu verwenden.
Geändert in Version 2.0: Die Methode
TypeEngine.with_variant()arbeitet nun mit einemTypeEngine-Objekt "in place" und gibt eine Kopie des ursprünglichen Typs zurück, anstatt ein Wrapper-Objekt zurückzugeben; die KlasseVariantwird nicht mehr verwendet.- Parameter:
type_¶ – ein
TypeEngine, der als Variante vom Ursprungstyp ausgewählt wird, wenn ein Dialekt des angegebenen Namens verwendet wird.*dialect_names¶ –
ein oder mehrere Basisnamen des Dialekts, der diesen Typ verwendet. (d. h.
'postgresql','mysql'usw.)Geändert in Version 2.0: mehrere Dialektnamen können für eine Variante angegeben werden.
Siehe auch
Verwendung von "UPPERCASE"- und Backendspezifischen Typen für mehrere Backends - illustriert die Verwendung von
TypeEngine.with_variant().
-
method
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