-
Notifications
You must be signed in to change notification settings - Fork 260
Support for connection params in Database in addition to the database urlΒ #69
Description
There's a small proposal/question about the details for contenting the DB.
There might be a situation where the host might have a complex address, particularly GCP has something like:
/<cloudsql>/<project>:<region>:<db_instance>
Generally, it was solved being passed as a query param unix_socket=<host>/.s.PGSQL.5432 to the sqlalchemy engine.
It doesn't work with asyncpg as it tries to parse the db url and the : char violates the parsing logic (when such host is part of the url or passed as environment variable) or the host is empty str when it's passed as unix_socket param.
But asyncpg can take connections params separately https://magicstack.github.io/asyncpg/current/api/index.html#connection. Params have higher precedence over the url parsing, so they can take place.
I haven't come up with a great idea yet, but it might be done as
class PostgresBackend | DatabaseBackend:
def __init__(self, database_url: typing.Union[DatabaseURL, str], params: typing.Dict) -> None:
self._database_url = DatabaseURL(database_url)
...
self._params = params
async def connect(self) -> None:
assert self._pool is None, "DatabaseBackend is already running"
kwargs = self._get_connection_kwargs()
kwargs.update(self._params)
self._pool = await asyncpg.create_pool(str(self._database_url), **kwargs)
Would it be possible to consider?
Happy to create a PR with a reasonable solution.