Flask OperationalError:无法使用sqlite3打开数据库文件

时间:2012-10-13 19:20:40

标签: python sqlite flask

我正在尝试将现有的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行,   的呼叫       return self.wsgi_app(environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1689行,in   wsgi_app       response = self.make_response(self.handle_exception(e))文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1687行,in   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()文件“/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中       return sqlite3.connect(app.config ['DATABASE'])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 - - [13 / Oct / 2012 13:55:48]“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行,   的呼叫       return self.wsgi_app(environ,start_response)文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1689行,in   wsgi_app       response = self.make_response(self.handle_exception(e))文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第1687行,in   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()文件“/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中       return sqlite3.connect(app.config ['DATABASE'])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/

2 个答案:

答案 0 :(得分:10)

我认为问题是~字符(在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')

答案 1 :(得分:0)

这对我有用:

当您在开头定义数据库时,不要只说app.database = 'example.db',而是必须使用双斜杠指定主目录路径:
"ex : //var//www//foldername//example.db" 如果你正在使用linux并重新启动服务器。