1

这是我的 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)
4

2 回答 2

1

你知道,主键是一个自动递增的整数通常是最好的方法。任何在系统中似乎是唯一的值,将来可能会被复制。如果您依赖它们的独特性,您将陷入困境。

但是,如果有理由要求每行中的某些值对(或三重)是唯一的,只需向表中添加约束,但使用自增整数作为主键。然后,如果需求发生变化,您可以更改/删除/放松您的独特约束,而无需在其他地方进行更改。

另外 - 如果您使用简单的整数键,则您的连接更简单,并且可以通过 DBMS 更快地执行。

于 2012-08-30T10:37:57.207 回答
0

我想我想出了一个好主意。只需在__tableargs __成员中创建复杂的外键结构,如 (parent_id_string, uid) 和 (insert_after_item_id, uid),相应地修改 primaryjoin 语句

于 2012-08-30T10:34:37.957 回答