Skip to content

Commit

Permalink
Fix issue caused by improper handling of invalid database configurati…
Browse files Browse the repository at this point in the history
…ons.

This change enables dynamic database dialect configurations through
Pydantic by ignoring attributes that are irrelevant to a given dialect.
  • Loading branch information
aholmes committed Mar 15, 2024
1 parent aba1845 commit 50d4d05
Showing 1 changed file with 30 additions and 1 deletion.
31 changes: 30 additions & 1 deletion src/database/BL_Python/database/config.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,45 @@
from BL_Python.programming.collections.dict import AnyDict
from BL_Python.programming.config import AbstractConfig
from pydantic import BaseModel
from pydantic.config import ConfigDict


class DatabaseConnectArgsConfig(BaseModel):
# allow any values, as this type is not
# specifically the type to be used elsewhere
model_config = ConfigDict(extra="allow")


class PostgreSQLDatabaseConnectArgsConfig(DatabaseConnectArgsConfig):
# ignore anything that DatabaseConnectArgsConfig
# allowed to be set, except for any other attributes
# of this class, which will end up assigned through
# the instatiation of the __init__ override of DatabaseConfig
model_config = ConfigDict(extra="ignore")

sslmode: str = ""
options: str = ""


class SQLiteDatabaseConnectArgsConfig(DatabaseConnectArgsConfig):
model_config = ConfigDict(extra="ignore")


class DatabaseConfig(BaseModel, AbstractConfig):
def __init__(self, **data: AnyDict):
super().__init__(**data)

model_data = self.connect_args.model_dump() if self.connect_args else {}
if self.connection_string.startswith("sqlite://"):
self.connect_args = SQLiteDatabaseConnectArgsConfig(**model_data)
elif self.connection_string.startswith("postgresql://"):
self.connect_args = PostgreSQLDatabaseConnectArgsConfig(**model_data)

connection_string: str = "sqlite:///:memory:"
sqlalchemy_echo: bool = False
connect_args: DatabaseConnectArgsConfig | None = None
# the static field allows Pydantic to store
# values from a dictionary
connect_args: DatabaseConnectArgsConfig | None


class Config(BaseModel, AbstractConfig):
Expand Down

0 comments on commit 50d4d05

Please sign in to comment.