2012-10-13 53 views
8

我试图将现有的sqlite3数据库挂接到我正在构建的仪表板,并且遇到了一个问题,我无法弄清楚如何解决。我一直在尝试将Flask文档和其他资源中的内容拼凑在一起,所以请随时在这里给我打电话,看起来有点奇怪。这可能是的,我只是不知道它:)Flask OperationalError:无法使用sqlite3打开数据库文件

代码:

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 (most recent call last): File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in call return self.wsgi_app(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1356, in full_dispatch_request rv = self.preprocess_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1539, in preprocess_request rv = func() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 22, in before_request g.db = connect_db() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 17, in connect_db return sqlite3.connect(app.config['DATABASE']) OperationalError: unable to open database file

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 (most recent call last): File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in call return self.wsgi_app(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1356, in full_dispatch_request rv = self.preprocess_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1539, in preprocess_request rv = func() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 22, in before_request g.db = connect_db() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 17, in connect_db return sqlite3.connect(app.config['DATABASE']) OperationalError: unable to open database file

看来这个问题是从这一配置行来:

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/

回答

10

我觉得现在的问题是~字符(壳不是在Python有效,但)所以你可能需要写完整的绝对路径。我不使用瓶,但我建议设立PROJECT_ROOT常数设置,然后使用相对路径:

import os 

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

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

这个工作对我来说:

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

相关问题