我正在学习烧瓶,并尝试根据一些在线教程在"包结构"中排列我的代码。我整理了一些最小的代码来复制我的问题。 首先,我的代码的树结构是
.
└── 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'