Flask SQLAlchemy与复合主键一对一关系

时间:2018-09-12 15:03:25

标签: python sqlalchemy flask-sqlalchemy

假设我有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_中)

0 个答案:

没有答案