Как исправить ошибку «Ошибка: невозможно открыть файл базы данных» в приложении Flask? - PullRequest
0 голосов
/ 27 марта 2019

Я создаю сервер 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:///, но я не могу понять,это из.Похоже, ни одно из предложенных решений не имеет ответа.

rout.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:/// согласно этому документу , так что, возможно, я просточто-то упустил?

1 Ответ

1 голос
/ 27 марта 2019

Проблема здесь в том, что вы используете URL-адрес подключения sqlalchemy, но пытаетесь подключиться напрямую через API sqlite3.

Эта строка кода из вашего index() маршрута:

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

... вызывает функцию sqllite3.connect(), и вы передаете, что URL-адрес вашего соединения sqlalchemy: 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...