我正在使用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/')
,但没有帮助。
我错过了什么?提前感谢您的帮助!
1条答案
按热度按时间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")
花了一段时间才找到!