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

Posted

技术标签:

【中文标题】Flask OperationalError:无法使用 sqlite3 打开数据库文件【英文标题】:Flask OperationalError: unable to open database file using sqlite3 【发布时间】:2012-10-04 06:41:25 【问题描述】:

我正在尝试将现有的 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 response = 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() 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1539 行,在 预处理请求 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 /?调试器=yes&cmd=resource&f=style.css HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] “GET /?调试器=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 /?调试器=yes&cmd=resource&f=console.png HTTP/1.1”200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] “GET /?调试器=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 response = 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() 文件“/usr/local/lib/python2.7/dist-packages/flask/app.py”,第 1539 行,在 预处理请求 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/

【问题讨论】:

【参考方案1】:

这对我有用:

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Flask OperationalError:无法使用 sqlite3 打开数据库文件的主要内容,如果未能解决你的问题,请参考以下文章

Flask SQLAlchemy 无法连接到数据库

Flask框架下的sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045)问题

为什么Flask-migrate在drop column时无法升级

运行 Flask 服务器(Apache)几天时出现 MySQL OperationalError

从给定范围中选择行时,sqlite3.OperationalError“SQL 变量太多”

由于查询调用的自动刷新导致 SQLAlchemy OperationalError