在 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