gpt4 book ai didi

python - 无法从部分初始化的模块 'db' 导入名称 'models'(很可能是由于循环导入)

转载 作者:行者123 更新时间:2023-12-05 09:34:50 26 4
gpt4 key购买 nike

我可以使用以下命令运行 flask 测试 python -m unittest discover -p testing.py 但是当我尝试运行 python app.py runserver它向我显示以下错误消息:

Traceback (most recent call last):
File "app.py", line 10, in <module>
from models import db
File "/home/paula/projects/envioclicktest/restaurant_flask/models.py", line 1, in <module>
from app import app as app
File "/home/paula/projects/envioclicktest/restaurant_flask/app.py", line 10, in <module>
from models import db
ImportError: cannot import name 'db' from partially initialized module 'models'
(most likely due to a circular import) (/home/paula/projects/envioclicktest/restaurant_flask/models.py)

我的项目结构如下:

-restaurant_flask
|-app.py
|-models.py
|-testing.py

这是我的文件的内容以及我认为在每个文件中造成问题的行

应用.py
from flask import Flask
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand


app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///restaurant.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

from models import db
migrate = Migrate(app, db)

manager = Manager(app)
manager.add_command('db', MigrateCommand)


if __name__ == '__main__':
manager.run()

模型.py
from app import app as app <-------Trouble line Originally "from __main__ import app" but that doesnt work with testing.py
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.sql.functions import func
from sqlalchemy.exc import IntegrityError
import datetime
import pytz
import random
mx = pytz.timezone('America/Mexico_City')

db = SQLAlchemy(app)

class Waiter(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
services = db.relationship("Service", back_populates="waiter")

class Table(db.Model):
id = db.Column(db.Integer, primary_key=True)
table_no = db.Column(db.String(128))
services = db.relationship("Service", back_populates="table")

class Service(db.Model):

def __init__(self, tip):
time = datetime.datetime.now(mx)
self.tip = tip
# check for waiters
waiters = db.session.query(Waiter, func.count(Service.id).\
filter(Service.exit>time)).\
outerjoin(Service).group_by(Waiter).all()
print(waiters)
available_waiters= [i for i in waiters if i[1] < 4]
available_waiters_length = len(available_waiters)
# Check for tables
tables = db.session.query(Table, func.count(Table.id).\
filter(Service.exit>time)).\
outerjoin(Service).group_by(Table).all()
print(tables)
available_tables= [i for i in tables if i[1] < 1]
available_tables_length = len(available_tables)
#check if available
if available_tables_length == 0 and available_waiters_length == 0:
raise Exception("not enough waiters or tables")
if available_waiters_length == 0:
raise Exception("not enough waiters")
if available_tables_length == 0:
raise Exception("not enough tables")
# add waiter and table
waiter_obj = random.choice(available_waiters)
self.waiter_id = waiter_obj[0].id
table_obj = random.choice(available_tables)
self.table_id = table_obj[0].id


# check if current time is open
if time.time() < datetime.time(9,0) or time.time()> datetime.time(23, 30):
raise Exception("The restaurant is closed")
# add timedelta to init_time
if time.time() < datetime.time(17,0):
self.exit = time + datetime.timedelta(minutes=90)
if time.time() > datetime.time(17,0):
self.exit = time + datetime.timedelta(minutes=120)

id = db.Column(db.Integer, primary_key=True)
table_id = db.Column(db.Integer, db.ForeignKey('table.id'))
table = db.relationship("Table", back_populates="services")
waiter_id = db.Column(db.Integer, db.ForeignKey('waiter.id'))
waiter = db.relationship("Waiter", back_populates="services")
arrival = db.Column(db.DateTime, default=datetime.datetime.now(mx))
exit = db.Column(db.DateTime)
tip = db.Column(db.Numeric(10,2))

测试.py
from app import app as app <------- This line does not work as "from __main__ import app"
import unittest
from models import db, Waiter, Table, Service
from freezegun import freeze_time
import datetime
import pytz


class UserTest(unittest.TestCase):

def setUp(self):
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['TESTING'] = True
app.config['WTF_CSRF_ENABLED'] = False
self.app = app.test_client()
db.create_all()

def tearDown(self):
db.session.remove()
db.drop_all()

dt = datetime.datetime(2018,1,1,11,0,0,tzinfo=pytz.timezone('America/Mexico_City'))
@freeze_time(dt)
def test_models(self):
#Create a Table and a Waiter
table = Table(table_no="table1")
db.session.add(table)
waiter = Waiter(name="Juan")
db.session.add(waiter)
db.session.commit()
service = Service(tip=90.80)
db.session.add(service)
db.session.commit()

query = Service.query.all()
#Check that all users exist
assert len(query) == 1
assert query[0].table_id == 1
assert query[0].waiter_id == 1
assert ((query[0].exit-query[0].arrival).seconds/60) >= 90

我想不通,快把我逼疯了。

非常感谢任何帮助:)

最佳答案

对于解决方案,简单的做法是:

在模型上


db = SQLAlchemy() #Remove the app here

在应用程序上


from models import db
db.init_app(app) #Add this line Before migrate line
migrate = Migrate(app, db)

关于python - 无法从部分初始化的模块 'db' 导入名称 'models'(很可能是由于循环导入),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66251612/

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