mirror of
https://github.com/django/django.git
synced 2024-12-23 01:25:58 +00:00
Changed database connection duplication technique.
This new technique is more straightforward and compatible with test parallelization, where the effective database connection settings no longer match settings.DATABASES.
This commit is contained in:
parent
e8b49d4cc4
commit
05cea7fdbb
@ -1,3 +1,4 @@
|
|||||||
|
import copy
|
||||||
import time
|
import time
|
||||||
import warnings
|
import warnings
|
||||||
from collections import deque
|
from collections import deque
|
||||||
@ -622,3 +623,16 @@ class BaseDatabaseWrapper(object):
|
|||||||
func()
|
func()
|
||||||
finally:
|
finally:
|
||||||
self.run_on_commit = []
|
self.run_on_commit = []
|
||||||
|
|
||||||
|
def copy(self, alias=None, allow_thread_sharing=None):
|
||||||
|
"""
|
||||||
|
Return a copy of this connection.
|
||||||
|
|
||||||
|
For tests that require two connections to the same database.
|
||||||
|
"""
|
||||||
|
settings_dict = copy.deepcopy(self.settings_dict)
|
||||||
|
if alias is None:
|
||||||
|
alias = self.alias
|
||||||
|
if allow_thread_sharing is None:
|
||||||
|
allow_thread_sharing = self.allow_thread_sharing
|
||||||
|
return type(self)(settings_dict, alias, allow_thread_sharing)
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
# Unit and doctests for specific database backends.
|
# Unit and doctests for specific database backends.
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import copy
|
|
||||||
import datetime
|
import datetime
|
||||||
import re
|
import re
|
||||||
import threading
|
import threading
|
||||||
@ -10,7 +9,6 @@ import unittest
|
|||||||
import warnings
|
import warnings
|
||||||
from decimal import Decimal, Rounded
|
from decimal import Decimal, Rounded
|
||||||
|
|
||||||
from django.conf import settings
|
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.core.management.color import no_style
|
from django.core.management.color import no_style
|
||||||
from django.db import (
|
from django.db import (
|
||||||
@ -182,8 +180,8 @@ class PostgreSQLTests(TestCase):
|
|||||||
nodb_conn = connection._nodb_connection
|
nodb_conn = connection._nodb_connection
|
||||||
del connection._nodb_connection
|
del connection._nodb_connection
|
||||||
self.assertIsNotNone(nodb_conn.settings_dict['NAME'])
|
self.assertIsNotNone(nodb_conn.settings_dict['NAME'])
|
||||||
self.assertEqual(nodb_conn.settings_dict['NAME'], settings.DATABASES[DEFAULT_DB_ALIAS]['NAME'])
|
self.assertEqual(nodb_conn.settings_dict['NAME'], connection.settings_dict['NAME'])
|
||||||
# Check a RuntimeWarning nas been emitted
|
# Check a RuntimeWarning has been emitted
|
||||||
self.assertEqual(len(w), 1)
|
self.assertEqual(len(w), 1)
|
||||||
self.assertEqual(w[0].message.__class__, RuntimeWarning)
|
self.assertEqual(w[0].message.__class__, RuntimeWarning)
|
||||||
|
|
||||||
@ -219,9 +217,7 @@ class PostgreSQLTests(TestCase):
|
|||||||
PostgreSQL shouldn't roll back SET TIME ZONE, even if the first
|
PostgreSQL shouldn't roll back SET TIME ZONE, even if the first
|
||||||
transaction is rolled back (#17062).
|
transaction is rolled back (#17062).
|
||||||
"""
|
"""
|
||||||
databases = copy.deepcopy(settings.DATABASES)
|
new_connection = connection.copy()
|
||||||
new_connections = ConnectionHandler(databases)
|
|
||||||
new_connection = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Ensure the database default time zone is different than
|
# Ensure the database default time zone is different than
|
||||||
@ -258,10 +254,9 @@ class PostgreSQLTests(TestCase):
|
|||||||
The connection wrapper shouldn't believe that autocommit is enabled
|
The connection wrapper shouldn't believe that autocommit is enabled
|
||||||
after setting the time zone when AUTOCOMMIT is False (#21452).
|
after setting the time zone when AUTOCOMMIT is False (#21452).
|
||||||
"""
|
"""
|
||||||
databases = copy.deepcopy(settings.DATABASES)
|
new_connection = connection.copy()
|
||||||
databases[DEFAULT_DB_ALIAS]['AUTOCOMMIT'] = False
|
new_connection.settings_dict['AUTOCOMMIT'] = False
|
||||||
new_connections = ConnectionHandler(databases)
|
|
||||||
new_connection = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
try:
|
try:
|
||||||
# Open a database connection.
|
# Open a database connection.
|
||||||
new_connection.cursor()
|
new_connection.cursor()
|
||||||
@ -285,10 +280,8 @@ class PostgreSQLTests(TestCase):
|
|||||||
# Check the level on the psycopg2 connection, not the Django wrapper.
|
# Check the level on the psycopg2 connection, not the Django wrapper.
|
||||||
self.assertEqual(connection.connection.isolation_level, read_committed)
|
self.assertEqual(connection.connection.isolation_level, read_committed)
|
||||||
|
|
||||||
databases = copy.deepcopy(settings.DATABASES)
|
new_connection = connection.copy()
|
||||||
databases[DEFAULT_DB_ALIAS]['OPTIONS']['isolation_level'] = serializable
|
new_connection.settings_dict['OPTIONS']['isolation_level'] = serializable
|
||||||
new_connections = ConnectionHandler(databases)
|
|
||||||
new_connection = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
try:
|
try:
|
||||||
# Start a transaction so the isolation level isn't reported as 0.
|
# Start a transaction so the isolation level isn't reported as 0.
|
||||||
new_connection.set_autocommit(False)
|
new_connection.set_autocommit(False)
|
||||||
@ -748,8 +741,7 @@ class BackendTestCase(TransactionTestCase):
|
|||||||
"""
|
"""
|
||||||
old_queries_limit = BaseDatabaseWrapper.queries_limit
|
old_queries_limit = BaseDatabaseWrapper.queries_limit
|
||||||
BaseDatabaseWrapper.queries_limit = 3
|
BaseDatabaseWrapper.queries_limit = 3
|
||||||
new_connections = ConnectionHandler(settings.DATABASES)
|
new_connection = connection.copy()
|
||||||
new_connection = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
|
|
||||||
# Initialize the connection and clear initialization statements.
|
# Initialize the connection and clear initialization statements.
|
||||||
with new_connection.cursor():
|
with new_connection.cursor():
|
||||||
|
@ -2,9 +2,7 @@ from __future__ import unicode_literals
|
|||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
from django.conf import settings
|
from django.db import connection, models, transaction
|
||||||
from django.db import DEFAULT_DB_ALIAS, models, transaction
|
|
||||||
from django.db.utils import ConnectionHandler
|
|
||||||
from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature
|
from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
@ -24,8 +22,7 @@ class DeleteLockingTest(TransactionTestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# Create a second connection to the default database
|
# Create a second connection to the default database
|
||||||
new_connections = ConnectionHandler(settings.DATABASES)
|
self.conn2 = connection.copy()
|
||||||
self.conn2 = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
self.conn2.set_autocommit(False)
|
self.conn2.set_autocommit(False)
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
|
@ -5,9 +5,7 @@ import time
|
|||||||
|
|
||||||
from multiple_database.routers import TestRouter
|
from multiple_database.routers import TestRouter
|
||||||
|
|
||||||
from django.conf import settings
|
from django.db import DatabaseError, connection, router, transaction
|
||||||
from django.db import connection, router, transaction
|
|
||||||
from django.db.utils import DEFAULT_DB_ALIAS, ConnectionHandler, DatabaseError
|
|
||||||
from django.test import (
|
from django.test import (
|
||||||
TransactionTestCase, override_settings, skipIfDBFeature,
|
TransactionTestCase, override_settings, skipIfDBFeature,
|
||||||
skipUnlessDBFeature,
|
skipUnlessDBFeature,
|
||||||
@ -30,8 +28,7 @@ class SelectForUpdateTests(TransactionTestCase):
|
|||||||
|
|
||||||
# We need another database connection in transaction to test that one
|
# We need another database connection in transaction to test that one
|
||||||
# connection issuing a SELECT ... FOR UPDATE will block.
|
# connection issuing a SELECT ... FOR UPDATE will block.
|
||||||
new_connections = ConnectionHandler(settings.DATABASES)
|
self.new_connection = connection.copy()
|
||||||
self.new_connection = new_connections[DEFAULT_DB_ALIAS]
|
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
try:
|
try:
|
||||||
|
Loading…
Reference in New Issue
Block a user