【问题标题】:Flask-SqlAlchemy composite key one to many relationship Sql ServerFlask-SqlAlchemy 复合键一对多关系Sql Server
【发布时间】:2020-06-15 21:48:49
【问题描述】:

我目前遇到一个错误,我正在使用 sql server 并尝试使用一组子项对一个简单的父项进行建模:

sqlalchemy.exc.NoForeignKeysError: 无法确定连接条件 父/子表之间的关系 Parent.children- 没有 链接这些表的外键。确保引用列 与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定一个 'primaryjoin' 表达式。

我的课程设置如下:

class Parent(db.Model):
    __tablename__ = "parent"
    parentId = db.Column(db.Integer, primary_key=True)
    parentVersion = db.Column(db.Integer, primary_key=True)
    children = db.relationship('Child', backref="parent",lazy=True)


class Child(db.Model):
    __tablename__ = "child"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(512), nullable=False)

    parentId = db.Column(db.Integer, nullable=False)
    parentVersion = db.Column(db.Integer, nullable=False)
    ForeignKeyConstraint(['parentId', 'parentVersion'], ['parent.parentId', 'parent.parentVersion']

我尝试过以多种方式声明关系和外键,但总是出错,正确的方法是什么?

【问题讨论】:

    标签: sql-server-2012 sqlalchemy flask-sqlalchemy


    【解决方案1】:

    您忘记添加外键:

    parentId = db.Column(db.Integer, db.ForeignKey("parent.id))
    

    有很多documentation material regarding this topic,如果还有什么不清楚的地方。

    【讨论】:

    • 当我尝试这样做时,它给了我一个错误,说它找不到要引用的外键,我认为这是因为父表具有复合主键?
    • 我阅读了您链接的文档,似乎语法适用于单列而不是复合外键。我的 foreignkeyconstraint 语法不正确吗?
    【解决方案2】:

    您缺少将 ForeignKeyConstraint 添加到表 args 中,并且您使用的是驼峰式大小写,而不是蛇形大小写。而且你不需要 __tablename__ 和 Flask-SQLAlchemy。

    试试:

    class Parent(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        version = db.Column(db.Integer, primary_key=True)
        children = db.relationship('Child', backref="parent", lazy=True)
    
    class Child(db.Model):
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(512), nullable=False)
    
        parent_id = db.Column(db.Integer, nullable=False)
        parent_version = db.Column(db.Integer, nullable=False)
        __table_args__ = (
        db.ForeignKeyConstraint(
                ['parent_id', 'parent_version'],
                ['parent.id', 'parent.version']
            ),
        )
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 2021-08-31
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      相关资源
      最近更新 更多