为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

智慧大石 2021-12-17 14:53:22
我正在创建一个 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 file127.0.0.1 - - [26/Mar/2019 20:30:57] "GET / HTTP/1.1" 500 -我几乎肯定问题源于sqlite:///,但我无法弄清楚。建议的解决方案似乎也没有答案。routes.pyfrom app import appfrom flask import Flask, flash, redirect, request, render_template, session, url_forimport sqlite3app.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.pyimport osPROJECT_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.pyfrom flask import Flaskfrom config import Configfrom flask_sqlalchemy import SQLAlchemyfrom flask_migrate import Migrateapp = 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:///按照本文档正确使用,所以也许我只是遗漏了什么?
查看完整描述

1 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

这里的问题是您使用的是 sqlalchemy 连接 url,但尝试直接通过 sqlite3 api 进行连接。

这行代码来自您的index()路线:

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

...调用该sqllite3.connect()函数,并且您正在传递您的 sqlalchemy 连接 url: SQLALCHEMY_DATABASE_URI = "sqlite:///" + os.path.join(PROJECT_ROOT, 'app.db')

这是 的函数签名sqlite3.connect()

sqlite3.connect(database[, timeout, detect_types, isolation_level, check_same_thread, factory, cached_statements, uri])

这是关于可以作为database参数传递的内容的文档摘录:

database 是一个类似路径的对象,给出要打开的数据库文件的路径名(绝对或相对于当前工作目录)。

sqllite:///some/path/to/app.db 不是有效的路径名,这就是引发错误的原因。

您已经解决了配置的所有麻烦flask_sqlalchemy,所以您不妨使用它!

from app import app, db  # <== notice import of db here

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

                   session, url_for)


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


@app.route('/')

@app.route('/index')

def index():

    data = db.session.execute("SELECT * FROM Lot").fetchall()

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

这有一个额外的好处,包括 Flask-SQLAlchemy 附带的会话管理。


查看完整回答
反对 回复 2021-12-17
  • 1 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信