details: https://code.tryton.org/tryton/commit/20781078a519
branch: default
user: Cédric Krier <[email protected]>
date: Mon Jul 06 19:34:24 2026 +0200
description:
Use NullConnectionPool for the default database
The default database is template1 which is usually used to create new
database.
Keeping a pool of connection open on it prevents the creation of new
database
because exclusive access is needed on the template.
Closes #14935
diffstat:
trytond/pyproject.toml | 2 +-
trytond/trytond/backend/postgresql/database.py | 12 +++++++++---
2 files changed, 10 insertions(+), 4 deletions(-)
diffs (52 lines):
diff -r f9fb03a42e7c -r 20781078a519 trytond/pyproject.toml
--- a/trytond/pyproject.toml Mon Jul 06 19:15:08 2026 +0200
+++ b/trytond/pyproject.toml Mon Jul 06 19:34:24 2026 +0200
@@ -37,7 +37,7 @@
[project.optional-dependencies]
Levenshtein = ['python-Levenshtein']
-PostgreSQL = ['psycopg[pool] >= 3']
+PostgreSQL = ['psycopg[pool] >= 3.1']
barcode = ['python-barcode[images]']
completion = ['argcomplete']
coroutine = ['gevent >= 1.1']
diff -r f9fb03a42e7c -r 20781078a519
trytond/trytond/backend/postgresql/database.py
--- a/trytond/trytond/backend/postgresql/database.py Mon Jul 06 19:15:08
2026 +0200
+++ b/trytond/trytond/backend/postgresql/database.py Mon Jul 06 19:34:24
2026 +0200
@@ -19,7 +19,7 @@
from psycopg import connect, rows
from psycopg.errors import QueryCanceled as DatabaseTimeoutError
from psycopg.sql import SQL, Identifier
-from psycopg_pool import ConnectionPool
+from psycopg_pool import ConnectionPool, NullConnectionPool
from sql import Cast, Flavor, For, Literal, Table
from sql.aggregate import Count
from sql.conditionals import Coalesce
@@ -221,6 +221,8 @@
minconn = config.getint('database', 'minconn', default=1)
maxconn = config.getint('database', 'maxconn', default=64)
+ if name == _default_name:
+ minconn = 0
timeout = config.getint('database', 'timeout')
last_clean = (now - cls._clean_last).total_seconds()
if last_clean > timeout:
@@ -236,12 +238,16 @@
kwargs = cls._connection_params(name)
kwargs['cursor_factory'] = LoggingCursor
conninfo = kwargs.pop('conninfo')
+ if name == _default_name:
+ Pool = NullConnectionPool
+ else:
+ Pool = ConnectionPool
try:
- inst._connpool = ConnectionPool(
+ inst._connpool = Pool(
conninfo,
kwargs=kwargs,
open=True,
- check=ConnectionPool.check_connection,
+ check=Pool.check_connection,
min_size=minconn, max_size=maxconn)
except Exception:
logger.error(