Vek*_*eky 5 postgresql sqlalchemy psycopg2 composite-types
SQLAlchemy是否支持PostgreSQL的复合类型(http://www.postgresql.org/docs/devel/static/rowtypes.html)?我发现它有类似的东西(sqlalchemy.orm.composite),但据我所知,它对我的目的来说还不够好.
我想创建一个单独的类型,例如Amount有value和currency,然后能够重复引用它,并且可能多次从同一个类引用它:
class Transfer(base):
__tablename__ = "transfer"
source_amount = Column(Amount)
target_amount = Column(Amount)
Run Code Online (Sandbox Code Playgroud)
我见过的所有例子(例如这一个)都要求我指定列的名称,这使得上述方法不可能(列名称会发生冲突).
此外,我宁愿每个Amount有一个列而不是两个(因为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)
]
)
)
Run Code Online (Sandbox Code Playgroud)
用法:
session.query(Account).filter(Account.balance.amount > 5000)
Run Code Online (Sandbox Code Playgroud)