Flask SQLAlchemy 在包结构中排列代码时抛出"NoReferencedTableError"



我正在学习烧瓶,并尝试根据一些在线教程在"包结构"中排列我的代码。我整理了一些最小的代码来复制我的问题。 首先,我的代码的树结构是

.
└── test001
├── __init__.py
├── models.py
└── views.py

每个文件的源代码:

">__init__.py":

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SECRET_KEY'] = 'somerandomnumber'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
from test001 import views

">models.py"的来源:

from test001 import db,app
class User(db.Model):
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)
favoritejob_id = db.Column(db.Integer, db.ForeignKey('favoritejob.id'), nullable=True)
favoritejob    = db.relationship("FavoriteJob", backref=db.backref("users"), lazy=True)
class FavoriteJob(db.Model):
id   = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
def __repr__(self):
return f"<FavoriteJob ID={self.id} Name={self.name}>"

">views.py"的来源(将所有路线放在一起(:

from test001.models import User, FavoriteJob
# @app.route("/register", methods=['GET', 'POST'])
# def register():
#    PLACE HOLDER FOR USER REGISTRATION

使用上面的代码,然后我转到python3 shell和以下内容:

from test001 import db
db.create_all()

我收到以下错误:

---------------------------------------------------------------------------
NoReferencedTableError                    Traceback (most recent call last)
<ipython-input-2-653042798025> in <module>
----> 1 db.create_all()
...
...
~/.local/lib/python3.6/site-packages/sqlalchemy/sql/schema.py in column(self)
2045                     "foreign key to target column '%s'"
2046                     % (self.parent, tablekey, colname),
-> 2047                     tablekey,
2048                 )
2049             elif parenttable.key not in parenttable.metadata:
NoReferencedTableError: Foreign key associated with column 'user.favoritejob_id' could not find table 'favoritejob' with which to generate a foreign key to target column 'id'

我对此错误进行了大量搜索,但找不到 models.py 任何问题。然后我从 views.py 中删除了以下行,这使 views.py 成为空文件

from test001.models import User, FavoriteJob

然后"db.create_all(("开始工作。

但是,我不能 views.py 空,因为我会将所有视图/url 路由放在文件中,并且需要使用用户和收藏夹作业类。

我不知道为什么 views.py 中的导入行会导致 db.create_all(( 失败。我对烧瓶和 sqlalchemy 很陌生,如果我的设置有明显的问题,我很抱歉。我感谢您的帮助。

Flask-SQLAlchemy 从描述性基本模型中定义表名(除非您自己定义了一个(。如果型号名称是例如CamelCase,它将表名设置为camel_case,而不是camelcase

在模型定义中,User模型上有一个相关字段 -favoritejob_id,它与FavoriteJob模型相关(根据关系声明favoritejob(。由于FavoriteJob模型没有任何显式表名,因此 Flask-SQLAlchemy 会将其命名为favorite_job。但是您的相关字段定义具有:

db.ForeignKey('favoritejob.id')

由于表favoritejob不存在,因此您会收到错误(如预期的那样(。


您有几种选择来处理此问题:

  • 最简单的选择可能是重命名相关的表名:

    db.ForeignKey('favorite_job.id')
    
  • 或者将模型FavoriteJob表名称指定为favoritejob

    class FavoriteJob(db.Model):
    __tablename__ = 'favoritejob'
    

最新更新