«Ни одна функция не соответствует данному имени и типам аргументов». при попытке вставить DateTimeTzRange с помощью SqlaPython

Программы на Python
Anonymous
«Ни одна функция не соответствует данному имени и типам аргументов». при попытке вставить DateTimeTzRange с помощью Sqla

Сообщение Anonymous »

У меня есть таблица базы данных Postgres 15, в ней есть два столбца (среди прочих), один имеет тип daterange, другой — tstzrange.
У нас есть код, который вставляется в эту таблицу с помощью чистого SQL (через ядро ​​sqlalchemy) путем преобразования sqlalchemy.dialects.postgresql.Range в psycopg2.extras.DateRange или psycopg2.extras.DateTimeTzRange. Это работает нормально.
Я пытаюсь подключить ORM Sqlalchemy, но получаю следующую ошибку при вызове commit() в своем сеансе:

sqlalchemy.exc.ProgrammingError: функция (psycopg2.errors.UndefineFunction)
daterange(временная метка с часовым поясом, неизвестно, неизвестно) не существует
СТРОКА 1: ...y.co.uk', '81740d75-d75a-4187-8b13-e28ac2e4dbf8', daterange(...
^
СОВЕТ: ни одна функция не соответствует данному имени и аргументу Вам может потребоваться добавить явное приведение типов.
[SQL: INSERT INTO "user" (user_id, имя пользователя, полное_имя, идентификатор_субъекта_поставщика, эффективный, подтвержденный) SELECT p0::VARCHAR, p1. ::VARCHAR, p2::VARCHAR, p3::VARCHAR, p4::DATERANGE, p5::TSTZRANGE FROM (VALUES (%(user_id__0)s, %(username__0)s, %(full_name__0)s, %(pro .. . 233 символа усечены ... en(p0, p1, p2, p3, p4, p5, sen_counter) ПОРЯДОК ПО sen_counter ВОЗВРАЩЕНИЕ "user".id, "user".id AS id__1]
[параметры: {' effect__0': DateRange(datetime.datetime(2024, 4, 30, 13, 43, 31, 985502, tzinfo=), None, '[)'), 'provider_subject_id__0': '81740d75-d75a-4187-8b13-e28ac2e4dbf8' , 'full_name__0': 'foo@example.com', 'user_id__0': '81740d75-d75a-4187-8b13-e28ac2e4dbf8', 'asserted__0': DateTimeTZRange(datetime.datetime(2024, 4, 30, 13, 43, 31) , 985513, tzinfo=), Нет, '[)'), 'username__0': 'foo@example.com', 'эффективный__1': DateRange(datetime.datetime(2024, 4, 30, 13, 43, 31, 985502) , tzinfo=), Нет, '[)'), 'provider_subject_id__1': '81740d75-d75a-4187-8b13-e28ac2e4dbf8', 'full_name__1': 'foo@example.com', 'user_id__1': '81740d75-d75a- 4187-8b13-e28ac2e4dbf8', 'asserted__1': DateTimeTZRange(datetime.datetime(2024, 4, 30, 13, 43, 31, 985513, tzinfo=), Нет, '[)'), 'username__1': 'foo@ example.com'}]
(История этой ошибки: https://sqlalche.me/e/20/f405)

Моя UserModel выглядит так:

Код: Выделить всё

class ModelBase(DeclarativeBase):
pass

class UserModel(ModelBase):
__tablename__ = "user"
id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[str] = mapped_column(String)
username: Mapped[str] = mapped_column(String)
full_name: Mapped[str] = mapped_column(String)
provider_subject_id: Mapped[str] = mapped_column(String)
effective: Mapped[DATERANGE] = Column(DATERANGE)
asserted: Mapped[TSTZRANGE] = Column(TSTZRANGE)
Таблица пользователей определяется следующим образом:

Код: Выделить всё

from sqlalchemy import MetaData

metadata_obj = MetaData()

Table("user", metadata_obj,
Column("id", PRIMARY_KEY_TYPE, primary_key=True),
Column("user_id", data_types.CODE_TYPE, nullable=False),
Column("role", data_types.CODE_TYPE, nullable=True),
Column("username", data_types.CODE_TYPE, nullable=False),
Column("full_name", data_types.SHORT_FIXED_STRING_TYPE, nullable=False),
Column("provider_subject_id", data_types.CODE_TYPE, nullable=True),
Column("effective", DATERANGE, nullable=False),
Column("asserted", TSTZRANGE, nullable=False)
)
Я получаю вышеуказанную ошибку, когда пытаюсь зафиксировать сеанс, например:

Код: Выделить всё

session = session_factory()

user = UserModel(
# ...
asserted = DateTimeTZRange(asserted_value.lower, asserted_value.upper, bounds=asserted_value.bounds)
effective = DateRange(effective_value.lower, effective_value.upper, bounds=effective_value.bounds)
)

session.add(user)
session.commit() #💥

Итак, моя интуиция подсказывает, что это должно работать, потому что оно работает с необработанным SQL, но я также являюсь пользователем python/sqlalchemy/postgres n00b, так что мне делать знаю.
Моя интуиция также думает, что мне не хватает какого-то особенного картографического соуса, но опять же... что я знаю?

Подробнее здесь: https://stackoverflow.com/questions/784 ... o-insert-a

Вернуться в «Python»