Flask: peewee.OperationalError: no such table:
Flask: peewee.OperationalError: no such table:
我正在尝试 运行 https://github.com/swifthorseman/flask-peewee-heroku-setup 在 win 10 上本地使用 python 3.6。我不确定这个项目是否设计为 运行 本地,也许它只为 heroku 设计。
我在本地有 运行 创建数据库的文件 teletubbies.py 和 table,如您在屏幕截图中所见。为了 运行 它在本地(或尝试)我添加了以下行:
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
我运行使用
python server.py
我拥有的整个 server.py 文件:
from flask import Flask, render_template, g
from tellytubbies import retrieve_all, db_proxy
app = Flask(__name__)
@app.before_request
def before_request():
g.db = db_proxy
g.db.connect()
@app.after_request
def after_request(response):
g.db.close()
return response
@app.route('/')
def index():
tellytubbies = retrieve_all()
return render_template("index.html", tellytubbies=tellytubbies)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
通过单步执行代码,我没有看到错误,直到行:
tellytubbies = retrieve_all()
然后崩溃并给出以下回溯:
Traceback (most recent call last):
File "....myfile\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "....myfile\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "....myfile\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "....myfile\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "....myfile\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "....myfile\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "....myfile\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "....myfile\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "....myfile\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "....myfile\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "...\server.py", line 18, in index
tellytubbies = retrieve_all()
File "...\tellytubbies.py", line 32, in retrieve_all
for tellytubby in TellyTubby.select().order_by(TellyTubby.name):
File "....myfile\lib\site-packages\peewee.py", line 3281, in __iter__
return iter(self.execute())
File "....myfile\lib\site-packages\peewee.py", line 3274, in execute
self._qr = ResultWrapper(model_class, self._execute(), query_meta)
File "....myfile\lib\site-packages\peewee.py", line 2939, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File "....myfile\lib\site-packages\peewee.py", line 3837, in execute_sql
self.commit()
File "....myfile\lib\site-packages\peewee.py", line 3656, in __exit__
reraise(new_type, new_type(*exc_args), traceback)
File "....myfile\lib\site-packages\peewee.py", line 135, in reraise
raise value.with_traceback(tb)
File "....myfile\lib\site-packages\peewee.py", line 3830, in execute_sql
cursor.execute(sql, params or ())
peewee.OperationalError: no such table: tellytubby
retrieve_all() 函数来自 teletubbies.py 文件:
def retrieve_all():
results = []
for tellytubby in TellyTubby.select().order_by(TellyTubby.name):
results.append(tellytubby)
return results
当我 运行 它作为
时 teletubbies.py 确实有效
python teletubbies.py
我怎样才能让它工作?
你的烧瓶服务器对我来说工作正常,在我运行 python teletubbies.py
初始化sqlite数据库之后。但是,如果我直接删除由 运行 脚本创建的 tellytubbies.db
文件,则 Flask 服务器会失败并出现与您引用的相同的异常。
这里要考虑的一点是,当您 运行 tellytubbies.py
时,数据库文件 tellytubbies.db
将在 您 运行 的任何目录中创建来自。如果您然后从不同的目录 运行 server.py
- 例如,如果您的 IDE 是 运行ning 它 - 它不会找到另一个 tellytubbies.db
,因此将创建一个新的;但因为这些表仅在 tellytubbies.py
的 __main__
部分中创建,所以不会创建这些表。
所以你的烧瓶服务器需要做一些 teletubbies.py
正在做的初始化。我用以下内容替换了您 server.py
的 if __name__ == '__main__':
部分,它可以正常工作。无论您是保留相同的数据库文件还是在 运行 秒之间将其删除以从头开始,它都会起作用。我添加了检查以确保不会重复插入相同的行。
if __name__ == '__main__':
from teletubbies import add_tellytubbies, TellyTubby
db_proxy.connect()
db_proxy.create_tables([TellyTubby], safe=True)
if TellyTubby.select().count() == 0:
add_tellytubbies()
app.run(debug=True, use_reloader=True)
我正在尝试 运行 https://github.com/swifthorseman/flask-peewee-heroku-setup 在 win 10 上本地使用 python 3.6。我不确定这个项目是否设计为 运行 本地,也许它只为 heroku 设计。
我在本地有 运行 创建数据库的文件 teletubbies.py 和 table,如您在屏幕截图中所见。为了 运行 它在本地(或尝试)我添加了以下行:
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
我运行使用
python server.py
我拥有的整个 server.py 文件:
from flask import Flask, render_template, g
from tellytubbies import retrieve_all, db_proxy
app = Flask(__name__)
@app.before_request
def before_request():
g.db = db_proxy
g.db.connect()
@app.after_request
def after_request(response):
g.db.close()
return response
@app.route('/')
def index():
tellytubbies = retrieve_all()
return render_template("index.html", tellytubbies=tellytubbies)
if __name__ == '__main__':
app.run(debug=True, use_reloader=True)
通过单步执行代码,我没有看到错误,直到行:
tellytubbies = retrieve_all()
然后崩溃并给出以下回溯:
Traceback (most recent call last):
File "....myfile\lib\site-packages\flask\app.py", line 1836, in __call__
return self.wsgi_app(environ, start_response)
File "....myfile\lib\site-packages\flask\app.py", line 1820, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "....myfile\lib\site-packages\flask\app.py", line 1403, in handle_exception
reraise(exc_type, exc_value, tb)
File "....myfile\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "....myfile\lib\site-packages\flask\app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "....myfile\lib\site-packages\flask\app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "....myfile\lib\site-packages\flask\app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "....myfile\lib\site-packages\flask\_compat.py", line 33, in reraise
raise value
File "....myfile\lib\site-packages\flask\app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "....myfile\lib\site-packages\flask\app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "...\server.py", line 18, in index
tellytubbies = retrieve_all()
File "...\tellytubbies.py", line 32, in retrieve_all
for tellytubby in TellyTubby.select().order_by(TellyTubby.name):
File "....myfile\lib\site-packages\peewee.py", line 3281, in __iter__
return iter(self.execute())
File "....myfile\lib\site-packages\peewee.py", line 3274, in execute
self._qr = ResultWrapper(model_class, self._execute(), query_meta)
File "....myfile\lib\site-packages\peewee.py", line 2939, in _execute
return self.database.execute_sql(sql, params, self.require_commit)
File "....myfile\lib\site-packages\peewee.py", line 3837, in execute_sql
self.commit()
File "....myfile\lib\site-packages\peewee.py", line 3656, in __exit__
reraise(new_type, new_type(*exc_args), traceback)
File "....myfile\lib\site-packages\peewee.py", line 135, in reraise
raise value.with_traceback(tb)
File "....myfile\lib\site-packages\peewee.py", line 3830, in execute_sql
cursor.execute(sql, params or ())
peewee.OperationalError: no such table: tellytubby
retrieve_all() 函数来自 teletubbies.py 文件:
def retrieve_all():
results = []
for tellytubby in TellyTubby.select().order_by(TellyTubby.name):
results.append(tellytubby)
return results
当我 运行 它作为
时 teletubbies.py 确实有效python teletubbies.py
我怎样才能让它工作?
你的烧瓶服务器对我来说工作正常,在我运行 python teletubbies.py
初始化sqlite数据库之后。但是,如果我直接删除由 运行 脚本创建的 tellytubbies.db
文件,则 Flask 服务器会失败并出现与您引用的相同的异常。
这里要考虑的一点是,当您 运行 tellytubbies.py
时,数据库文件 tellytubbies.db
将在 您 运行 的任何目录中创建来自。如果您然后从不同的目录 运行 server.py
- 例如,如果您的 IDE 是 运行ning 它 - 它不会找到另一个 tellytubbies.db
,因此将创建一个新的;但因为这些表仅在 tellytubbies.py
的 __main__
部分中创建,所以不会创建这些表。
所以你的烧瓶服务器需要做一些 teletubbies.py
正在做的初始化。我用以下内容替换了您 server.py
的 if __name__ == '__main__':
部分,它可以正常工作。无论您是保留相同的数据库文件还是在 运行 秒之间将其删除以从头开始,它都会起作用。我添加了检查以确保不会重复插入相同的行。
if __name__ == '__main__':
from teletubbies import add_tellytubbies, TellyTubby
db_proxy.connect()
db_proxy.create_tables([TellyTubby], safe=True)
if TellyTubby.select().count() == 0:
add_tellytubbies()
app.run(debug=True, use_reloader=True)