From 88988b986251646c627a57d0c629f64ecc335264 Mon Sep 17 00:00:00 2001 From: Christophe Haen Date: Mon, 13 Jan 2025 16:02:29 +0100 Subject: [PATCH] Allow for SQLAlchemyDSN with hyphen (oracle) --- diracx-core/src/diracx/core/settings.py | 8 +++++++- diracx-db/src/diracx/db/sql/utils/base.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/diracx-core/src/diracx/core/settings.py b/diracx-core/src/diracx/core/settings.py index 499c533c..819633f5 100644 --- a/diracx-core/src/diracx/core/settings.py +++ b/diracx-core/src/diracx/core/settings.py @@ -28,7 +28,13 @@ class SqlalchemyDsn(AnyUrl): _constraints = UrlConstraints( - allowed_schemes=["sqlite+aiosqlite", "mysql+aiomysql"] + allowed_schemes=[ + "sqlite+aiosqlite", + "mysql+aiomysql", + # The real scheme is with an underscore, (oracle+oracledb_async) + # but pydantic does not validate it, so we use this hack + "oracle+oracledb-async", + ] ) diff --git a/diracx-db/src/diracx/db/sql/utils/base.py b/diracx-db/src/diracx/db/sql/utils/base.py index 86f3be71..4aa592d7 100644 --- a/diracx-db/src/diracx/db/sql/utils/base.py +++ b/diracx-db/src/diracx/db/sql/utils/base.py @@ -127,6 +127,18 @@ def available_urls(cls) -> dict[str, str]: db_url = os.environ[var_name] if db_url == "sqlite+aiosqlite:///:memory:": db_urls[db_name] = db_url + # pydantic does not allow for underscore in scheme + # so we do a special case + elif "_" in db_url.split(":")[0]: + # Validate the URL with a fake schema, and then store + # the original one + scheme_id = db_url.find(":") + fake_url = ( + db_url[:scheme_id].replace("_", "-") + db_url[scheme_id:] + ) + TypeAdapter(SqlalchemyDsn).validate_python(fake_url) + db_urls[db_name] = db_url + else: db_urls[db_name] = str( TypeAdapter(SqlalchemyDsn).validate_python(db_url)