#python #flask #sqlite #sqlalchemy
#python #flask #sqlite #sqlalchemy
Вопрос:
Я создаю сервер Flask, который будет отображать информацию, запрошенную из базы данных sqlite3. Однако, когда я пытаюсь получить доступ к файлу базы данных после запуска localhost, он возвращает следующую ошибку.
File "C:UsersConnorDocumentsParkingapproutes.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:UsersConnorDocumentsParkingapp.db
. Я бы предположил, что косые черты являются корнем моей проблемы. Я пробовал несколько вариантов ОС.путь, но безрезультатно.
Как ни странно, когда я вручную ввожу свой path, база данных отображается просто отлично, и ее данными можно манипулировать на портале администратора. Когда я использую os.path.join(PROJECT_ROOT, 'app.db')
, база данных отображается, но я не могу манипулировать ее данными на портале администратора. Когда я использую "sqlite:///" os.path.join(PROJECT_ROOT, 'app.db')
, я вообще не могу получить доступ к базе данных.
Я полагаю, что sqlite:///
правильно использую согласно этому документу, так что, возможно, я просто что-то упускаю?
Ответ №1:
Проблема здесь в том, что вы используете URL-адрес подключения sqlalchemy, но пытаетесь подключиться напрямую через sqlite3 api.
Эта строка кода из вашего 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.
Комментарии:
1. Идеально! Большое вам спасибо.