Skip to content

Commit 055b5e7

Browse files
author
John Bodley
committed
1 parent 1722c05 commit 055b5e7

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

doc/source/whatsnew/v1.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,7 @@ I/O
789789
- Bug in :meth:`~DataFrame.read_feather` was raising an `ArrowIOError` when reading an s3 or http file path (:issue:`29055`)
790790
- Bug in :meth:`read_parquet` was raising a ``FileNotFoundError`` when passed an s3 directory path. (:issue:`26388`)
791791
- Bug in :meth:`~DataFrame.to_parquet` was throwing an ``AttributeError`` when writing a partitioned parquet file to s3 (:issue:`27596`)
792+
- 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`)
792793

793794
Plotting
794795
^^^^^^^^

pandas/io/sql.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,9 @@ def run_transaction(self):
10791079

10801080
def execute(self, *args, **kwargs):
10811081
"""Simple passthrough to SQLAlchemy connectable"""
1082-
return self.connectable.execute(*args, **kwargs)
1082+
return self.connectable.execution_options(no_parameters=True).execute(
1083+
*args, **kwargs
1084+
)
10831085

10841086
def read_table(
10851087
self,

pandas/tests/io/test_sql.py

+22
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,11 @@
194194
"Name"=%(name)s AND "SepalLength"=%(length)s
195195
""",
196196
},
197+
"read_no_parameters_with_percent": {
198+
"sqlite": "SELECT * FROM iris WHERE Name LIKE '%'",
199+
"mysql": "SELECT * FROM iris WHERE `Name` LIKE '%'",
200+
"postgresql": "SELECT * FROM iris WHERE \"Name\" LIKE '%'",
201+
},
197202
"create_view": {
198203
"sqlite": """
199204
CREATE VIEW iris_view AS
@@ -424,6 +429,11 @@ def _read_sql_iris_named_parameter(self):
424429
iris_frame = self.pandasSQL.read_query(query, params=params)
425430
self._check_iris_loaded_frame(iris_frame)
426431

432+
def _read_sql_iris_no_parameter_with_percent(self):
433+
query = SQL_STRINGS["read_no_parameters_with_percent"][self.flavor]
434+
iris_frame = self.pandasSQL.read_query(query, params=None)
435+
self._check_iris_loaded_frame(iris_frame)
436+
427437
def _to_sql(self, method=None):
428438
self.drop_table("test_frame1")
429439

@@ -503,6 +513,12 @@ def sample(pd_table, conn, keys, data_iter):
503513
# Nuke table
504514
self.drop_table("test_frame1")
505515

516+
def _to_sql_with_percent(self):
517+
self.drop_table("test_frame1")
518+
self.pandasSQL.to_sql(pd.DataFrame({"%A": [1]}), "test_frame1")
519+
assert self.pandasSQL.has_table("test_frame1")
520+
self.drop_table("test_frame1")
521+
506522
def _roundtrip(self):
507523
self.drop_table("test_frame_roundtrip")
508524
self.pandasSQL.to_sql(self.test_frame1, "test_frame_roundtrip")
@@ -1275,6 +1291,9 @@ def test_read_sql_parameter(self):
12751291
def test_read_sql_named_parameter(self):
12761292
self._read_sql_iris_named_parameter()
12771293

1294+
def test_read_sql_no_parameter_with_percent(self):
1295+
self._read_sql_iris_no_parameter_with_percent()
1296+
12781297
def test_to_sql(self):
12791298
self._to_sql()
12801299

@@ -1296,6 +1315,9 @@ def test_to_sql_method_multi(self):
12961315
def test_to_sql_method_callable(self):
12971316
self._to_sql_method_callable()
12981317

1318+
def test_to_sql_with_percent(self):
1319+
self._to_sql_with_percent()
1320+
12991321
def test_create_table(self):
13001322
temp_conn = self.connect()
13011323
temp_frame = DataFrame(

0 commit comments

Comments
 (0)