【问题标题】:NoForeignKeysError when creating object in SQLAlchemy Flask在 SQLAlchemy Flask 中创建对象时出现 NoForeignKeysError
【发布时间】: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)

【问题讨论】:

    标签: python flask sqlalchemy foreign-keys backend


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2020-08-06
    • 2014-12-25
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多