mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Use NullPool for sqlite engines
This restores the behavior under SQLAlchemy 1.4 (Note that we set the pool for sqlite only if it's not an in-memory db
This commit is contained in:
@@ -12,6 +12,7 @@ from sqlalchemy import (
|
||||
exc,
|
||||
)
|
||||
from sqlalchemy.engine import Engine
|
||||
from sqlalchemy.pool import NullPool
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -101,8 +102,13 @@ def build_engine(
|
||||
pass
|
||||
|
||||
engine_options = engine_options or {}
|
||||
engine_options = set_sqlite_connect_args(engine_options, url)
|
||||
engine = create_engine(url, **engine_options, future=True)
|
||||
if url.startswith("sqlite://"):
|
||||
set_sqlite_connect_args(engine_options, url)
|
||||
|
||||
if url.startswith("sqlite://") and url not in ("sqlite:///:memory:", "sqlite://"):
|
||||
engine = create_engine(url, **engine_options, poolclass=NullPool, future=True)
|
||||
else:
|
||||
engine = create_engine(url, **engine_options, future=True)
|
||||
|
||||
# Prevent sharing connection across fork: https://docs.sqlalchemy.org/en/14/core/pooling.html#using-connection-pools-with-multiprocessing-or-os-fork
|
||||
register_after_fork(engine, lambda e: e.dispose())
|
||||
@@ -123,13 +129,11 @@ def build_engine(
|
||||
return engine
|
||||
|
||||
|
||||
def set_sqlite_connect_args(engine_options: Dict, url: str):
|
||||
def set_sqlite_connect_args(engine_options: Dict, url: str) -> None:
|
||||
"""
|
||||
Add or update `connect_args` in `engine_options` if db is sqlite.
|
||||
Set check_same_thread to False for sqlite, handled by request-specific session.
|
||||
See https://fastapi.tiangolo.com/tutorial/sql-databases/#note
|
||||
"""
|
||||
if url.startswith("sqlite://"):
|
||||
connect_args = engine_options.setdefault("connect_args", {})
|
||||
connect_args["check_same_thread"] = False
|
||||
return engine_options
|
||||
connect_args = engine_options.setdefault("connect_args", {})
|
||||
connect_args["check_same_thread"] = False
|
||||
|
||||
@@ -7,28 +7,28 @@ NON_SQLITE_URL = "foo://foo.db"
|
||||
class TestSetSqliteConnectArgs:
|
||||
def test_engine_options_empty(self):
|
||||
engine_options = {} # type: ignore[var-annotated]
|
||||
updated = set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert updated == {"connect_args": {"check_same_thread": False}}
|
||||
set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert engine_options == {"connect_args": {"check_same_thread": False}}
|
||||
|
||||
def test_update_nonempty_engine_options(self):
|
||||
engine_options = {"foo": "some foo"}
|
||||
updated = set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(updated) == 2
|
||||
assert updated["foo"] == "some foo"
|
||||
assert updated["connect_args"] == {"check_same_thread": False}
|
||||
set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(engine_options) == 2
|
||||
assert engine_options["foo"] == "some foo"
|
||||
assert engine_options["connect_args"] == {"check_same_thread": False} # type:ignore[comparison-overlap]
|
||||
|
||||
def test_overwrite_connect_args(self):
|
||||
engine_options = {"foo": "some foo", "connect_args": {"check_same_thread": True}}
|
||||
updated = set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(updated) == 2
|
||||
assert updated["foo"] == "some foo"
|
||||
assert updated["connect_args"] == {"check_same_thread": False}
|
||||
set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(engine_options) == 2
|
||||
assert engine_options["foo"] == "some foo"
|
||||
assert engine_options["connect_args"] == {"check_same_thread": False}
|
||||
|
||||
def test_update_nonempty_connect_args(self):
|
||||
engine_options = {"foo": "some foo", "connect_args": {"bar": "some bar"}}
|
||||
updated = set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(updated) == 2
|
||||
assert updated["foo"] == "some foo"
|
||||
assert len(updated["connect_args"]) == 2
|
||||
assert updated["connect_args"]["check_same_thread"] is False
|
||||
assert updated["connect_args"]["bar"] == "some bar"
|
||||
set_sqlite_connect_args(engine_options, SQLITE_URL)
|
||||
assert len(engine_options) == 2
|
||||
assert engine_options["foo"] == "some foo"
|
||||
assert len(engine_options["connect_args"]) == 2
|
||||
assert engine_options["connect_args"]["check_same_thread"] is False # type:ignore[index]
|
||||
assert engine_options["connect_args"]["bar"] == "some bar" # type:ignore[index]
|
||||
|
||||
Reference in New Issue
Block a user