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.pyif __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)