我正在创建一个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:///
,所以也许我只是错过了一些东西?
答案 0 :(得分: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
参数传递的内容的文档:
数据库是一个类似路径的对象,提供了路径名(绝对或 相对于当前工作目录)的数据库文件 打开。
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随附的会话管理等额外的关键优势。