我正在学习flask,并试图根据一些在线教程将代码安排在“包结构”中。我已经整理了一些最小的代码来复制我的问题。 首先,我的代码的树结构是
.
└── test001
├── __init__.py
├── models.py
└── views.py
每个文件的源代码:
“\uuuu init\uuuu.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}>"
“视图.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路由放在文件中,并且需要使用User和FavoriteJob类
我不明白为什么views.py中的导入行会导致db.create_all()失败。我对flask和sqlalchemy很陌生,如果我的设置有明显的问题,我很抱歉。我感谢你的帮助
Flask SQLAlchemy根据描述性基本模型定义表名(除非您自己定义了一个)。如果模型名为
CamelCase
,则将表名设置为camel_case
,而不是camelcase
在模型定义中,
User
modelfavoritejob_id
上有一个相关字段,它与FavoriteJob
model相关(根据关系声明favoritejob
)。由于FavoriteJob
模型没有任何显式表名,Flask SQLAlchemy将其命名为favorite_job
。但您的相关字段定义有:由于表
favoritejob
不存在,您将得到错误(如预期的那样)您有几个选项来处理此问题:
最简单的选项可能是重命名相关的表名:
或者将
FavoriteJob
模型的表名指定为favoritejob
:相关问题 更多 >
编程相关推荐