Base Type API

Objektname Beschreibung

Concatenable

Ein Mixin, der einen Typ als für die „Verkettung“ (typischerweise von Strings) unterstützend markiert.

ExternalType

Mixin, der Attribute und Verhaltensweisen definiert, die spezifisch für Datentypen von Drittanbietern sind.

Indexierbar

Ein Mixin, der einen Typ als für Indexoperationen (wie Array- oder JSON-Strukturen) unterstützend markiert.

NullType

Ein unbekannter Typ.

TypeEngine

Die ultimative Basisklasse für alle SQL-Datentypen.

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.

class sqlalchemy.types.TypeEngine

Die ultimative Basisklasse für alle SQL-Datentypen.

Zu den gängigen Unterklassen von TypeEngine gehören String, Integer und Boolean.

Eine Übersicht über das SQLAlchemy-Typensystem finden Sie unter SQL-Datentypobjekte.

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.

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 NotImplementedError aus.

Das Überschreiben dieser Methode in einer Unterklasse kann es ermöglichen, allgemeines Verhalten auf alle Operationen anzuwenden. Zum Beispiel, das Überschreiben von ColumnOperators, um func.lower() auf die linke und rechte Seite anzuwenden

class MyComparator(ColumnOperators):
    def operate(self, op, other, **kwargs):
        return op(func.lower(self), func.lower(other), **kwargs)
Parameter:
  • op – Operator aufrufbar.

  • *other – die „andere“ Seite der Operation. Wird für die meisten Operationen ein einzelner Skalar sein.

  • **kwargs – Modifikatoren. Diese können von speziellen Operatoren wie ColumnOperators.contains() übergeben werden.

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 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 dem DDLEvents.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 alternative TypeEngine.bind_expression()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit die UserDefinedType-Klasse.

Um ein alternatives Verhalten für TypeEngine.bind_expression() bereitzustellen, implementieren Sie eine TypeDecorator-Klasse und stellen Sie eine Implementierung von TypeDecorator.bind_expression() bereit.

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 None zurü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 alternative TypeEngine.bind_processor()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit die UserDefinedType-Klasse.

Um ein alternatives Verhalten für TypeEngine.bind_processor() bereitzustellen, implementieren Sie eine TypeDecorator-Klasse und stellen Sie eine Implementierung von TypeDecorator.process_bind_param() bereit.

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 TypeDecorator erfolgen, 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 Methode TypeDecorator.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 alternative TypeEngine.column_expression()-Methode bereitzustellen, es sei denn, Sie unterklassen explizit die UserDefinedType-Klasse.

Um ein alternatives Verhalten für TypeEngine.column_expression() bereitzustellen, implementieren Sie eine TypeDecorator-Klasse und stellen Sie eine Implementierung von TypeDecorator.column_expression() bereit.

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.

Parameter:

dialect – eine Instanz von Dialect.

method sqlalchemy.types.TypeEngine.dialect_impl(dialect: Dialect) TypeEngine[_T]

Gibt eine dialektspezifische Implementierung für diesen TypeEngine zurück.

method sqlalchemy.types.TypeEngine.evaluates_none() Self

Gibt eine Kopie dieses Typs zurück, bei der das Flag should_evaluate_none auf 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 None in 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 null SQL-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 an Column.default oder Column.server_default übergeben wird; in diesen Fällen bedeutet None immer 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 alternative TypeEngine.literal_processor()-Methode bereitzustellen, es sei denn, die UserDefinedType-Klasse wird explizit unterklassiert.

Um ein alternatives Verhalten für TypeEngine.literal_processor() bereitzustellen, implementieren Sie eine TypeDecorator-Klasse und stellen Sie eine Implementierung von TypeDecorator.process_literal_param() bereit.

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 NotImplementedError ausgelöst.

Beachten Sie, dass jeder Typ auch NULL in SQL unterstützt, was bedeutet, dass Sie in der Praxis auch von jedem Typ None zurü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

