假设我有2个表,其中1个表存储一些房屋,而1个表只存储出售的房屋,因此我具有一对一的关系,我编写的代码如下所示(实际名称已更改,并删除了无用的列以显示此示例):
class Houses(db.Model):
__tablename__ = 'Houses'
PropertyID = db.Column(db.Integer, primary_key=True, autoincrement=False, nullable=False),
StateID = db.Column(db.Integer, primary_key=True, autoincrement=False, nullable=False)
OtherFields = db.Column(db.String(255), nullable=False)
class SoldHouses(db.Model):
__tablename__ = 'SoldHouses'
PropertyID = db.Column(db.Integer, db.ForeignKey('Houses.PropertyID'), primary_key=True, nullable=False)
StateID = db.Column(db.Integer, db.ForeignKey('Houses.StateID'), primary_key=True, nullable=False)
我已经使用Flask-Script(https://flask-migrate.readthedocs.io/en/latest/)并在运行后(之前已经运行过init)正确设置了迁移:
python Models.py db migrate
python Models.py db upgrade
我收到以下错误:
pyodbc.ProgrammingError :(“ 42000”,“ [42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]没有主键或候选键 在参考表“ Houses”中与参考匹配的 外键“ FK__Unas__Marke__7C4F7684”中的“列”列表。 (1776)(SQLExecDirectW); [42000] [Microsoft] [SQL Server本机客户端 11.0] [SQL Server]无法创建约束或索引。请参阅先前的错误。 (1750)“)
我是否正确创建外键或发生了什么?
编辑:我已按照用户van的建议将此代码添加到我的SoldHouses表中,但是却出现了完全相同的错误:
__table_args__ = (
db.ForeignKeyConstraint(
['PropertyID', 'StateID'],
['Houses.PropertyID', 'Houses.StateID'],
),
)
这是完整的错误消息:
sqlalchemy.exc.ProgrammingError:(pyodbc.ProgrammingError)('42000', “ [42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server] 在所引用的表“ Houses”中没有主键或候选键 匹配外键中的引用列列表 'FK__SoldHouse__Prope__1A14E395'。 (1776)(SQLExecDirectW); [42000] [Microsoft] [SQL Server Native Client 11.0] [SQL Server]无法创建 约束或索引。请参阅先前的错误。 (1750)“)[SQL:'\ nCREATE 表格[SoldHouses](\ n \ t [PropertyID] INTEGER NOT NULL,\ n \ t [StateID] INTEGER NOT NULL,\ n \ tPRIMARY KEY([PropertyID],[StateID]), \ n \ tFOREIGN KEY([PropertyID])参考[房屋]([PropertyID]), \ n \ tFOREIGN KEY([StateID])参考[房屋]([StateID])\ n)\ n \ n'] (此错误的背景位于:http://sqlalche.me/e/f405)
最终编辑: 在表的类定义中,还必须删除'db.ForeignKey()'属性,以使代码起作用! (仅将外键约束保留在_table_args_中)