2012-10-13 11 views
8

Ich versuche, eine vorhandene sqlite3 db an ein Dashboard anzuhängen, das ich erstelle, und ich habe ein Problem, dass ich nicht herausfinden kann, wie es gelöst wird. Ich habe daran gearbeitet, indem ich versucht habe, Dinge aus den Flask-Dokumenten und anderen Quellen zusammenzustellen, also könntest du mich hier anrufen, was etwas seltsam aussieht. Es ist wahrscheinlich, und ich weiß einfach nicht, es :)Flask OperationalError: Datenbankdatei kann mit sqlite3 nicht geöffnet werden

Code:

from __future__ import with_statement 
from contextlib import closing 
from flask import Flask, render_template, request, session, g, redirect, url_for, abort, flash 
import sqlite3 

#config 
DATABASE = '~/home/aaron/Dropbox/coding/webapp2/tmp/test.db' 
DEBUG = True 
SECRET_KEY = 'development key' 
USERNAME = 'admin' 
PASSWORD = 'default' 

app = Flask(__name__) 
app.config.from_object(__name__) 

def connect_db(): 
    return sqlite3.connect(app.config['DATABASE']) # LINE 17 


@app.before_request 
def before_request(): 
    g.db = connect_db() # LINE 22 

@app.teardown_request 
def teardown_request(exception): 
    if hasattr(g, 'db'): 
     g.db.close() 

# App seems to error out before app.route and if __name__=='__main__' block 
# Everything in my app.route is commented out 

komplette Fehler:

Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in call return self.wsgi_app(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1356, in full_dispatch_request rv = self.preprocess_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1539, in preprocess_request rv = func() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 22, in before_request g.db = connect_db() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 17, in connect_db return sqlite3.connect(app.config['DATABASE']) OperationalError: unable to open database file

127.0.0.1 - - [13/Oct/2012 13:55:48] "GET /?debugger=yes&cmd=resource&f=style.css HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] "GET /?debugger=yes&cmd=resource&f=jquery.js HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] "GET /?debugger=yes&cmd=resource&f=debugger.js HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] "GET /?debugger=yes&cmd=resource&f=console.png HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:48] "GET /?debugger=yes&cmd=resource&f=source.png HTTP/1.1" 200 - 127.0.0.1 - - [13/Oct/2012 13:55:49] "GET /favicon.ico HTTP/1.1" 500 -

Traceback (most recent call last): File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1701, in call return self.wsgi_app(environ, start_response) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1689, in wsgi_app response = self.make_response(self.handle_exception(e)) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1687, in wsgi_app response = self.full_dispatch_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1360, in full_dispatch_request rv = self.handle_user_exception(e) File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1356, in full_dispatch_request rv = self.preprocess_request() File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1539, in preprocess_request rv = func() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 22, in before_request g.db = connect_db() File "/home/aaron/Dropbox/coding/webapp2/control.py", line 17, in connect_db return sqlite3.connect(app.config['DATABASE']) OperationalError: unable to open database file

Es scheint, dass das Problem aus dieser Konfigurationszeile kommt:

DATABASE = '~/home/aaron/Dropbox/coding/webapp2/tmp/test.db' 

Meine Fragen:

1) Warum wird der OperationalError zweimal ausgelöst?

2) Warum ruft jeder OperationalError die Zeilen 17 und 22 (kommentiert in meinem obigen Code) aus, obwohl dies Funktionsdefinitionen sind und keine Funktionsaufrufe?

3) Wie behebe ich den Fehler, da es sich um eine gültige Datenbank mit Daten im angegebenen Pfad handelt?

Diese sind, was ich Referenzierung:

http://flask.pocoo.org/docs/tutorial/dbcon/#tutorial-dbcon

http://flask.pocoo.org/docs/tutorial/views/#tutorial-views

http://flask.pocoo.org/docs/patterns/sqlite3/

Antwort

10

Ich denke, dass das Problem der ~ Charakter ist (gültig in der Schale, aber nicht in Python), Sie müssen also wahrscheinlich den vollständigen absoluten Pfad schreiben. Ich bin mit Flask nicht, aber ich schlage vor, PROJECT_ROOT Konstante in den Einstellungen einzurichten und dann relative Pfade verwenden:

import os 

PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__)) 

DATABASE = os.path.join(PROJECT_ROOT, 'tmp', 'test.db') 
0

Das ist für mich gearbeitet:

Wenn Sie Datenbank am Anfang definieren, nicht nur sagen app.database = 'example.db', stattdessen müssen Sie den Home-Verzeichnis-Pfad mit Doppelschlitze:
"ex : //var//www//foldername//example.db" angeben, wenn Sie Linux verwenden und den Server erneut starten.

Verwandte Themen