gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:53:07 24 4
gpt4 key购买 nike

我正在学习flask并尝试根据一些在线教程将我的代码排列在“包结构”中。我整理了一些最少的代码来复制我的问题。首先我的代码的树结构是

.
└── 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留空,因为我会将所有 View /url路由放入文件中,并且需要使用User和FavoriteJob类。

我无法弄清楚为什么views.py中的导入行会导致db.create_all()失败。我对 Flask 和 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'

关于python - 在包结构中排列代码时,Flask SQLAlchemy 抛出 "NoReferencedTableError",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59706478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com