]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
Fix psycopg2 pre_ping with autocommit
authorFederico Caselli <cfederico87@gmail.com>
Mon, 11 Apr 2022 21:19:16 +0000 (23:19 +0200)
committerFederico Caselli <cfederico87@gmail.com>
Wed, 13 Apr 2022 20:28:30 +0000 (22:28 +0200)
Fixed an issue what would cause autocommit mode to be reset
when using pre_ping in conjunction engine level autocommit
on the psycopg2 driver.

Fixes: #7930
Change-Id: I4cccaf1b7f8cbacd853689458080784114fcc390
(cherry picked from commit 363b68e08e9ceed4ce6821f5fd48ab32bdfd807c)

doc/build/changelog/unreleased_14/7930.rst [new file with mode: 0644]
lib/sqlalchemy/dialects/postgresql/psycopg2.py
test/dialect/postgresql/test_dialect.py

diff --git a/doc/build/changelog/unreleased_14/7930.rst b/doc/build/changelog/unreleased_14/7930.rst
new file mode 100644 (file)
index 0000000..bf4f998
--- /dev/null
@@ -0,0 +1,7 @@
+.. change::
+    :tags: bug, postgresql
+    :tickets: 7930
+
+    Fixed an issue what would cause autocommit mode to be reset
+    when using pre_ping in conjunction engine level autocommit
+    on the psycopg2 driver.
index adebc9b67693ad2dd9c4e1ba1c23e4b483a997e4..f7121a82a1a3962a6962a68c8b36dce2b4d9e88d 100644 (file)
@@ -835,15 +835,17 @@ class PGDialect_psycopg2(PGDialect):
 
     def do_ping(self, dbapi_connection):
         cursor = None
+        before_autocommit = dbapi_connection.autocommit
         try:
-            dbapi_connection.autocommit = True
+            if not before_autocommit:
+                dbapi_connection.autocommit = True
             cursor = dbapi_connection.cursor()
             try:
                 cursor.execute(self._dialect_specific_select_one)
             finally:
                 cursor.close()
-                if not dbapi_connection.closed:
-                    dbapi_connection.autocommit = False
+                if not before_autocommit and not dbapi_connection.closed:
+                    dbapi_connection.autocommit = before_autocommit
         except self.dbapi.Error as err:
             if self.is_disconnect(err, dbapi_connection, cursor):
                 return False
index 1d797a697d72d5cc880c39e826b511f49c783d31..8aa903649562a169254eb191970137b1bea70923 100644 (file)
@@ -1095,6 +1095,23 @@ class MiscBackendTest(
                 dbapi_conn.rollback()
             eq_(val, "off")
 
+    @testing.combinations((True,), (False,), argnames="autocommit")
+    def test_autocommit_pre_ping(self, testing_engine, autocommit):
+        engine = testing_engine(
+            options={
+                "isolation_level": "AUTOCOMMIT"
+                if autocommit
+                else "SERIALIZABLE",
+                "pool_pre_ping": True,
+            }
+        )
+        for i in range(4):
+            with engine.connect() as conn:
+                conn.execute(text("select 1")).scalar()
+
+                dbapi_conn = conn.connection.dbapi_connection
+                eq_(dbapi_conn.autocommit, autocommit)
+
     def test_deferrable_flag_engine(self):
         engine = engines.testing_engine(
             options={