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)
据我所知,我已经添加了正确的外键字段。
我在这里做错了什么?
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)
| 归档时间: |
|
| 查看次数: |
5604 次 |
| 最近记录: |