diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index 17a830788be3f..5ef1f9dea5091 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -872,6 +872,7 @@ I/O - 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:`~DataFrame.to_excel` could not handle the column name `render` and was raising an ``KeyError`` (:issue:`34331`) +- 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 bf050d10d90f6..991d222bfae1f 100644 --- a/pandas/io/sql.py +++ b/pandas/io/sql.py @@ -1162,7 +1162,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")