2017-08-01 2 views
0

J'ai trouvé le modèle de mixin pour être vraiment pratique pour rester au sec, mais j'ai des problèmes avec les séquences. Remarque, j'utilise postgres.Sqlalchemy + Postgres: id mixin synthétique/artificielle avec la séquence

Nous utilisons des migrations alambiques, et j'aimerais vraiment que le --autogeneration fonctionne avec cette séquence, bien que je comprenne this might not be possible right now. Toutefois, cela ressemble à la configuration de la séquence sans un identificateur ORM, ce qui empêche la suppression de la séquence plus tard si je voulais effectuer une rétrogradation.

Grâce à google, j'ai trouvé some explanation on how to properly setup a sequence. Essentiellement: sépare l'identifiant et sa séquence.

Code actuel ressemble un peu à ceci:

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 

Avec le code ci-dessus, je me retrouve avec une erreur non utile:

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

Répondre

0

Dans un moment RTM, il semble que je Mot de passe oublié: 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