我正在尝试创建一个具有以下唯一组合的表:只能有一个条目具有 account_id
设定为 active
,但有多个相同的条目 account_id
在哪儿 active
设置为 False
,意味着这是一种可能性:
id | account_id | active | timestamp
0 | 12 | False | 2020-07-15 04:10:48.380781
1 | 12 | True | 2020-07-15 04:10:48.380781
2 | 12 | False |2020-07-15 04:10:48.380781
但这不能:
id | account_id | active | timestamp
0 | 12 | False |2020-07-15 04:10:48.380781
1 | 12 | True |2020-07-15 04:10:48.380781
2 | 12 | True |2020-07-15 04:10:48.380781
我打算使用部分索引来获得这个功能,但需要注意的是两者都是 account_id
以及 active
从泛型类继承。这些类如下所示:
class GenericClass:
id = Column(Integer, primary_key=True)
active = Column(Boolean, nullable=False,
doc='Whether this is active or not.'
@declared_attr # declared_attr decorator makes it like classmethod
def account_id(cls):
return Column(Integer, ForeignKey('account.account_id'))
这是我的实际table:
class AdvancedTable(Some.Model, GenericClass):
__versioned__ = {}
__table_args__ = (
Index('active_accid_index', 'account_id',
unique=True,
sqlite_where= GenericClass.active,
postgresql_where= GenericClass.active),
)
timestamp = Column(
DateTime, nullable=True, doc='DateTime this info was activated.')
但我得到以下错误: sqlalchemy.exc.CompileError: Cannot compile Column object until its 'name' is assigned.
有人能帮我实现我想要的功能而不需要 GenericClass
,(我同时使用postgresql和sqlite)?
1条答案
按热度按时间hgb9j2n61#
我相信通过将索引移到表定义之外,我成功地克服了这个问题。请参见下面的代码。相关部分突出显示。
sqlite的结果架构是: