【问题标题】:How to fix 'Error: unable to open database file' in Flask app?如何修复 Flask 应用程序中的“错误:无法打开数据库文件”?
【发布时间】:2019-03-27 01:44:11
【问题描述】:

我正在创建一个 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'

初始化.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')时,我根本无法访问数据库。

我相信我按照this document 正确使用了sqlite:///,所以也许我只是遗漏了一些东西?

【问题讨论】:

    标签: python flask sqlite sqlalchemy


    【解决方案1】:

    这里的问题是您使用的是 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 附带的会话管理。

    【讨论】:

    • 完美!非常感谢。
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 2021-08-08
    • 2020-03-11
    • 2019-03-29
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多