2013-08-13 16 views
8

Sto eseguendo un programma da un'altra persona che è in disagio chiedere aiuto da. Il programma è un sito web. Il server end è scritto da python e flask (modulo, http://flask.pocoo.org/). Il programma è stato eseguito correttamente sul server. Quello che devo fare è modificare qualcosa su di esso. Poiché il server di produzione non è consentito per il test, l'ho testato nel server di sviluppo localmente tramite il pallone. Tuttavia, non ho potuto eseguire nemmeno il programma originale. Di seguito è riportato da python.sqlalchemy.exc.OperationalError: (OperationalError) non è in grado di aprire il file di database Nessuno Nessuno

(venv)[email protected]:~/python/public_html$ python index.wsgi 

Traceback (most recent call last): File "index.wsgi", line 6, in from app import app as application

File "/home/kevin/python/public_html/app.py", line 27, in <module> 
app = create_app() 

File "/home/kevin/python/public_html/app.py", line 12, in create_app 
database.init_db() 

File "/home/kevin/python/public_html/database.py", line 24, in init_db 
Base.metadata.create_all(engine) 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/schema.py", line 2793, in create_all 
    tables=tables) 
File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1478, in _run_visitor 
with self._optional_conn_ctx_manager(connection) as conn: 

File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__ 
return self.gen.next() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1471, in _optional_conn_ctx_manager 
with self.contextual_connect() as conn: 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1661, in contextual_connect 
self.pool.connect(), 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 272, in connect 
return _ConnectionFairy(self).checkout() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 425, in __init__ 
rec = self._connection_record = pool._do_get() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 857, in _do_get 
return self._create_connection() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 225, in _create_connection 
return _ConnectionRecord(self) 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 318, in __init__ 
self.connection = self.__connect() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py", line 368, in __connect 
connection = self.__pool._creator() 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/strategies.py", line 80, in connect 
return dialect.connect(*cargs, **cparams) 

File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 283, in connect 
return self.dbapi.connect(*cargs, **cparams) 

sqlalchemy.exc.OperationalError: (OperationalError) unable to open database file None None 

Nel file config.py

LOGFILE = '/tmp/ate.log' DEBUG = True TESTING = True THREADED = True DATABASE_URI = 'sqlite:////tmp/ate.db' SECRET_KEY = os.urandom(24)

Quindi, ho creato una cartella chiamata "tmp" sotto il mio utente e un file vuoto chiamato "ate.db". Quindi, eseguito di nuovo. Ha detto

IOError: [Errno 2] No such file or directory: '/home/kevin/log/ate.log'

Quindi, ho creato la cartella di registro e il file di registro. Eseguirlo, ma non è successo niente, come

(venv)[email protected]:~/python/public_html$ python index.wsgi (venv)[email protected]:~/python/public_html$ python index.wsgi (venv)[email protected]:~/python/public_html$

Se è successo, il sito web dovrebbe essere accessibile http://127.0.0.1:5000 /. Tuttavia, non ha funzionato. Qualcuno sa perché e come risolverlo? I codici dovrebbero andare bene dato che ora è disponibile online. Il problema dovrebbe essere un problema locale. Grazie mille per il vostro aiuto.

Il codice in cui il programma è bloccato

from sqlalchemy import create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import scoped_session, sessionmaker 

engine = None 
db_session = None 
Base = declarative_base() 


def init_engine(uri, **kwards): 
    global engine 
    engine = create_engine(uri, **kwards) 
    return engine 


def init_db(): 
    global db_session 
    db_session = scoped_session(sessionmaker(bind=engine)) 
    # import all modules here that might define models so that 
    # they will be registered properly on the metadata. Otherwise 
    # you will have to import them first before calling init_db() 
    import models 
    Base.metadata.create_all(engine) 
+6

è ci vuole essere 4 '' //// dopo ' sqlite: 'o solo 3? Anche '/ tmp/ate.db' significa che è memorizzato in'/tmp' e non 'tmp'. A meno che tu non sia chroot, ovviamente. –

+0

Significava 4. Penso che sia il problema del mio ambiente locale perché può essere eseguito nell'altro computer e server. Tuttavia, non so cosa mi manca nel mio portatile. – user2677756

+0

Può valere la pena fornire il codice attorno al punto in cui la traccia dello stack punta a –

risposta

8

ho avuto questo problema con SQLite. Il processo che tenta di aprire il file di database deve avere accesso in scrittura alla directory poiché crea file temporanei/di blocco.

La seguente struttura ha funzionato per consentire a www-data di utilizzare il database.

%> ls -l 
drwxrwxr-x 2 fmlheureux www-data  4096 Feb 17 13:24 database-dir 

%> ls -l database-dir/ 
-rw-rw-r-- 1 fmlheureux www-data 40960 Feb 17 13:28 database.sqlite 
4

L'URI del mio database ha iniziato a oscillare dopo aver aggiunto un punto tra ////. Lavorando su Windows 7. Avevo creato directory e file db prima di chiamare questo.

0

Ho appena incontrato questo stesso problema e ho scoperto che faccio uno stupido riferimento circolare.

./data_model.py

from flask.ext.sqlalchemy import SQLAlchemy 
from api.src.app import app 

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////database/user.db') 

db = SQLAlchemy(app) 

./app.py

... 
from api.src.data_model import db 
db.init_app(app) 

Poi ho tolto l'app.py/db e funziona.

4

Sostituire:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////dbdir/test.db' 

Con:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dbdir/test.db' 
3

finalmente capito, aveva aiuto tho

import os 

file_path = os.path.abspath(os.getcwd())+"\database.db" 

app = Flask(__name__) 
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///'+file_path 
db = SQLAlchemy(app) 
Problemi correlati