背景: 我正在使用通过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脚本来联接表并复制每个新的主键。