BindTyping

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 None zurü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 alternative TypeEngine.result_processor()-Methode bereitzustellen, es sei denn, die UserDefinedType-Klasse wird explizit unterklassiert.

Um ein alternatives Verhalten für TypeEngine.result_processor() bereitzustellen, implementieren Sie eine TypeDecorator-Klasse und stellen Sie eine Implementierung von TypeDecorator.process_result_value() bereit.

Parameter:
  • dialect – Der verwendete Dialekt-Instanz.

  • coltype – DBAPI coltype Argument, das im cursor.description empfangen wurde.

attribute sqlalchemy.types.TypeEngine.should_evaluate_none: bool = False

Wenn True, wird die Python-Konstante None von diesem Typ explizit behandelt.

Das ORM verwendet dieses Flag, um anzuzeigen, dass ein positiver Wert von None in 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().

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 None bedeutet, 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 einem TypeEngine-Objekt "in place" und gibt eine Kopie des ursprünglichen Typs zurück, anstatt ein Wrapper-Objekt zurückzugeben; die Klasse Variant wird 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.

class sqlalchemy.types.Concatenable

Ein Mixin, der einen Typ als für die „Verkettung“ (typischerweise von Strings) unterstützend markiert.

Mitglieder

comparator_factory

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

comparator_factory

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.

NullType wird als Standardtyp für Fälle verwendet, in denen ein Typ nicht bestimmt werden kann, einschließlich

  • Während der Tabellenreflexion, wenn der Typ einer Spalte vom Dialect nicht erkannt wird

  • Beim Erstellen von SQL-Ausdrücken mit einfachen Python-Objekten unbekannter Typen (z. B. somecolumn == my_special_object)

  • Wenn eine neue Column erstellt wird und der angegebene Typ als None übergeben wird oder gar nicht angegeben wird.

Die NullType kann problemlos innerhalb von SQL-Ausdrucksaufrufen verwendet werden. Sie hat weder auf der Ebene der Ausdruckserstellung noch auf der Ebene der Bindungs-/Ergebnisverarbeitung ein Verhalten. NullType führt zu einem CompileError, wenn der Compiler aufgefordert wird, den Typ selbst zu rendern, z. B. wenn er in einer cast()-Operation oder innerhalb einer Schemaerstellungsoperation verwendet wird, wie sie von MetaData.create_all() oder dem CreateTable-Konstrukt aufgerufen wird.

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 TypeDecorator und UserDefinedType.

Neu in Version 1.4.28.

Mitglieder

cache_ok

Klassensignatur

class sqlalchemy.types.ExternalType (sqlalchemy.types.TypeEngineMixin)

attribute sqlalchemy.types.ExternalType.cache_ok: bool | None = None

Zeigt an, ob Anweisungen, die diesen ExternalType verwenden, "sicher zu cachen" sind.

Der Standardwert None löst eine Warnung aus und erlaubt dann nicht das Caching einer Anweisung, die diesen Typ enthält. Setzen Sie auf False, um das Caching von Anweisungen, die diesen Typ verwenden, ohne Warnung vollständig zu deaktivieren. Wenn auf True gesetzt, werden die Klasse des Objekts und die ausgewählten Elemente seines Zustands als Teil des Cache-Schlüssels verwendet. Zum Beispiel die Verwendung eines TypeDecorator

class 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_ok hinzugefügt, um eine gewisse Konfigurierbarkeit des Cachings für TypeDecorator-Klassen zu ermöglichen.

Neu in Version 1.4.28: - die Mixin ExternalType hinzugefügt, die das Flag cache_ok sowohl für die Klassen TypeDecorator als auch für UserDefinedType verallgemeinert.

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

with_variant()

method sqlalchemy.types.Variant.with_variant(type_: _TypeEngineArgument[Any], *dialect_names: str) Self

geerbt von der Methode TypeEngine.with_variant() der Klasse TypeEngine

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 einem TypeEngine-Objekt "in place" und gibt eine Kopie des ursprünglichen Typs zurück, anstatt ein Wrapper-Objekt zurückzugeben; die Klasse Variant wird 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.