【发布时间】:2015-08-30 15:13:26
【问题描述】:
我有一个如下所示的课程:
class Foo(Base):
pk = Column(Integer, Sequence('foo'), primary_key=True)
我想创建另一个字段ref,对于新创建的对象,它默认等于pk。不幸的是,我使用的是 Postgres,它有一个 non-standard nextval() function,所以我不能简单地将两列都设为 Sequence 对象。
这是我目前的解决方案:
class Foo(Base):
pk = Column(Integer, Sequence('foo'), primary_key=True)
ref = Column(Integer, index=True, nullable=False, default=func.currval('foo'))
但这取决于两件事:SQLAlchemy 在ref 之前生成带有pk 的INSERT 语句,和 Postgres 从左到右评估表达式(因此@987654330 生成的nextval() 调用@ 总是发生在由ref 生成的currval 调用之前)。
对于如何更好地做到这一点的任何建议,我将不胜感激!
编辑:还有设置default=-1 或其他东西并强制调用者更新ref 字段的更多解决方案。这对 SQLA/Postgres 语义的更改更安全、更健壮,但对于该类的客户来说非常不方便。
【问题讨论】:
-
这解决了什么问题?您是否正在制作“层次结构”架构?
-
我们正在引入对象的版本控制,需要保持与旧版本客户端应用的兼容性。
-
我不确定我是否理解两者之间的关系。
Foo.ref是否“指向”Foo中的另一个元组?连接是什么意思?怎么查询? -
我很欣赏您在这里解决更大问题的冲动,但它涉及到相当多的上下文来解释,我们已经在探索一堆不同的替代方案。我真的很想知道是否有办法让 SQLAlchemy 引用相同的序列 nextval 两次。
标签: python postgresql sqlalchemy primary-key