Flask SQLAlchemy ImportError: cannot import Form
Flask SQLAlchemy ImportError: cannot import Form
我正在使用 Flask 和 SQLAlchemy 构建一个小问卷,为了进行开发测试,我尝试通过它的 ID 回忆一个随机表单。然而,终端给出了一个 ImportError,但我没有任何以模块命名的文件(如其他 Whosebug 问题)或错误提示的循环导入。如何在这个单独的文件中查询 AddEnqueteForm?
enquete_algorithm.py:
from models import AddEnqueteForm
import random
from settings import *
from flask import request
def enq_results(form_id):
form = AddEnqueteForm.query.all(filter=form_id)
reliability_dict = {}
reliability_dict['stelling_set_1'] = algorithm(form.stelling1, form.stelling2)
当然还有 models.py:
from main import db
class AddEnqueteForm(db.Model):
id = db.Column(db.Integer, primary_key=True)
stelling1 = db.Column(db.String(4), nullable=False)
stelling2 = db.Column(db.String(4), nullable=False)
错误:
Traceback (most recent call last):
File "c:\Users\Enquete\enquete_algorithm.py", line 1, in <module>
from mods import AddEnqueteForm
File "c:\Users\Enquete\models.py", line 1, in <module>
from main import db
File "c:\Users\Enquete\main.py", line 9, in <module>
from routes import *
File "c:\Users\Enquete\routes.py", line 4, in <module>
from models import AddEnqueteForm
ImportError: cannot import name 'AddEnqueteForm' from partially initialized module 'models' (most likely due to a circular import) (c:\Users\Enquete\models.py)
我意识到有些变量名称有点混乱:AddEnqueteForm 是一个模型,而不是一个表单。我完全在 HTML.
中构建了表格
问题不在于 enquete_algorithm.py。循环导入发生在 routes.py 和 models.py 之间。您在 models.py
中导入 main.py
,在 routes.py
中导入 main.py
,在 routes.py
中导入 routes.py,在导入 models.py.
中
为了解决这个问题,我创建了一个单独的文件 database.py
,我在其中定义了 db
,并从 main.py
和 models.py
中的文件中导入了数据库。这样可以防止循环导入。
database.py:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
db.init_app(app)
models.py :
from database import db
class AddEnqueteForm(db.Model):
id = db.Column(db.Integer, primary_key=True)
stelling1 = db.Column(db.String(4), nullable=False)
stelling2 = db.Column(db.String(4), nullable=False)
在main.py中你需要导入模型和数据库并使用init_app()
初始化数据库。
[...]
from database import db
from models import *
[...]
app = Flask(__name__)
database.init_app(app)
现在,如果您想通过终端运行 命令db.create_all() 来创建数据库。您需要使用应用程序上下文。
运行执行以下命令将创建数据库。
from main import *
with app.app_context():
db.create_all()
我正在使用 Flask 和 SQLAlchemy 构建一个小问卷,为了进行开发测试,我尝试通过它的 ID 回忆一个随机表单。然而,终端给出了一个 ImportError,但我没有任何以模块命名的文件(如其他 Whosebug 问题)或错误提示的循环导入。如何在这个单独的文件中查询 AddEnqueteForm? enquete_algorithm.py:
from models import AddEnqueteForm
import random
from settings import *
from flask import request
def enq_results(form_id):
form = AddEnqueteForm.query.all(filter=form_id)
reliability_dict = {}
reliability_dict['stelling_set_1'] = algorithm(form.stelling1, form.stelling2)
当然还有 models.py:
from main import db
class AddEnqueteForm(db.Model):
id = db.Column(db.Integer, primary_key=True)
stelling1 = db.Column(db.String(4), nullable=False)
stelling2 = db.Column(db.String(4), nullable=False)
错误:
Traceback (most recent call last):
File "c:\Users\Enquete\enquete_algorithm.py", line 1, in <module>
from mods import AddEnqueteForm
File "c:\Users\Enquete\models.py", line 1, in <module>
from main import db
File "c:\Users\Enquete\main.py", line 9, in <module>
from routes import *
File "c:\Users\Enquete\routes.py", line 4, in <module>
from models import AddEnqueteForm
ImportError: cannot import name 'AddEnqueteForm' from partially initialized module 'models' (most likely due to a circular import) (c:\Users\Enquete\models.py)
我意识到有些变量名称有点混乱:AddEnqueteForm 是一个模型,而不是一个表单。我完全在 HTML.
中构建了表格问题不在于 enquete_algorithm.py。循环导入发生在 routes.py 和 models.py 之间。您在 models.py
中导入 main.py
,在 routes.py
中导入 main.py
,在 routes.py
中导入 routes.py,在导入 models.py.
为了解决这个问题,我创建了一个单独的文件 database.py
,我在其中定义了 db
,并从 main.py
和 models.py
中的文件中导入了数据库。这样可以防止循环导入。
database.py:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
def init_app(app):
db.init_app(app)
models.py :
from database import db
class AddEnqueteForm(db.Model):
id = db.Column(db.Integer, primary_key=True)
stelling1 = db.Column(db.String(4), nullable=False)
stelling2 = db.Column(db.String(4), nullable=False)
在main.py中你需要导入模型和数据库并使用init_app()
初始化数据库。
[...]
from database import db
from models import *
[...]
app = Flask(__name__)
database.init_app(app)
现在,如果您想通过终端运行 命令db.create_all() 来创建数据库。您需要使用应用程序上下文。
运行执行以下命令将创建数据库。
from main import *
with app.app_context():
db.create_all()