def fix_up_databases(databases):
"""Increase isolation level, use atomic requests.
Does not modify connections to non-PostgreSQL databases.
"""
# Remove keys with null values from databases.
databases.update({
alias: {
key: value for key, value in database.items()
if value is not None
}
for alias, database in databases.items()
})
# Ensure that transactions are configured correctly.
from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
for _, database in databases.items():
engine = database.get("ENGINE")
if engine == 'django.db.backends.postgresql_psycopg2':
options = database.setdefault("OPTIONS", {})
# Explicitly set the transaction isolation level. MAAS needs a
# particular transaction isolation level, and it enforces it.
if "isolation_level" in options:
isolation_level = options["isolation_level"]
if isolation_level != ISOLATION_LEVEL_REPEATABLE_READ:
warnings.warn(
"isolation_level is set to %r; overriding to %r."
% (isolation_level, ISOLATION_LEVEL_REPEATABLE_READ),
RuntimeWarning, 2)
options["isolation_level"] = ISOLATION_LEVEL_REPEATABLE_READ
# Enable ATOMIC_REQUESTS: MAAS manages transactions across the
# whole request/response lifecycle including middleware (Django,
# in its infinite wisdom, does not). However we enable this
# setting to ensure that views run within _savepoints_ so that
# middleware exception handlers that suppress exceptions don't
# inadvertently allow failed requests to be committed.
if "ATOMIC_REQUESTS" in database:
atomic_requests = database["ATOMIC_REQUESTS"]
if not atomic_requests:
warnings.warn(
"ATOMIC_REQUESTS is set to %r; overriding to True."
% (atomic_requests,), RuntimeWarning, 2)
database["ATOMIC_REQUESTS"] = True
评论列表
文章目录