在包结构中排列代码时,Flask SQLAlchemy抛出“NorReferencedTableError”

2024-06-26 10:07:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在学习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很陌生,如果我的设置有明显的问题,我很抱歉。我感谢你的帮助


Tags: keyfrompyimportidtrueappdb
1条回答
网友
1楼 · 发布于 2024-06-26 10:07:08

Flask SQLAlchemy根据描述性基本模型定义表名(除非您自己定义了一个)。如果模型名为CamelCase,则将表名设置为camel_case,而不是camelcase

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

db.ForeignKey('favoritejob.id')

由于表favoritejob不存在,您将得到错误(如预期的那样)


您有几个选项来处理此问题:

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

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

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

相关问题 更多 >