簡體   English   中英

Flask:peewee.OperationalError:沒有這樣的表:

[英]Flask: peewee.OperationalError: no such table:

在此輸入圖像描述

我正在嘗試使用python 3.6在win 10上本地運行https://github.com/swifthorseman/flask-peewee-heroku-setup 我不確定這個項目是否設計為在本地運行,也許它只是為heroku設計的。

我在本地運行了文件teletubbies.py,它創建了db和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:

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時,teletubbies.py可以正常工作

python teletubbies.py

我怎樣才能使這個工作?

運行python teletubbies.py初始化sqlite數據庫之后,我的燒瓶服務器正常工作。 但是,如果我刪除通過直接運行腳本創建的tellytubbies.db文件,則燒瓶服務器將失敗並引用相同的異常。

這里需要考慮的是,當你運行tellytubbies.py ,數據庫文件tellytubbies.db將在你運行它的任何目錄中創建。 然后,如果您從另一個目錄運行server.py - 例如,如果您的IDE正在運行它 - 它將找不到其他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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM