gpt4 book ai didi

postgresql - SQLAlchemy 复合类型

转载 作者:行者123 更新时间:2023-11-29 11:30:02 27 4
gpt4 key购买 nike

SQLAlchemy 是否支持 PostgreSQL 的复合类型 (http://www.postgresql.org/docs/devel/static/rowtypes.html)?我发现它有类似的东西 (sqlalchemy.orm.composite),但据我所知,它对我的​​目的来说还不够好。

我想做一个单独的类型,例如 Amountvaluecurrency,然后可以引用它重复,并且可能多次来自同一类:

class Transfer(base):
__tablename__ = "transfer"
source_amount = Column(Amount)
target_amount = Column(Amount)

我见过的所有示例(例如 this one)都要求我指定列的名称,这使得上述方法不可能(列名称会冲突)。

此外,我宁愿每个金额有一列而不是两列(因为 value 如果没有 currency 就没有多大意义,我宁愿数据库注意不要将它们分开或混合)。看来 Postgres 可以做到这一点,我只需要一种方法来向 SQLAlchemy 解释我需要什么。我试着阅读 http://docs.sqlalchemy.org/en/latest/core/custom_types.html ,但它似乎专注于扩充现有类型,而不是创建新类型作为复合类型(我不知道在 impl 下放什么)。

也许我应该放弃 SQLAlchemy 并直接与 psycopg2 通信?它有一个 psycopg2.extras.register_composite 函数,但是一旦我这样做了,我仍然不知道如何说服 SQLAlchemy 识别注册。我可能不得不以某种方式将光标从 psycopg2 传递到 SQLAlchemy,但我不知道该怎么做。

最佳答案

SQLalchemy 本身不支持 postgresql 复合类型。

然而,sqlalchemy_utils原生支持 postgresql 复合类型。

这是他们文档中的示例:

from collections import OrderedDict

import sqlalchemy as sa
from sqlalchemy_utils import CompositeType, CurrencyType

class Account(Base):
__tablename__ = 'account'
id = sa.Column(sa.Integer, primary_key=True)
balance = sa.Column(
CompositeType(
'money_type',
[
sa.Column('currency', CurrencyType),
sa.Column('amount', sa.Integer)
]
)
)

用法:

session.query(Account).filter(Account.balance.amount > 5000)

关于postgresql - SQLAlchemy 复合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29626830/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com