我正在使用Flask-SQLAlchemy扩展进行数据库交互的Flask应用程序。由于我有多个应用程序在同一个数据库上编写,因此我遇到了SQLite的并发问题,我想改用PostgreSQL。我可以在新数据库上创建表而不会出现问题,并且pgAdmin可以显示表和列。
# working
def createTables():
with app.app_context():
from models import User, Invoice
db.create_all()
但是在添加用户时,我现在遇到一个错误:sqlalchemy.exc.NoForeignKeysError
尽管我认为我在模型中基于documentation声明了一对多关系,我收到一个错误消息,指出“没有链接这些表的外键。”
# not working
def create_test_user():
with app.app_context():
user = User(
username="Bob",
email="bob@email.com",
password="test"
)
db.session.add(user)
db.session.commit()
完整的错误消息:
""" NoForeignKeysError: Could not determine join condition between parent/child tables on relationship User.invoices
- there are no foreign keys linking these tables.
Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. """
我不知道是什么原因导致了错误。我的模型缺少什么?
# models.py
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
invoices = db.relationship('Invoice', backref='user', lazy=True)
class Invoice(db.Model):
__tablename__ = "invoice"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
amount = db.Column(db.Integer, nullable=False)
答案 0 :(得分:1)
您的代码对我有用。也许您需要重新创建表或类似的表。为了确保我们具有相同的代码:我已经测试了以下代码:
class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
invoices = db.relationship('Invoice', backref='user', lazy=True)
class Invoice(db.Model):
__tablename__ = "invoice"
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
amount = db.Column(db.Integer, nullable=False)
在路线上:
user = User(
username="Bob",
email="bob@email.com",
password="test"
)
db.session.add(user)
db.session.commit()
print(user)
答案 1 :(得分:0)
我终于解决了问题,这不是我要找的地方。由于在初始化应用程序时导入了错误的模型文件,因此出现了NoForeignKeysError。我导入的模块之一是调用了错误/旧版本的模型。我猜这导致实际模型中的表关系中断。
当我逐步进行create_test_user()时,我注意到该错误实际上是在类创建期间发生的,甚至在到达db.session.add之前,并且即使没有DB也可以复制该错误。我遍历了所有调用模型的模块,并发现了错误的模型导入。