summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAymeric Augustin <aymeric.augustin@m4x.org>2014-01-12 18:26:20 +0100
committerAymeric Augustin <aymeric.augustin@m4x.org>2014-01-12 18:47:03 +0100
commitcb4a000adbb750da62daab318a9f4da8e3d4fdcd (patch)
tree030e983a50fc5eef6c42c8ca029609f6ccfc3d83
parentb79bf9c7a9c1bc0e3cf0c5c4b0d8191a3033530b (diff)
[1.6.x] Fixed #21452 -- Non-autocommit connections to PostgreSQL.
When settings.DATABASES['default']['AUTOCOMMIT'] = False, the connection wasn't in autocommit mode but Django pretended it was. Thanks Anssi for analysing this issue. Refs #17062. Backport of 1afe7488 from master
-rw-r--r--django/db/backends/postgresql_psycopg2/base.py4
-rw-r--r--tests/backends/tests.py23
2 files changed, 21 insertions, 6 deletions
diff --git a/django/db/backends/postgresql_psycopg2/base.py b/django/db/backends/postgresql_psycopg2/base.py
index 6ed2cfcc7c..ec2b71c3a1 100644
--- a/django/db/backends/postgresql_psycopg2/base.py
+++ b/django/db/backends/postgresql_psycopg2/base.py
@@ -129,10 +129,10 @@ class DatabaseWrapper(BaseDatabaseWrapper):
conn_tz = get_parameter_status('TimeZone')
if conn_tz != tz:
- # Set the time zone in autocommit mode (see #17062)
- self.set_autocommit(True)
self.connection.cursor().execute(
self.ops.set_time_zone_sql(), [tz])
+ # Commit after setting the time zone (see #17062)
+ self.connection.commit()
self.connection.set_isolation_level(self.isolation_level)
def create_cursor(self):
diff --git a/tests/backends/tests.py b/tests/backends/tests.py
index be0c3a418f..90794a5472 100644
--- a/tests/backends/tests.py
+++ b/tests/backends/tests.py
@@ -352,10 +352,25 @@ class PostgresNewConnectionTests(TestCase):
tz = cursor.fetchone()[0]
self.assertEqual(new_tz, tz)
finally:
- try:
- new_connection.close()
- except DatabaseError:
- pass
+ new_connection.close()
+
+ @unittest.skipUnless(
+ connection.vendor == 'postgresql',
+ "This test applies only to PostgreSQL")
+ def test_connect_non_autocommit(self):
+ """
+ The connection wrapper shouldn't believe that autocommit is enabled
+ after setting the time zone when AUTOCOMMIT is False (#21452).
+ """
+ databases = copy.deepcopy(settings.DATABASES)
+ new_connections = ConnectionHandler(databases)
+ new_connection = new_connections[DEFAULT_DB_ALIAS]
+ try:
+ new_connection.settings_dict['AUTOCOMMIT'] = False
+ cursor = new_connection.cursor()
+ self.assertFalse(new_connection.get_autocommit())
+ finally:
+ new_connection.close()
# This test needs to run outside of a transaction, otherwise closing the