【问题标题】:SQLAlchemy composite typeSQLAlchemy 复合类型
【发布时间】:2015-04-14 12:04:16
【问题描述】:

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

我想创建一个单独的类型,例如Amount 具有valuecurrency,然后能够重复引用它,并且可能在同一个类中多次引用:

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

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

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

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

【问题讨论】:

    标签: postgresql sqlalchemy psycopg2 composite-types


    【解决方案1】:

    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)
    

    【讨论】:

    • 注意:sqlalchemy_utils 的复合类型存在一个未解决的问题:github.com/kvesteri/sqlalchemy-utils/issues/319
    • 来自 sqlalchemy_utils 文档 - When you already have your database set up you should call register_composites() after you’ve set up all models.
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2013-07-16
    • 1970-01-01
    • 2014-03-10
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    相关资源
    最近更新 更多