sqlalchemy python使用外键约束更新主键

sqlalchemy python使用外键约束更新主键,sqlalchemy,constraints,restriction,Sqlalchemy,Constraints,Restriction,我需要在同时具有外键约束的多个表中更改主键。我想要么更新,要么用更新的主键复制条目并删除旧条目。我怎样才能做到这两点呢 下面是我的表的最小工作设置。P和S依赖于S的主键,S依赖于H的主键 我需要为一个条目更新ever表的a值。由于这些限制,我在更改值方面一直受到限制。我宁愿不删除这些限制,这样就可以成为以后使用的永久解决方案 class H(Base): __tablename__ = 'ch' a = Column(String(255), nullable=False, pr

我需要在同时具有外键约束的多个表中更改主键。我想要么更新,要么用更新的主键复制条目并删除旧条目。我怎样才能做到这两点呢

下面是我的表的最小工作设置。P和S依赖于S的主键,S依赖于H的主键

我需要为一个条目更新ever表的a值。由于这些限制,我在更改值方面一直受到限制。我宁愿不删除这些限制,这样就可以成为以后使用的永久解决方案

class H(Base):
    __tablename__ = 'ch'
    a = Column(String(255), nullable=False, primary_key=True)
    other_columns = Column(String(255))

class S(Base):
    __tablename__ = 'cs'
    a = Column(String(255), ForeignKey('ch.a'), nullable=False, primary_key=True)
    sn = Column(Integer, nullable=False, primary_key=True)
    other_columns = Column(Date)
    header = relationship("H", backref=backref('cs', order_by=a, cascade='delete, all, delete-orphan'), foreign_keys='S.a')
    __table_args__ = (UniqueConstraint('a', 'sn', name='_a_sn_uc'),)

class P(Base):
    __tablename__ = 'cs_p'
    a = Column(String(255), nullable=False, primary_key=True)
    sn = Column(Integer, nullable=False, primary_key=True)
    ps = Column(Integer, nullable=False, primary_key=True)
    other_columns = Column(String(255))
    pa = relationship("S", backref=backref('cs_p', order_by=a, cascade='delete, all, delete-orphan'))
    __table_args__ = (UniqueConstraint('a', 'sn', 'ps', name='_a_sn_ps_uc'),
                      ForeignKeyConstraint([a, sn], [S.a, S.sn]),)

class F(Base):
    __tablename__ = 'cs_f'
    a = Column(String(255), nullable=False, primary_key=True)
    sn = Column(Integer, nullable=False, primary_key=True)
    fs = Column(Integer, nullable=False, primary_key=True)
    other_columns = Column(String(255))
    fa = relationship("S", backref=backref('cs_f', order_by=a, cascade='delete, all, delete-orphan'))
    __table_args__ = (UniqueConstraint('a', 'sn', 'fs', name='_a_sn_fs_uc'),
                      ForeignKeyConstraint([a, sn], [S.a, S.sn]),)

老实说,我不确定
sqlalchemy
是否允许您这样做,但是更新主键从来都不是一个好主意,不管实现如何。。。你能再详细介绍一下功能方面的情况吗?为什么要更新主键?Hi-Irnzcip,主键不是典型的递增id号。主键是物理项的数字描述。由于物理项必须具有唯一的编号,因此将其设置为主键。这有助于防止意外的重复数字和错误。缺点是输入的主键不正确,必须更改。我只想用一个新的主键将包含所有子表数据的条目复制到数据库中。然后删除不正确的条目及其所有子项数据。确定。你可以有一个主键策略,你可以选择一个递增的id或者键有意义。我一直称它们为技术性的或功能性的,但我一直在浏览来寻找一个例子,在谷歌上,你可以看到更多的自然和代理的结果。我理解你的问题,在你的情况下,我肯定会去技术或代理pk。这样,用户可以随时更改物理项的编号描述,而不会弄乱数据库。我不知道你是否能控制这个模型……如果你必须这样做,我在你的位置上要做的(不是真正考虑
orm
,而是考虑数据库本身)是:(1)处理旧的行,(2)创建一个新元素,复制所有的内容列,(3)更新相关对象的外键,(4)承诺一切