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

whitzsjs  于 8个月前  发布在  SQLite
关注(0)|答案(1)|浏览(107)

我正在使用PyInstaller创建FastAPI后端的可执行文件。
到目前为止,我设法让它运行,每个依赖,但现在我挣扎与sqlite数据库。
我也依赖于一个Qdrant矢量数据库,它也运行在sqlite上。
我的数据库处理程序目前看起来像这样:

from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker
from backend.database.models.base import Base

import sys, os

if getattr(sys, 'frozen', False):
    application_path = os.path.dirname(sys.executable)
else:
    application_path = os.path.dirname(os.path.abspath(__file__))

SQLITE_DATABASE_URL = "sqlite:///" + os.path.join(application_path, "backend", "database", "aixplora.db")

class Database:

    def __init__(self):
        self.engine = create_engine(SQLITE_DATABASE_URL, echo=True, connect_args={"check_same_thread": False})
        Base.metadata.create_all(self.engine)
        self.sessionmaker = sessionmaker(autocommit=False, autoflush=False, bind=self.engine)

    def get_session(self):
        return self.sessionmaker()

我得到的错误如下:

INFO:     127.0.0.1:55980 - "GET /config/ HTTP/1.1" 500 Internal Server Error
ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "sqlalchemy/engine/base.py", line 145, in __init__
  File "sqlalchemy/engine/base.py", line 3293, in raw_connection
  File "sqlalchemy/pool/base.py", line 452, in connect
  File "sqlalchemy/pool/base.py", line 1268, in _checkout
  File "sqlalchemy/pool/base.py", line 716, in checkout
  File "sqlalchemy/pool/impl.py", line 168, in _do_get
  File "sqlalchemy/util/langhelpers.py", line 147, in __exit__
  File "sqlalchemy/pool/impl.py", line 166, in _do_get
  File "sqlalchemy/pool/base.py", line 393, in _create_connection
  File "sqlalchemy/pool/base.py", line 678, in __init__
  File "sqlalchemy/pool/base.py", line 902, in __connect
  File "sqlalchemy/util/langhelpers.py", line 147, in __exit__
  File "sqlalchemy/pool/base.py", line 898, in __connect
  File "sqlalchemy/engine/create.py", line 637, in connect
  File "sqlalchemy/engine/default.py", line 616, in connect
sqlite3.OperationalError: unable to open database file

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "uvicorn/protocols/http/httptools_impl.py", line 435, in run_asgi
  File "uvicorn/middleware/proxy_headers.py", line 78, in __call__
  File "fastapi/applications.py", line 276, in __call__
  File "starlette/applications.py", line 122, in __call__
  File "starlette/middleware/errors.py", line 184, in __call__
  File "starlette/middleware/errors.py", line 162, in __call__
  File "starlette/middleware/base.py", line 108, in __call__
  File "backend/main.py", line 38, in posthog_middleware
  File "starlette/middleware/base.py", line 84, in call_next
  File "starlette/middleware/base.py", line 70, in coro
  File "starlette/middleware/cors.py", line 83, in __call__
  File "starlette/middleware/exceptions.py", line 79, in __call__
  File "starlette/middleware/exceptions.py", line 68, in __call__
  File "fastapi/middleware/asyncexitstack.py", line 21, in __call__
  File "fastapi/middleware/asyncexitstack.py", line 18, in __call__
  File "starlette/routing.py", line 718, in __call__
  File "starlette/routing.py", line 276, in handle
  File "starlette/routing.py", line 66, in app
  File "fastapi/routing.py", line 237, in app
  File "fastapi/routing.py", line 165, in run_endpoint_function
  File "starlette/concurrency.py", line 41, in run_in_threadpool
  File "anyio/to_thread.py", line 31, in run_sync
  File "anyio/_backends/_asyncio.py", line 937, in run_sync_in_worker_thread
  File "anyio/_backends/_asyncio.py", line 867, in run
  File "backend/main.py", line 70, in get_config
  File "backend/database/database.py", line 21, in __init__
    Base.metadata.create_all(self.engine)
  File "sqlalchemy/sql/schema.py", line 5796, in create_all
  File "sqlalchemy/engine/base.py", line 3243, in _run_ddl_visitor
  File "contextlib.py", line 137, in __enter__
  File "sqlalchemy/engine/base.py", line 3233, in begin
  File "sqlalchemy/engine/base.py", line 3269, in connect
  File "sqlalchemy/engine/base.py", line 147, in __init__
  File "sqlalchemy/engine/base.py", line 2431, in _handle_dbapi_exception_noconnection
  File "sqlalchemy/engine/base.py", line 145, in __init__
  File "sqlalchemy/engine/base.py", line 3293, in raw_connection
  File "sqlalchemy/pool/base.py", line 452, in connect
  File "sqlalchemy/pool/base.py", line 1268, in _checkout
  File "sqlalchemy/pool/base.py", line 716, in checkout
  File "sqlalchemy/pool/impl.py", line 168, in _do_get
  File "sqlalchemy/util/langhelpers.py", line 147, in __exit__
  File "sqlalchemy/pool/impl.py", line 166, in _do_get
  File "sqlalchemy/pool/base.py", line 393, in _create_connection
  File "sqlalchemy/pool/base.py", line 678, in __init__
  File "sqlalchemy/pool/base.py", line 902, in __connect
  File "sqlalchemy/util/langhelpers.py", line 147, in __exit__
  File "sqlalchemy/pool/base.py", line 898, in __connect
  File "sqlalchemy/engine/create.py", line 637, in connect
  File "sqlalchemy/engine/default.py", line 616, in connect
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file
(Background on this error at: https://sqlalche.me/e/20/e3q8)

我尝试将路径添加到我的spec文件中,就像这样a.datas += Tree('/Users/patrickgerard/Documents/GitHub/aixplora/backend/database/', 'backend/database/'),但没有帮助。
我错过了什么?提前感谢您的帮助!

eit6fx6z

eit6fx6z1#

我修正了它,显然这条路是不正确的:
SQLITE_DATABASE_URL = "sqlite:///" + os.path.join(application_path, "backend", "database", "aixplora.db")
必须是SQLITE_DATABASE_URL = "sqlite:///" + os.path.join(application_path, "aixplora.db")
花了一段时间才找到!

相关问题