gpt4 book ai didi

python - Flask-SQLALchemy:没有这样的表

转载 作者:太空狗 更新时间:2023-10-29 22:13:32 26 4
gpt4 key购买 nike

我正在尝试让 Flask-SQLAlchemy 工作并遇到一些问题。看一下我正在使用的两个文件。当我运行 gwg.py 并转到 /util/db/create-all 时,它吐出错误 no such table: stories。我以为我做的一切都是正确的;有人可以指出我遗漏了什么或出了什么问题吗?它确实创建了 data.db 但文件显示为 0Kb

gwg.py:

application = Flask(__name__)
db = SQLAlchemy(application)

import models

# Utility
util = Blueprint('util', __name__, url_prefix='/util')

@util.route('/db/create-all/')
def db_create_all():
db.create_all()
return 'Tables created'

application.register_blueprint(util)

application.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db'
application.debug = True
application.run()

模型.py:

from gwg import application, db

class Story(db.Model):
__tablename__ = 'stories'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(150))
subscribed = db.Column(db.Boolean)

def __init__(self, name):
self.name = name
self.subscribed = False

def toggle_subscription(self):
self.subscribed = False if self.subscribed else True

编辑

这里是似乎触发错误的函数,但它不应该,因为我特别先转到/util/db/create-all,然后重新加载/。即使在错误之后我转到/util/db/create-all 然后/仍然得到相同的错误

@application.route('/')
def homepage():
stories = models.Story.query.all()
return render_template('index.html', stories=stories)

堆栈跟踪

sqlalchemy.exc.OperationalError
OperationalError: (OperationalError) no such table: stories u'SELECT stories.id AS stories_id, stories.name AS stories_name, stories.subscribed AS stories_subscribed \nFROM stories' ()

Traceback (most recent call last)
File "C:\Python27\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "C:\Python27\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "C:\Users\kylee\Code\GWG\gwg.py", line 20, in homepage
stories = models.Story.query.all()
File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2104, in all
return list(self)
File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2216, in __iter__
return self._execute_and_instances(context)
File "C:\Python27\lib\site-packages\sqlalchemy\orm\query.py", line 2231, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 662, in execute
params)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 761, in _execute_clauseelement
compiled_sql, distilled_params
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 874, in _execute_context
context)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 1024, in _handle_dbapi_exception
exc_info
File "C:\Python27\lib\site-packages\sqlalchemy\util\compat.py", line 163, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\base.py", line 867, in _execute_context
context)
File "C:\Python27\lib\site-packages\sqlalchemy\engine\default.py", line 324, in do_execute
cursor.execute(statement, parameters)
OperationalError: (OperationalError) no such table: stories u'SELECT stories.id AS stories_id, stories.name AS stories_name, stories.subscribed AS stories_subscribed \nFROM stories' ()
The debugger caught an exception in your WSGI application. You can now look at the traceback which led to the error.
To switch between the interactive traceback and the plaintext one, you can click on the "Traceback" headline. From the text traceback you can also create a paste of it. For code execution mouse-over the frame you want to debug and click on the console icon on the right side.

You can execute arbitrary Python code in the stack frames and there are some extra helpers available for introspection:

dump() shows all variables in the frame
dump(obj) dumps all that's known about the object
Brought to you by DON'T PANIC, your friendly Werkzeug powered traceback interpreter.

最佳答案

这里的问题是 Python 导入系统中的一个问题。可以简化为下面的解释...

假设您在一个目录中有两个文件...

a.py:

print 'a.py is currently running as module {0}'.format(__name__)
import b
print 'a.py as module {0} is done'.format(__name__)

b.py:

print 'b.py is running in module {0}'.format(__name__)
import a
print 'b.py as module {0} is done'.format(__name__)

运行python a.py的结果如下...

a.py is currently running as module __main__
b.py is running in module b
a.py is currently running as module a
a.py as module a is done
b.py as module b is done
a.py as module __main__ is done

请注意,当 a.py 运行时,该模块被称为 __main__

现在想想你的代码。在其中,您的 a.py 脚本会创建您的 applicationdb 对象。但是,这些值并未存储在名为 a 的模块中,它们存储在名为 __main__ 的模块中。因此,b.py 尝试导入 a,它不是导入您几秒钟前刚刚创建的值!相反,由于它没有找到模块 a,它创建了一个新模块,第二次运行 a.py 并将结果存储到模块 a.

您可以使用我上面显示的打印语句来指导您完成整个过程,以准确了解发生了什么。解决方案是确保您只调用一次 a.py,当 b.py 导入 a 时,它将导入相同的值作为 a.py 而不是第二次导入它。

解决此问题的最简单方法是创建一个仅用于运行应用程序的 python 脚本。从 gwg.py 的末尾删除 application.run(),并添加以下脚本...

主要.py:

from gwg import application
application.run()

然后使用 python main.py 运行。

关于python - Flask-SQLALchemy:没有这样的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17440605/

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