2015-04-14 86 views
4

SQLAlchemy是否支持PostgreSQL的複合類型(http://www.postgresql.org/docs/devel/static/rowtypes.html)?我發現它有類似的東西(sqlalchemy.orm.composite),但據我所知,這對我的目的不夠好。SQLAlchemy複合類型

我想製作一個單獨的類型,例如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,但我不知道該怎麼做。

回答

0

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)