Flask-SQLAlchemy'NoForeignKeysError'

时间:2019-12-18 09:05:17

标签: python sqlalchemy

我正在使用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)

Solved

2 个答案:

答案 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也可以复制该错误。我遍历了所有调用模型的模块,并发现了错误的模型导入。