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'