在 SQLAlchemy Flask 中创建对象时出现 NoForeignKeysError

Posted

技术标签:

【中文标题】在 SQLAlchemy Flask 中创建对象时出现 NoForeignKeysError【英文标题】:NoForeignKeysError when creating object in SQLAlchemy Flask 【发布时间】:2021-12-16 14:01:28 【问题描述】:

我是 SQLAlchemy 的初学者,我刚刚为 Flask 应用程序创建了第一个 modules.py 文件。但是,在主应用程序中,当我尝试创建两个 user 类型的对象时:

from models import user_presence,User,Activity_Presence
db.create_all()
u1 = User()
u2 = User()

我收到错误消息:sqlalchemy.exc.NoForeignKeysError: Can't find any foreign key relationships between 'activity_presence' and 'User_Presence'. 我尝试按照官方教程进行操作,但我不明白为什么外键关系存在问题。我还尝试添加更多字段,将对象添加到关系中,但我就是不知道问题出在哪里。如果您有任何想法,我将不胜感激。对不起,如果问题太多是初学者的问题。

from api import db

user_presence = db.Table('User_Presence',
                db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
                db.Column('presence_id', db.Integer, db.ForeignKey('Activity_Presence.id'), primary_key=True)
                )

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    presence_activ= db.relationship('Activity_Presence', secondary=user_presence, lazy='subquery',
                           backref=db.backref('users', lazy=True))

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

【问题讨论】:

【参考方案1】:

错误在于引用了错误的表名。 代表模型的类的通常命名以驼峰命名。然后将此名称转换为蛇形以提供表名。如果你应该在你的类名中使用下划线,它将被保留,并为任何后续的大写字母添加另一个。

举个例子:

class ActivityPresence(db.Model):
    __tablename__ = 'activity_presence'
class Activity_Presence(db.Model):
    __tablename__ = 'activity__presence'

所以工作代码如下。

user_presence = db.Table('user_presence',
    db.Column('user_id', db.Integer, db.ForeignKey('user.id'), primary_key=True),
    db.Column('presence_id', db.Integer, db.ForeignKey('activity_presence.id'), primary_key=True)
)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    presence_activ= db.relationship('ActivityPresence',
        secondary=user_presence,
        lazy='subquery',
        backref=db.backref('users', lazy=True))

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

【讨论】:

为什么要在这里做两次backref? backref=db.backref('users', lazy=True)) @Ndrslmpk 请求者希望提供仅特定于放置“backref”的一侧的参数。在这种情况下,db.backref 用于定义“惰性”参数。有关更详细的说明,请参阅here。

以上是关于在 SQLAlchemy Flask 中创建对象时出现 NoForeignKeysError的主要内容,如果未能解决你的问题,请参考以下文章

使用flask-restplus在flask-SQLAlchemy中创建多对多关联表时出错

Flask 和 SQLAlchemy 在 PostgreSQL 的事务连接中导致大量 IDLE

Flask 学习-13.Flask-SQLAlchemy 新建模型和字段

在 SQLAlchemy 中创建类似集合的映射属性

SqlAlchemy 和 Flask,如何查询多对多关系

Flask SQLAlchemy NOT NULL 约束在主键上失败