猿问

如何修复 Flask 应用程序中的“错误:无法打开数据库文件”?

我正在创建一个 Flask 服务器,它将显示从 sqlite3 数据库查询的信息。但是,当我在运行 localhost 后尝试访问数据库文件时,它返回以下错误。


File "C:\Users\Connor\Documents\Parking\app\routes.py", line 13, in index

    con = sqlite3.connect(app.config['SQLALCHEMY_DATABASE_URI'])

sqlite3.OperationalError: unable to open database file

127.0.0.1 - - [26/Mar/2019 20:30:57] "GET / HTTP/1.1" 500 -

我几乎肯定问题源于sqlite:///,但我无法弄清楚。建议的解决方案似乎也没有答案。


routes.py


from app import app

from flask import Flask, flash, redirect, request, render_template, 

session, url_for

import sqlite3


app.secret_key = app.config['SECRET_KEY']


@app.route('/')

@app.route('/index')

def index():

    con = sqlite3.connect(app.config['SQLALCHEMY_DATABASE_URI'])

    cur = con.cursor()

    cur.execute("SELECT * FROM Lot")

    data = cur.fetchall()

    return render_template('index.html', data=data)

config.py


import os


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


class Config(object):

    SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(PROJECT_ROOT, 'app.db')

    SQLALCHEMY_TRACK_MODIFICATIONS = False

    DEBUG = True

    SECRET_KEY = 'development key'

init.py


from flask import Flask

from config import Config

from flask_sqlalchemy import SQLAlchemy

from flask_migrate import Migrate


app = Flask(__name__)

app.config.from_object(Config)

db = SQLAlchemy(app)

打印app.config['SQLALCHEMY_DATABASE_URI']返回sqlite:///C:\Users\Connor\Documents\Parking\app.db。我认为正斜杠是我问题的根源。我尝试了 os.path 的几种变体,但无济于事。


奇怪的是,当我手动输入路径时,数据库显示得很好,并且可以在管理门户中操作其数据。当我使用 时os.path.join(PROJECT_ROOT, 'app.db'),数据库会显示,但我无法在管理门户中操作其数据。当我使用 时"sqlite:///" + os.path.join(PROJECT_ROOT, 'app.db'),我根本无法访问数据库。


我相信我sqlite:///按照本文档正确使用,所以也许我只是遗漏了什么?


智慧大石
浏览 262回答 1
1回答

芜湖不芜

这里的问题是您使用的是 sqlalchemy 连接 url,但尝试直接通过 sqlite3 api 进行连接。这行代码来自您的index()路线:con&nbsp;=&nbsp;sqlite3.connect(app.config['SQLALCHEMY_DATABASE_URI'])...调用该sqllite3.connect()函数,并且您正在传递您的 sqlalchemy 连接 url:&nbsp;SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(PROJECT_ROOT, 'app.db')。这是 的函数签名sqlite3.connect():sqlite3.connect(database[,&nbsp;timeout,&nbsp;detect_types,&nbsp;isolation_level,&nbsp;check_same_thread,&nbsp;factory,&nbsp;cached_statements,&nbsp;uri])这是关于可以作为database参数传递的内容的文档摘录:database 是一个类似路径的对象,给出要打开的数据库文件的路径名(绝对或相对于当前工作目录)。sqllite:///some/path/to/app.db&nbsp;不是有效的路径名,这就是引发错误的原因。您已经解决了配置的所有麻烦flask_sqlalchemy,所以您不妨使用它!from app import app, db&nbsp; # <== notice import of db herefrom flask import (Flask, flash, redirect, request, render_template,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session, url_for)app.secret_key = app.config['SECRET_KEY']@app.route('/')@app.route('/index')def index():&nbsp; &nbsp; data = db.session.execute("SELECT * FROM Lot").fetchall()&nbsp; &nbsp; return render_template('index.html', data=data)这有一个额外的好处,包括 Flask-SQLAlchemy 附带的会话管理。
随时随地看视频慕课网APP

相关分类

Python
我要回答