mirror of
https://github.com/osm-search/Nominatim.git
synced 2026-02-26 11:08:13 +00:00
enable API use with psycopg 3
This commit is contained in:
@@ -14,9 +14,10 @@ from pathlib import Path
|
|||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
import sqlalchemy.ext.asyncio as sa_asyncio
|
import sqlalchemy.ext.asyncio as sa_asyncio
|
||||||
import asyncpg
|
|
||||||
|
|
||||||
from nominatim.db.sqlalchemy_schema import SearchTables
|
from nominatim.db.sqlalchemy_schema import SearchTables
|
||||||
|
from nominatim.db.async_core_library import PGCORE_LIB, PGCORE_ERROR
|
||||||
from nominatim.config import Configuration
|
from nominatim.config import Configuration
|
||||||
from nominatim.api.connection import SearchConnection
|
from nominatim.api.connection import SearchConnection
|
||||||
from nominatim.api.status import get_status, StatusResult
|
from nominatim.api.status import get_status, StatusResult
|
||||||
@@ -55,26 +56,22 @@ class NominatimAPIAsync:
|
|||||||
|
|
||||||
query = {k: v for k, v in dsn.items()
|
query = {k: v for k, v in dsn.items()
|
||||||
if k not in ('user', 'password', 'dbname', 'host', 'port')}
|
if k not in ('user', 'password', 'dbname', 'host', 'port')}
|
||||||
query['prepared_statement_cache_size'] = '0'
|
if PGCORE_LIB == 'asyncpg':
|
||||||
|
query['prepared_statement_cache_size'] = '0'
|
||||||
|
|
||||||
dburl = sa.engine.URL.create(
|
dburl = sa.engine.URL.create(
|
||||||
'postgresql+asyncpg',
|
f'postgresql+{PGCORE_LIB}',
|
||||||
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=query)
|
query=query)
|
||||||
engine = sa_asyncio.create_async_engine(
|
engine = sa_asyncio.create_async_engine(dburl, future=True)
|
||||||
dburl, future=True,
|
|
||||||
connect_args={'server_settings': {
|
|
||||||
'DateStyle': 'sql,european',
|
|
||||||
'max_parallel_workers_per_gather': '0'
|
|
||||||
}})
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
async with engine.begin() as conn:
|
async with engine.begin() as conn:
|
||||||
result = await conn.scalar(sa.text('SHOW server_version_num'))
|
result = await conn.scalar(sa.text('SHOW server_version_num'))
|
||||||
server_version = int(result)
|
server_version = int(result)
|
||||||
except asyncpg.PostgresError:
|
except (PGCORE_ERROR, sa.exc.OperationalError):
|
||||||
server_version = 0
|
server_version = 0
|
||||||
|
|
||||||
if server_version >= 110000:
|
if server_version >= 110000:
|
||||||
@@ -82,6 +79,7 @@ class NominatimAPIAsync:
|
|||||||
def _on_connect(dbapi_con: Any, _: Any) -> None:
|
def _on_connect(dbapi_con: Any, _: Any) -> None:
|
||||||
cursor = dbapi_con.cursor()
|
cursor = dbapi_con.cursor()
|
||||||
cursor.execute("SET jit_above_cost TO '-1'")
|
cursor.execute("SET jit_above_cost TO '-1'")
|
||||||
|
cursor.execute("SET max_parallel_workers_per_gather TO '0'")
|
||||||
# Make sure that all connections get the new settings
|
# Make sure that all connections get the new settings
|
||||||
await self.close()
|
await self.close()
|
||||||
|
|
||||||
@@ -124,7 +122,7 @@ class NominatimAPIAsync:
|
|||||||
try:
|
try:
|
||||||
async with self.begin() as conn:
|
async with self.begin() as conn:
|
||||||
status = await get_status(conn)
|
status = await get_status(conn)
|
||||||
except asyncpg.PostgresError:
|
except (PGCORE_ERROR, sa.exc.OperationalError):
|
||||||
return StatusResult(700, 'Database connection failed')
|
return StatusResult(700, 'Database connection failed')
|
||||||
|
|
||||||
return status
|
return status
|
||||||
|
|||||||
21
nominatim/db/async_core_library.py
Normal file
21
nominatim/db/async_core_library.py
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
#
|
||||||
|
# This file is part of Nominatim. (https://nominatim.org)
|
||||||
|
#
|
||||||
|
# Copyright (C) 2023 by the Nominatim developer community.
|
||||||
|
# For a full list of authors see the git log.
|
||||||
|
"""
|
||||||
|
Import the base libary to use with asynchronous SQLAlchemy.
|
||||||
|
"""
|
||||||
|
# pylint: disable=invalid-name
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
try:
|
||||||
|
import psycopg
|
||||||
|
PGCORE_LIB = 'psycopg'
|
||||||
|
PGCORE_ERROR: Any = psycopg.Error
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
import asyncpg
|
||||||
|
PGCORE_LIB = 'asyncpg'
|
||||||
|
PGCORE_ERROR = asyncpg.PostgresError
|
||||||
Reference in New Issue
Block a user