On Feb 13, 2011, at 1:39 PM, Andrey Gladilin wrote:

> I am trying to create a version column which would use values from a
> single postgresql sequence.
> 
> record_versions_id_seq = Sequence('record_versions_id_seq')
> 
> class TimestampMixin(object):
>    created_at = Column(DateTime, default=func.now())
>    record_version = Column(Integer, nullable=False,
> default=func.nextval("record_versions_id_seq"))
> 
>    __mapper_args__ = {
>        'version_id_col': record_version,
>        'version_id_generator': lambda v:
> func.nextval("record_versions_id_seq")
>    }
> 
> class Team(Base, NameMixin, TimestampMixin):
>    __tablename__ = 'teams'
>    id = Column(Integer, primary_key=True)
> 
> There are other tables like Team inheriting TimestampMixin. And here I
> have two problems:
> 
> 1. Decribed code does not work for update. I.e when I update the
> record from Team, the record_version column value is not getting
> changed. So to workaround this problem I have to explicitly specify
> __mapper_args__ in Team class.

if Base or NameMixin is also modifying __mapper_args__, those will override 
what TimestampMixin returns.   The __mapper_args__ from different mixins need 
to be combined manually for the final product.  Some background at 
http://www.sqlalchemy.org/docs/orm/extensions/declarative.html#combining-table-mapper-arguments-from-multiple-mixins

> 2. Code lambda v: func.nextval("record_versions_id_seq") does not
> work. I guess this code is incorrect, so could you help me to create a
> correct one please?

you'd need to execute the function through a connection, and you can use the 
Sequence object directly:

        lambda v: some_engine.execute(record_versions_id_seq)


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to