mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
disable prepared statements
Prepared statements do not work well with the partial indexes that Nominatim uses because all Python constants are replaced with parameters. A query like: placex.select().where(placex.c.rank_address.between(4, 25) gets translated into a prepared query with two parameters: SELECT * FROM placex WHERE rank_address BETWEEN %s and %s And this does not work with a partial index of: CREATE INDEX on placex(geometry) WHERE rank_address between 4 and 25
This commit is contained in:
@@ -53,13 +53,16 @@ class NominatimAPIAsync:
|
|||||||
|
|
||||||
dsn = self.config.get_database_params()
|
dsn = self.config.get_database_params()
|
||||||
|
|
||||||
|
query = {k: v for k, v in dsn.items()
|
||||||
|
if k not in ('user', 'password', 'dbname', 'host', 'port')}
|
||||||
|
query['prepared_statement_cache_size'] = '0'
|
||||||
|
|
||||||
dburl = sa.engine.URL.create(
|
dburl = sa.engine.URL.create(
|
||||||
'postgresql+asyncpg',
|
'postgresql+asyncpg',
|
||||||
database=dsn.get('dbname'),
|
database=dsn.get('dbname'),
|
||||||
username=dsn.get('user'), password=dsn.get('password'),
|
username=dsn.get('user'), password=dsn.get('password'),
|
||||||
host=dsn.get('host'), port=int(dsn['port']) if 'port' in dsn else None,
|
host=dsn.get('host'), port=int(dsn['port']) if 'port' in dsn else None,
|
||||||
query={k: v for k, v in dsn.items()
|
query=query)
|
||||||
if k not in ('user', 'password', 'dbname', 'host', 'port')})
|
|
||||||
engine = sa_asyncio.create_async_engine(
|
engine = sa_asyncio.create_async_engine(
|
||||||
dburl, future=True,
|
dburl, future=True,
|
||||||
connect_args={'server_settings': {
|
connect_args={'server_settings': {
|
||||||
|
|||||||
Reference in New Issue
Block a user