Flask-SQLAlchemy:没有链接这些表的外键

Dir*_*uin 2 python sqlalchemy flask flask-sqlalchemy

我正在使用 Flask-SQLAlchemy 和以下内容models.py

class DomainRoot(db.Model):
    # Int/Float fields
    id      = db.Column(db.Integer, primary_key=True)

    # String fields
    domain  = db.Column(db.String(64), index=True, unique=True)

    # DateTime fields
    created = db.Column(db.DateTime)
    updated = db.Column(db.DateTime)

    # ForeignKey relationships
    domain_paths = db.relationship('DomainPath', backref='domain_root', lazy='dynamic')

    def __repr__(self):
        return '<DomainRoot %r>' % (self.domain)

class DomainPath(db.Model):
    # Int/Float fields
    id          = db.Column(db.Integer, primary_key=True)

    # String fields
    domain_path = db.Column(db.String(256), index=True, unique=True)

    # DateTime fields
    created     = db.Column(db.DateTime)
    updated     = db.Column(db.DateTime)

    # ForeignKey fields
    domainroot_id = db.Column(db.Integer, db.ForeignKey('domainroot.id'))

    def __repr__(self):
        return '<DomainPath %r>' % (self.domain_path)
Run Code Online (Sandbox Code Playgroud)

当我尝试查询 DomainRoot 对象时,出现错误:

InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship DomainRoot.domain_paths - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression.
Run Code Online (Sandbox Code Playgroud)

据我所知,我已经添加了正确的外键字段。

我在这里做错了什么?

dav*_*ism 6

Flask-SQLAlchemy 自动生成domain_root带有下划线的表名。你指的domainroot不带下划线。

一般来说,在同一模型中定义 fk 和关系更容易,并避免使用字符串引用。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class DomainRoot(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class DomainPath(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    root_id = db.Column(db.ForeignKey(DomainRoot.id))
    root = db.relationship(DomainRoot, backref='paths')

db.create_all()
db.session.add(DomainRoot(paths=[DomainPath(), DomainPath()]))
db.session.commit()
print(DomainRoot.query.get(1).paths)
Run Code Online (Sandbox Code Playgroud)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class DomainRoot(db.Model):
    id = db.Column(db.Integer, primary_key=True)

class DomainPath(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    root_id = db.Column(db.ForeignKey(DomainRoot.id))
    root = db.relationship(DomainRoot, backref='paths')

db.create_all()
db.session.add(DomainRoot(paths=[DomainPath(), DomainPath()]))
db.session.commit()
print(DomainRoot.query.get(1).paths)
Run Code Online (Sandbox Code Playgroud)