21

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

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

Traceback(最近一次调用最后一次):文件“index.wsgi”,第 6 行,从应用程序导入应用程序作为应用程序

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

10 回答 10

38

代替:

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

和:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///dbdir/test.db'
于 2017-06-21T22:55:07.807 回答
17

终于想通了,有帮助

 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)
于 2017-07-23T01:30:32.267 回答
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
于 2015-02-17T18:33:43.577 回答
6

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

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./dbdir/test.db'
于 2015-10-27T22:28:48.907 回答
1

我想我见过这样的错误,其中 .db 文件或其父目录的文件权限错误。您可以确保尝试访问数据库的进程可以通过适当使用 chownor来实现chmod

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

于 2013-11-18T23:26:33.223 回答
1

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

./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 并且它可以工作。

于 2015-11-19T07:45:01.223 回答
0

我正在上一门 Python 课程,我遇到了同样的问题。幸运的是,在课程中正确地确定了数据库 URI 的路径

因此,即使在 2022 年,它也对我有用。

你需要改变:

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

至:

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///<name of database>.db'

我希望它对某人有用。

于 2022-03-01T18:05:47.790 回答
0

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

DATABASE_URI = 'sqlite:///../tmp/ate.db'

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

于 2020-04-06T18:35:29.070 回答
0

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

engine = create_engine("mysql+pymysql://user:pw@host/db", pool_pre_ping=True)

请参阅sqlalchemy 文档

Pool.pre_ping通过使用参数可以在结帐时对连接进行悲观测试,可create_engine()通过create_engine.pool_pre_ping参数获得

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

于 2020-06-08T15:35:45.383 回答
0

在启用任务历史记录的情况下尝试启动 luigi(python 模块)的中央调度程序时,我遇到了同样的问题。

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

我试图从他们的文档中使用以下配置:

[task_history]
db_connection = sqlite:////user/local/var/luigi-task-hist.db

但是,/user/local/ * 在我的机器上不存在,我不得不将配置更改为:

[task_history]
db_connection = sqlite:////usr/local/var/luigi-task-hist.db

有点愚蠢的错误,但很容易被忽视。可能会节省一些时间。此更改消除了我的错误,并且luigid开始时没有错误。

于 2021-11-03T17:30:14.280 回答