![](/img/trans.png)
[英]Set up a composite key using a foreign key and another column with Python/sqlAlchemy
[英]How to set up complex condition composite foreign key in SQLAlchemy
这是我的ORM实体类。 主键是复合原因,因为“ id_string”对于不同的用户可能是相同的(由uid标识)。 根据此类创建表时,我从Postgres SQL错误中了解到一件事(
ProgrammingError: (ProgrammingError) there is no unique constraint matching given keys for referenced table "sync_entities"
)是我需要在parent_id_string的ForeignKey()参数中添加一些内容。 我认为这是当前记录的uid。
您是否建议尝试使用其他主键(自动递增整数)或其他方法?
class SyncEntity(Base):
__tablename__ = 'sync_entities'
__table_args__ = (ForeignKeyConstraint(['uid'], ['users.uid'], ondelete='CASCADE'), {})
uid = Column(BigInteger, primary_key=True)
id_string = Column(String, primary_key=True)
parent_id_string = Column(String, ForeignKey('sync_entities.id_string'))
children = relation('SyncEntity',
primaryjoin=('sync_entities.c.id_string==sync_entities.c.parent_id_string'),
backref=backref('parent', \
remote_side=[id_string]))
# old_parent_id = ...
version = Column(BigInteger)
mtime = Column(BigInteger)
ctime = Column(BigInteger)
name = Column(String)
non_unique_name = Column(String)
sync_timestamp = Column(BigInteger)
server_defined_unique_tag = Column(String)
position_in_parent = Column(BigInteger)
insert_after_item_id = Column(String, ForeignKey('sync_entities.id_string'))
insert_after = relation('SyncEntity',
primaryjoin=('sync_entities.c.id_string==sync_entities.c.insert_after_item_id'),
remote_side=[id_string])
deleted = Column(Boolean)
originator_cache_guid = Column(String)
originator_client_item_id = Column(String)
specifics = Column(LargeBinary)
folder = Column(Boolean)
client_defined_unique_tag = Column(String)
ordinal_in_parent = Column(LargeBinary)
您知道,主键是一个自动递增的整数通常是最好的方法。 系统中似乎唯一的任何值都可能会在将来重复。 如果您依赖于它们的独特性,那么您将陷入困境。
但是,如果有理由要求每行中的某些值对(或三对值)是唯一的,则只需向表中添加约束,但可以使用自动递增整数作为主键。 然后,如果需求发生变化,您可以更改/删除/放松唯一约束,而无需在其他地方进行更改。
另外-如果您使用的是简单的整数键,则连接会更简单,并且DBMS可以更快地执行。
我想我想到了一个好主意。 只需在__ tableargs __成员中创建复杂的外键构造,例如(parent_id_string,uid)和(insert_after_item_id,uid),并相应地修改primaryjoin语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.