Класс TypeEngine
Класс TypeEngine является фундаментом
всей системы типов данных в SQLAlchemy.
От него наследуются все конкретные типы,
которые используются при описании колонок
таблиц и при работе с типами на уровне
диалекта СУБД. Класс предоставляет
универсальный интерфейс для преобразования
значений Python в значения базы данных и
обратно, а также для генерации
SQL-представления типа. Параметров у самого
класса нет - он задаёт лишь общий контракт
для наследников.
Синтаксис
from sqlalchemy import TypeEngine
class MyType(TypeEngine):
pass
Пример
Давайте создадим собственный тип, унаследованный
от TypeEngine, и посмотрим, какой класс
является его родителем:
from sqlalchemy import TypeEngine
class MyType(TypeEngine):
pass
t = MyType()
print(type(t).__mro__[1].__name__)
Результат выполнения кода:
"TypeEngine"
Пример
Давайте используем конкретные типы, унаследованные
от TypeEngine, в колонках таблицы и проверим,
являются ли они экземплярами базового класса:
from sqlalchemy import Integer, String, TypeEngine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
print(isinstance(Article.__table__.c.id.type, TypeEngine))
print(isinstance(Article.__table__.c.title.type, TypeEngine))
Результат выполнения кода:
True
True
Пример
Давайте выведем SQL-представление типов колонок,
которые наследуются от TypeEngine:
from sqlalchemy import Integer, String
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
print(Article.__table__.c.id.type)
print(Article.__table__.c.title.type)
Результат выполнения кода:
INTEGER
VARCHAR(100)
Пример
Давайте создадим таблицу с типами, унаследованными
от TypeEngine, и скомпилируем SQL-запрос
создания таблицы:
from sqlalchemy import Integer, String, create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.schema import CreateTable
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(100))
status: Mapped[str] = mapped_column(String(20))
engine = create_engine('sqlite:///:memory:')
print(CreateTable(Article.__table__).compile(engine))
Итоговый SQL запрос:
CREATE TABLE articles (
id INTEGER NOT NULL,
title VARCHAR(100) NOT NULL,
status VARCHAR(20) NOT NULL,
PRIMARY KEY (id)
)
Смотрите также
-
класс
TypeEngine,
который является базовым классом всех типов -
метод
with_variant,
который создаёт вариант типа для другого диалекта -
метод
compile,
который компилирует тип в SQL-представление -
атрибут
python_type,
который возвращает Python-тип значения