mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	[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
			
			
This commit is contained in:
		| @@ -129,10 +129,10 @@ class DatabaseWrapper(BaseDatabaseWrapper): | |||||||
|                 conn_tz = get_parameter_status('TimeZone') |                 conn_tz = get_parameter_status('TimeZone') | ||||||
|  |  | ||||||
|             if conn_tz != tz: |             if conn_tz != tz: | ||||||
|                 # Set the time zone in autocommit mode (see #17062) |  | ||||||
|                 self.set_autocommit(True) |  | ||||||
|                 self.connection.cursor().execute( |                 self.connection.cursor().execute( | ||||||
|                         self.ops.set_time_zone_sql(), [tz]) |                         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) |         self.connection.set_isolation_level(self.isolation_level) | ||||||
|  |  | ||||||
|     def create_cursor(self): |     def create_cursor(self): | ||||||
|   | |||||||
| @@ -352,10 +352,25 @@ class PostgresNewConnectionTests(TestCase): | |||||||
|             tz = cursor.fetchone()[0] |             tz = cursor.fetchone()[0] | ||||||
|             self.assertEqual(new_tz, tz) |             self.assertEqual(new_tz, tz) | ||||||
|         finally: |         finally: | ||||||
|             try: |             new_connection.close() | ||||||
|                 new_connection.close() |  | ||||||
|             except DatabaseError: |     @unittest.skipUnless( | ||||||
|                 pass |         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 | # This test needs to run outside of a transaction, otherwise closing the | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user