PostgreSQL¶
Типы данных PostgreSQL и пользовательские конструкции SQL¶
Как и во всех диалектах SQLAlchemy, все типы UPPERCASE, которые, как известно, действительны в PostgreSQL, импортируются из диалекта верхнего уровня, независимо от того, происходят ли они из sqlalchemy.types
или из локального диалекта:
from sqlalchemy.dialects.postgresql import (
ARRAY,
BIGINT,
BIT,
BOOLEAN,
BYTEA,
CHAR,
CIDR,
DATE,
DOUBLE_PRECISION,
ENUM,
FLOAT,
HSTORE,
INET,
INTEGER,
INTERVAL,
JSON,
JSONB,
MACADDR,
MONEY,
NUMERIC,
OID,
REAL,
SMALLINT,
TEXT,
TIME,
TIMESTAMP,
UUID,
VARCHAR,
INT4RANGE,
INT8RANGE,
NUMRANGE,
DATERANGE,
TSRANGE,
TSTZRANGE,
TSVECTOR,
)
Ниже перечислены типы, специфичные для PostgreSQL или имеющие специфичные для PostgreSQL аргументы построения:
Типы диапазонов¶
Новые типы столбцов диапазонов, появившиеся в PostgreSQL 9.2 и далее, обслуживаются следующими типами:
Приведенные выше типы получают большую часть своей функциональности от следующего миксина:
Предупреждение
Поддержка диапазонных типов DDL должна работать с любым драйвером PostgreSQL DBAPI, однако возвращаемые типы данных могут отличаться. Если вы используете psycopg2
, рекомендуется перейти на версию 2.5 или более позднюю перед использованием этих типов столбцов.
При инстанцировании моделей, использующих эти типы столбцов, вы должны передавать любой тип данных, ожидаемый драйвером DBAPI, который вы используете для типа столбца. Для psycopg2
это psycopg2.extras.NumericRange
, psycopg2.extras.DateRange
, psycopg2.extras.DateTimeRange
и psycopg2.extras.DateTimeTZRange
или класс, который вы зарегистрировали psycopg2.extras.register_range
.
Например:
from psycopg2.extras import DateTimeRange
from sqlalchemy.dialects.postgresql import TSRANGE
class RoomBooking(Base):
__tablename__ = 'room_booking'
room = Column(Integer(), primary_key=True)
during = Column(TSRANGE())
booking = RoomBooking(
room=101,
during=DateTimeRange(datetime(2013, 3, 23), None)
)
Типы ограничений PostgreSQL¶
SQLAlchemy поддерживает ограничения PostgreSQL EXCLUDE с помощью класса ExcludeConstraint
:
Например:
from sqlalchemy.dialects.postgresql import ExcludeConstraint, TSRANGE
class RoomBooking(Base):
__tablename__ = "room_booking"
room = Column(Integer(), primary_key=True)
during = Column(TSRANGE())
__table_args__ = (ExcludeConstraint(("room", "="), ("during", "&&")),)