gpt4 book ai didi

python - SQLAlchemy中如何设置复杂条件复合外键

转载 作者:行者123 更新时间:2023-11-29 13:35:48 24 4
gpt4 key购买 nike

这是我的 ORM 实体类。主键是复合的,因为 'id_string' 对于不同的用户可能是相同的(由 uid 标识)。我从 Postgres SQL error when creating a table based on this class (

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 更快地执行。

关于python - SQLAlchemy中如何设置复杂条件复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12194158/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com