2013-08-13 23 views
8

Mam uruchomiony program od innej osoby, której niedogodności wymagają pomocy. Program jest stroną internetową. Koniec serwera jest napisany przez pythona i kolbę (moduł, http://flask.pocoo.org/). Program został pomyślnie uruchomiony na serwerze. Muszę coś zmodyfikować. Ponieważ serwer produkcyjny nie jest dopuszczony do testu, przetestowałem go w lokalnym serwerze programistycznym za pomocą skrzynki. Nie mogłem jednak uruchomić nawet oryginalnego programu. Poniżej jest z Pythona.sqlalchemy.exc.OperationalError: (OperationalError) nie można otworzyć pliku bazy danych Brak Brak

(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 

W pliku config.py

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

Dlatego stworzyłem folder o nazwie "tmp" pod moim użytkownikiem i pusty plik o nazwie "ate.db". Następnie uruchom go ponownie. To powiedział:

Następnie utworzyłem folder dziennika i plik dziennika. Uruchom go, ale nic się nie stało jak

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

Jeśli to się powiedzie, strona powinna być dostępna na http://127.0.0.1:5000 /. Jednak to nie zadziałało. Czy ktoś wie, dlaczego i jak go rozwiązać? Kody powinny być dobre, ponieważ są teraz dostępne online. Problem powinien być lokalnym problemem. Dziękuję bardzo za Twoją pomoc.

Kodeks gdzie program jest zatrzymany

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

jest tam miało być 4 '' po '//// sqlite: 'lub tylko 3? Również '/ tmp/ate.db' oznacza, że ​​jest on przechowywany w'/tmp', a nie 'tmp'. Chyba że jesteś chroot. –

+0

To znaczy 4. Myślę, że jest to problem mojego lokalnego środowiska, ponieważ może być uruchomiony na innym komputerze i serwerze. Jednak nie wiem, czego brakuje mi w moim laptopie. – user2677756

+0

Być może warto podać kod w pobliżu miejsca, w którym ślad stosu wskazuje na –

Odpowiedz

8

miałem ten problem z SQLite. Proces próbujący otworzyć plik bazy danych musi mieć prawo zapisu do katalogu, ponieważ tworzy tymczasowe/blokuje pliki.

Następująca struktura działała dla mnie, aby umożliwić korzystanie z bazy danych przez www.

%> 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

Mój identyfikator URI bazy danych zaczął się kołysać po dodaniu jednej kropki między ////. Praca w systemie Windows 7. Przed wywołaniem tego adresu utworzyłem katalog i plik db.

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

Po prostu spotkałem się z tym samym problemem i stwierdziłem, że robię głupi okólnik.

./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) 

Potem usunięto app.py/db i to działa.

4

Wymienić:

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

Z:

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

końcu zorientowaliśmy się, gdyby pomoc 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) 
Powiązane problemy