sqlalchemy.exc.OperationalError :( OperationalError)无法打开数据库文件无无

时间:2013-08-13 11:56:42

标签: python database flask

我正在从另一个不方便的人那里寻求帮助。该计划是一个网站。服务器端由python和flask(模块,http://flask.pocoo.org/)编写。该程序已在服务器上成功运行。我需要做的是修改它上面的东西。由于生产服务器不允许进行测试,因此我通过flask在本地开发服务器中对其进行了测试。但是,我甚至无法运行原始程序。以下是来自python。

(venv)kevin@ubuntu:~/python/public_html$ python index.wsgi 
  

追踪(最近一次通话):       文件“index.wsgi”,第6行,in       从应用程序导入应用程序作为应用程序

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

在config.py文件中

  

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

因此,我在我的用户下创建了一个名为“tmp”的文件夹和一个名为“ate.db”的空文件。然后,再次运行它。它说

  

IOError:[Errno 2]没有这样的文件或目录:'/ home / kevin / log / date.log'

然后,我创建了日志文件夹和日志文件。运行它,但没有发生像

  

(venv)kevin @ ubuntu:〜/ python / public_html $ python index.wsgi   (venv)kevin @ ubuntu:〜/ python / public_html $ python index.wsgi   (venv)kevin @ ubuntu:〜/ python / public_html $

如果成功,该网站应在http://127.0.0.1:5000 /上提供。但是,它没有用。有谁知道为什么以及如何解决它?代码应该没问题,因为它现在可以在线获得。问题应该是当地问题。非常感谢你的帮助。

程序卡住的代码

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)

8 个答案:

答案 0 :(得分:12)

替换:

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

使用:

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

答案 1 :(得分:9)

终于想通了,得救了

app.browser.module

答案 2 :(得分:8)

我有sqlite这个问题。尝试打开数据库文件的过程需要在创建临时/锁定文件时对目录具有写入权限。

以下结构让我可以使用www-data来使用数据库。

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

答案 3 :(得分:5)

////之间添加一个点后,我的数据库URI开始摇摆不定。在Windows 7上工作。我在调用它之前创建了目录和db-file。

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

答案 4 :(得分:1)

我想我已经看到过这样的错误,其中.db文件或其父目录的文件权限是错误的。您可以通过适当使用chownchmod来确保尝试访问数据库的过程可以这样做。

这是关于Django的,但可能仍然相关:https://serverfault.com/questions/57596/why-do-i-get-sqlite-error-unable-to-open-database-file

答案 5 :(得分:0)

我刚遇到同样的问题,发现我做了一个愚蠢的循环引用。

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

然后我删除了app.py/db并且它可以正常工作。

答案 6 :(得分:0)

您没有设法从当前级别查找数据库的路径。您需要执行以下操作:

class SomeClass(commands.Cog):
    def __init__(self, bot):
        self.bot = bot
        print('LOADED')
        self.after_init(wherever_ctx_comes_from)    

    def after_init(self, ctx):
        print('After')

这意味着上升到根级别DATABASE_URI = 'sqlite:///../tmp/ate.db' ,然后向下导航到数据库(在这种情况下,相对路径为..)。

答案 7 :(得分:0)

对于那些正在寻找OperationalError解决方案的人,不一定是由于无法打开数据库文件None None 引起的-您可以尝试向{添加一个pool_pre_ping=True参数{1}},即

create_engine

请参见sqlalchemy documentation

通过使用engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True) 参数(可通过Pool.pre_ping参数从create_engine()获得)create_engine.pool_pre_ping参数,可以在结帐时对连接进行悲观测试

每次从池中检出连接时,“ pre ping”功能通常都会发出与“ SELECT 1”等效的SQL。如果出现检测为“断开”情况的错误,则该连接将立即被回收,并且所有比当前时间更早的合并池连接都将失效,以便下次检出它们时,它们也将被回收。使用之前。