2017-08-01 7 views
0

mixinパターンがDRYに便利ですが、シーケンスに問題があります。注、私はポストグルを使用しています。Sqlalchemy + Postgres:シーケンス付き合成/人工idミックスイン

私はアレムビアのマイグレーションを使用していますが、私はthis might not be possible right nowを理解していますが、--autogenerationがこのシーケンスで動作することを本当に欲しいと思います。しかし、それはORM識別子なしでシーケンスを設定するように見えますが、ダウングレードを実行したい場合は、シーケンスが後で削除されるのを防ぎます。

グーグルでは、some explanation on how to properly setup a sequenceが見つかりました。基本的には、idとそのシーケンスを区切ります。

現在のコードは、ビットのようになります。上記のコード、私は非有用なエラーで終了して

import sqlalchemy as sa 
from sqlalchemy.ext.declarative import declared_attr 

class AutoIdMixin(object): 
    """Generates an synthetic identifier primary key. 
    """ 

    # See: http://docs.sqlalchemy.org/en/latest/core/defaults.html#associating-a-sequence-as-the-server-side-default 
    @declared_attr 
    def id_seq(cls): 
     bases = cls.__bases__ 
     Base = bases[0] 
     sequence_prefix = 'seq' 
     schema = cls._schema_name 
     sequence_id = '_'.join((sequence_prefix, schema, cls.__tablename__, 'id')) 
     sequence = sa.Sequence(sequence_id, 1, 1, metadata=Base.metadata) 
     return sequence 

    @declared_attr 
    def id(cls): 
     column_id = sa.Column(sa.types.Integer, cls.id_seq.next_value(), primary_key=True) 
     return column_id 

:RTM瞬間に

AttributeError: Neither 'next_value' object nor 'Comparator' object has an attribute '_set_parent_with_dispatch' 

答えて

0

、それは私のように見えますキーワードを逃した:server_default

@declared_attr 
    def id(cls): 
     sequence = cls.id_seq 
     column_id = sa.Column(sa.types.Integer, server_default=sequence.next_value(), primary_key=True) 
     return column_id 
関連する問題