From af3ae05f31cb7ee47a8872c75adf9975015aa050 Mon Sep 17 00:00:00 2001 From: John Bodley Date: Sat, 16 May 2020 09:50:38 -0700 Subject: [PATCH] BUG: #34211 --- doc/source/whatsnew/v1.1.0.rst | 1 + pandas/io/sql.py | 4 +++- pandas/tests/io/test_sql.py | 10 ++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 4605c14643fa2..de4f8e01e6105 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -790,6 +790,7 @@ I/O - Bug in :meth:`~DataFrame.read_feather` was raising an `ArrowIOError` when reading an s3 or http file path (:issue:`29055`) - Bug in :meth:`read_parquet` was raising a ``FileNotFoundError`` when passed an s3 directory path. (:issue:`26388`) - Bug in :meth:`~DataFrame.to_parquet` was throwing an ``AttributeError`` when writing a partitioned parquet file to s3 (:issue:`27596`) +- Bug in :meth:`~SQLDatabase.execute` was raising a ``ProgrammingError`` for some DB-API drivers when the SQL statement contained the `%` character and no parameters were present (:issue:`34211`) Plotting ^^^^^^^^ diff --git a/pandas/io/sql.py b/pandas/io/sql.py index c2915f6fcfa7a..21868de9ec506 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1079,7 +1079,9 @@ def run_transaction(self): def execute(self, *args, **kwargs): """Simple passthrough to SQLAlchemy connectable""" - return self.connectable.execute(*args, **kwargs) + return self.connectable.execution_options(no_parameters=True).execute( + *args, **kwargs + ) def read_table( self, diff --git a/pandas/tests/io/test_sql.py b/pandas/tests/io/test_sql.py index 382d4e611c837..bd53785e89bfe 100644 --- a/pandas/tests/io/test_sql.py +++ b/pandas/tests/io/test_sql.py @@ -194,6 +194,11 @@ "Name"=%(name)s AND "SepalLength"=%(length)s """, }, + "read_no_parameters_with_percent": { + "sqlite": "SELECT * FROM iris WHERE Name LIKE '%'", + "mysql": "SELECT * FROM iris WHERE `Name` LIKE '%'", + "postgresql": "SELECT * FROM iris WHERE \"Name\" LIKE '%'", + }, "create_view": { "sqlite": """ CREATE VIEW iris_view AS @@ -424,6 +429,11 @@ def _read_sql_iris_named_parameter(self): iris_frame = self.pandasSQL.read_query(query, params=params) self._check_iris_loaded_frame(iris_frame) + def _read_sql_iris_no_parameter_with_percent(self): + query = SQL_STRINGS["read_no_parameters_with_percent"][self.flavor] + iris_frame = self.pandasSQL.read_query(query, params=None) + self._check_iris_loaded_frame(iris_frame) + def _to_sql(self, method=None): self.drop_table("test_frame1")