如何更改表的主键和用alembic引用它的外键?

时间:2019-08-08 22:33:50

标签: python oracle sqlalchemy alembic

背景: 我正在使用通过SQLAlchemy ORM创建的Oracle数据库和表。

数据: 我的模式由一个主表(A)和一个带有varchar主键的表组成,多个表(B,C,D)具有指向表A主键的外键。表A与每个B,C,D之间的关系是一个-很多,表示每个表中的多个条目可以引用表A中的单个主键。

问题: 数据集具有超出表A的字符串主键的值,我想允许多个条目包含该字符串的重复项。为此,我计划向表A添加一个新的ID列(它是一个序列整数),并删除对旧主键的唯一约束。这意味着其他表不能再将其引用为外键。

问题: 我试图用alembic生成迁移脚本,但似乎没有办法在更改表后实际上在现有数据中保留一对多关系。 如何为现有数据生成新的唯一ID,然后将这些ID映射到其他表的外键列以保留现有的外键关系?

旧的ORM模型:

class TableA(db):
    __tablename__ = "A"
    string_id = Column(String(50), primary_key=True)
    children = relationship("B", cascade='all', backref='parent')
    # ...insert data here

class TableB(db):
    __tablename__ = "B"
    id = Column(Integer, Sequence('seq_0'), primary_key=True)
    a_id = Column(String(50), ForeignKey('A.STRING_ID'))
    # ...insert data here

新的ORM模型:

class TableA(db):
    __tablename__ = "A"
    id = Column(Integer, Sequence('seq_1'), primary_key=True)
    string = Column(String(50)) # this column will stay, but is no longer PK or unique
    children = relationship("B", cascade='all', backref='parent')
    # ...insert data here

class TableB(db):
    __tablename__ = "B"
    id = Column(Integer, Sequence('seq_0'), primary_key=True)
    a_id = Column(Integer, ForeignKey('A.ID'))
    # ...insert data here

如果这是重复的操作,我深表歉意,因为我确定我不是第一个遇到此问题的人,但是我找不到与我的问题有关的任何指南。

注意:我想同时进行其他迁移操作,这是使用Alembic的主要原因。我可能最终只是编写一个python脚本来联接表并复制每个新的主键。

0 个答案:

没有答案
相关问题