diff --git a/pygeoapi/provider/sql.py b/pygeoapi/provider/sql.py index 121f48ac2..7a955eee4 100644 --- a/pygeoapi/provider/sql.py +++ b/pygeoapi/provider/sql.py @@ -71,6 +71,7 @@ from sqlalchemy.orm import Session, load_only from sqlalchemy.sql.expression import and_ from sqlalchemy.schema import Table +from sqlalchemy.engine import make_url from pygeoapi.crs import get_transform_from_spec, get_srid from pygeoapi.provider.base import ( @@ -679,6 +680,11 @@ def get_engine( port=int(port), database=database ) + else: + url = make_url(conn_str) + if url.drivername == url.get_backend_name(): + url = url.set(drivername=driver_name) + conn_str = url # Separate connection-pool tuning from DBAPI connect args. Pool keys are # applied to create_engine() directly; everything left in connect_args is diff --git a/tests/provider/test_postgresql_provider.py b/tests/provider/test_postgresql_provider.py index 06c88ce1d..3280534b0 100644 --- a/tests/provider/test_postgresql_provider.py +++ b/tests/provider/test_postgresql_provider.py @@ -1010,3 +1010,11 @@ def test_provider_count_false_with_resulttype_hits(config): # Assert assert results['numberMatched'] == 14776 + + +def test_get_engine_use_provider_driver(): + engine = postgresql_provider_module.get_engine( + 'postgresql+psycopg2', 'host', '5432', 'db', 'user', 'password', + 'postgresql://user:password@host:5432/db' + ) + assert engine.dialect.driver == 'psycopg2'