sqlalchemy教學 - python3 flask教學




Flask OperationalError:無法使用sqlite3打開數據庫文件 (2)

我試圖掛鉤現有的sqlite3數據庫到我正在建設的儀表板,我遇到了一個問題,我不知道如何解決。 我一直在努力拼湊Flask文檔和其他來源的東西,所以隨時可以打電話給我看看有點奇怪的東西。 這可能是,我只是不知道它:)

碼:

from __future__ import with_statement
from contextlib import closing
from flask import Flask, render_template, request, session, g, redirect, url_for, abort, flash
import sqlite3

#config
DATABASE = '~/home/aaron/Dropbox/coding/webapp2/tmp/test.db'
DEBUG = True
SECRET_KEY = 'development key'
USERNAME = 'admin'
PASSWORD = 'default'

app = Flask(__name__)
app.config.from_object(__name__)

def connect_db():
    return sqlite3.connect(app.config['DATABASE']) # LINE 17


@app.before_request
def before_request():
    g.db = connect_db() # LINE 22

@app.teardown_request
def teardown_request(exception):
    if hasattr(g, 'db'):
        g.db.close()

# App seems to error out before app.route and if __name__=='__main__' block
# Everything in my app.route is commented out

完整的錯誤:

Traceback(最近調用最後一個): 調用返回文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,行1701,返回self.wsgi_app(environ,start_response)文件“/ usr /local/lib/python2.7/dist-packages/flask/app.py“,第1689行,在wsgi_app響應= self.make_response(self.handle_exception(e))文件”/usr/local/lib/python2.7 /dist-packages/flask/app.py“第1687行,在wsgi_app response = self.full_dispatch_request()文件”/usr/local/lib/python2.7/dist-packages/flask/app.py“,第1360行,在full_dispatch_request中rv = self.handle_user_exception(e)文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1356行,在full_dispatch_request中rv = self.preprocess_request()File“/ usr / local / lib / python2.7 / dist-packages / flask / app.py“,第1539行,在preprocess_request中rv = func()文件”/home/aaron/Dropbox/coding/webapp2/control.py“,行22,before_request g.db = connect_db()文件“/home/aaron/Dropbox/coding/webapp2/control.py”,第17行,在connect_db中返回sqlite3.connect(app.config ['DA TABASE'])OperationalError:無法打開數據庫文件

127.0.0.1 - - [13 / Oct / 2012 13:55:48]“GET /? debugger = yes&cmd = resource&f = style.css HTTP / 1.1”200 - 127.0.0.1 - - [13 / Oct / 2012 13:55 :48]“GET /? debugger = yes&cmd = resource&f = jquery.js HTTP / 1.1”200 - 127.0.0.1 - - [13 / Oct / 2012 13:55:48]“GET /? debugger = yes&cmd = resource&f = debugger .js HTTP / 1.1“200 - 127.0.0.1 - - [13 / Oct / 2012 13:55:48]”GET /? debugger = yes&cmd = resource&f = console.png HTTP / 1.1“200 - 127.0.0.1 - - [ GET /? debugger = yes&cmd = resource&f = source.png HTTP / 1.1“200 - 127.0.0.1 - - [13 / Oct / 2012 13:55:49]”GET / favicon.ico HTTP / 1.1“500 -

Traceback(最近調用最後一個): 調用返回文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,行1701,返回self.wsgi_app(environ,start_response)文件“/ usr /local/lib/python2.7/dist-packages/flask/app.py“,第1689行,在wsgi_app響應= self.make_response(self.handle_exception(e))文件”/usr/local/lib/python2.7 /dist-packages/flask/app.py“第1687行,在wsgi_app response = self.full_dispatch_request()文件”/usr/local/lib/python2.7/dist-packages/flask/app.py“,第1360行,在full_dispatch_request中rv = self.handle_user_exception(e)文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1356行,在full_dispatch_request中rv = self.preprocess_request()File“/ usr / local / lib / python2.7 / dist-packages / flask / app.py“,第1539行,在preprocess_request中rv = func()文件”/home/aaron/Dropbox/coding/webapp2/control.py“,行22,before_request g.db = connect_db()文件“/home/aaron/Dropbox/coding/webapp2/control.py”,第17行,在connect_db中返回sqlite3.connect(app.config ['DA TABASE'])OperationalError:無法打開數據庫文件

看來問題來自這個配置線:

DATABASE = '~/home/aaron/Dropbox/coding/webapp2/tmp/test.db'

我的問題:

1)為什麼OperationalError被拋出兩次?

2)為什麼每個OperationalError調用第17行和第22行(​​在我的代碼中註釋過),儘管這些是函數定義而不是函數調用?

3)我如何解決錯誤,鑑於這是一個有效的分貝數據在指定的路徑?

這些是我所指的:

http://flask.pocoo.org/docs/tutorial/dbcon/#tutorial-dbcon

http://flask.pocoo.org/docs/tutorial/views/#tutorial-views

http://flask.pocoo.org/docs/patterns/sqlite3/


我認為問題是~字符(在shell中有效,但在Python中不可用),所以你可能需要編寫完整的絕對路徑。 我沒有使用Flask,但我建議在您的設置中設置PROJECT_ROOT常量,然後使用相對路徑:

import os

PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))

DATABASE = os.path.join(PROJECT_ROOT, 'tmp', 'test.db')

這為我工作:

當你在開始定義數據庫時,不要只說app.database = 'example.db' ,相反,你必須用雙斜線指定主目錄路徑:
"ex : //var//www//foldername//example.db"如果你正在使用linux並重新啟動服務器。





flask