Skip to content

Commit fc16f1f

Browse files
CLN: remove deprecated io.sql uquery and tquery functions (pandas-dev#13616)
* CLN: remove deprecated io.sql uquery and tquery functions * linter -> remove ununsed imports
1 parent 0fe5a34 commit fc16f1f

File tree

3 files changed

+25
-232
lines changed

3 files changed

+25
-232
lines changed

doc/source/whatsnew/v0.19.0.txt

+3
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,9 @@ Removal of prior version deprecations/changes
622622

623623
Now legacy time rules raises ``ValueError``. For the list of currently supported offsets, see :ref:`here <timeseries.alias>`
624624

625+
- The ``tquery`` and ``uquery`` functions in the ``pandas.io.sql`` module are removed (:issue:`5950`).
626+
627+
625628
.. _whatsnew_0190.performance:
626629

627630
Performance Improvements

pandas/io/sql.py

+1-121
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from datetime import datetime, date, time
99

1010
import warnings
11-
import traceback
1211
import re
1312
import numpy as np
1413

@@ -18,7 +17,7 @@
1817
from pandas.types.common import (is_list_like,
1918
is_datetime64tz_dtype)
2019

21-
from pandas.compat import (lzip, map, zip, raise_with_traceback,
20+
from pandas.compat import (map, zip, raise_with_traceback,
2221
string_types, text_type)
2322
from pandas.core.api import DataFrame, Series
2423
from pandas.core.base import PandasObject
@@ -192,125 +191,6 @@ def execute(sql, con, cur=None, params=None):
192191
return pandas_sql.execute(*args)
193192

194193

195-
# -----------------------------------------------------------------------------
196-
# -- Deprecated tquery and uquery
197-
198-
def _safe_fetch(cur):
199-
try:
200-
result = cur.fetchall()
201-
if not isinstance(result, list):
202-
result = list(result)
203-
return result
204-
except Exception as e: # pragma: no cover
205-
excName = e.__class__.__name__
206-
if excName == 'OperationalError':
207-
return []
208-
209-
210-
def tquery(sql, con=None, cur=None, retry=True):
211-
"""
212-
DEPRECATED. Returns list of tuples corresponding to each row in given sql
213-
query.
214-
215-
If only one column selected, then plain list is returned.
216-
217-
To obtain the same result in the future, you can use the following:
218-
219-
>>> execute(sql, con, params).fetchall()
220-
221-
Parameters
222-
----------
223-
sql: string
224-
SQL query to be executed
225-
con: DBAPI2 connection, default: None
226-
cur: deprecated, cursor is obtained from connection, default: None
227-
retry: boolean value to specify whether to retry after failure
228-
default: True
229-
230-
Returns
231-
-------
232-
Results Iterable
233-
234-
"""
235-
warnings.warn(
236-
"tquery is deprecated, and will be removed in future versions. "
237-
"You can use ``execute(...).fetchall()`` instead.",
238-
FutureWarning, stacklevel=2)
239-
240-
cur = execute(sql, con, cur=cur)
241-
result = _safe_fetch(cur)
242-
243-
if con is not None:
244-
try:
245-
cur.close()
246-
con.commit()
247-
except Exception as e:
248-
excName = e.__class__.__name__
249-
if excName == 'OperationalError': # pragma: no cover
250-
print('Failed to commit, may need to restart interpreter')
251-
else:
252-
raise
253-
254-
traceback.print_exc()
255-
if retry:
256-
return tquery(sql, con=con, retry=False)
257-
258-
if result and len(result[0]) == 1:
259-
# python 3 compat
260-
result = list(lzip(*result)[0])
261-
elif result is None: # pragma: no cover
262-
result = []
263-
264-
return result
265-
266-
267-
def uquery(sql, con=None, cur=None, retry=True, params=None):
268-
"""
269-
DEPRECATED. Does the same thing as tquery, but instead of returning
270-
results, it returns the number of rows affected. Good for update queries.
271-
272-
To obtain the same result in the future, you can use the following:
273-
274-
>>> execute(sql, con).rowcount
275-
276-
Parameters
277-
----------
278-
sql: string
279-
SQL query to be executed
280-
con: DBAPI2 connection, default: None
281-
cur: deprecated, cursor is obtained from connection, default: None
282-
retry: boolean value to specify whether to retry after failure
283-
default: True
284-
params: list or tuple, optional, default: None
285-
List of parameters to pass to execute method.
286-
287-
Returns
288-
-------
289-
Number of affected rows
290-
291-
"""
292-
warnings.warn(
293-
"uquery is deprecated, and will be removed in future versions. "
294-
"You can use ``execute(...).rowcount`` instead.",
295-
FutureWarning, stacklevel=2)
296-
297-
cur = execute(sql, con, cur=cur, params=params)
298-
299-
result = cur.rowcount
300-
try:
301-
con.commit()
302-
except Exception as e:
303-
excName = e.__class__.__name__
304-
if excName != 'OperationalError':
305-
raise
306-
307-
traceback.print_exc()
308-
if retry:
309-
print('Looks like your connection failed, reconnecting...')
310-
return uquery(sql, con, retry=False)
311-
return result
312-
313-
314194
# -----------------------------------------------------------------------------
315195
# -- Read and write to DataFrames
316196

pandas/io/tests/test_sql.py

+21-111
Original file line numberDiff line numberDiff line change
@@ -1070,17 +1070,6 @@ def test_get_schema2(self):
10701070
create_sql = sql.get_schema(self.test_frame1, 'test')
10711071
self.assertTrue('CREATE' in create_sql)
10721072

1073-
def test_tquery(self):
1074-
with tm.assert_produces_warning(FutureWarning):
1075-
iris_results = sql.tquery("SELECT * FROM iris", con=self.conn)
1076-
row = iris_results[0]
1077-
tm.equalContents(row, [5.1, 3.5, 1.4, 0.2, 'Iris-setosa'])
1078-
1079-
def test_uquery(self):
1080-
with tm.assert_produces_warning(FutureWarning):
1081-
rows = sql.uquery("SELECT * FROM iris LIMIT 1", con=self.conn)
1082-
self.assertEqual(rows, -1)
1083-
10841073
def _get_sqlite_column_type(self, schema, column):
10851074

10861075
for col in schema.split('\n'):
@@ -2091,6 +2080,15 @@ def format_query(sql, *args):
20912080
return sql % tuple(processed_args)
20922081

20932082

2083+
def tquery(query, con=None, cur=None):
2084+
"""Replace removed sql.tquery function"""
2085+
res = sql.execute(query, con=con, cur=cur).fetchall()
2086+
if res is None:
2087+
return None
2088+
else:
2089+
return list(res)
2090+
2091+
20942092
def _skip_if_no_pymysql():
20952093
try:
20962094
import pymysql # noqa
@@ -2120,7 +2118,7 @@ def test_write_row_by_row(self):
21202118
ins = "INSERT INTO test VALUES (%s, %s, %s, %s)"
21212119
for idx, row in frame.iterrows():
21222120
fmt_sql = format_query(ins, *row)
2123-
sql.tquery(fmt_sql, cur=cur)
2121+
tquery(fmt_sql, cur=cur)
21242122

21252123
self.conn.commit()
21262124

@@ -2200,7 +2198,7 @@ def test_execute_closed_connection(self):
22002198
self.conn.close()
22012199
try:
22022200
sys.stdout = StringIO()
2203-
self.assertRaises(Exception, sql.tquery, "select * from test",
2201+
self.assertRaises(Exception, tquery, "select * from test",
22042202
con=self.conn)
22052203
finally:
22062204
sys.stdout = sys.__stdout__
@@ -2232,42 +2230,6 @@ def _check_roundtrip(self, frame):
22322230
expected.index.name = 'Idx'
22332231
tm.assert_frame_equal(expected, result)
22342232

2235-
def test_tquery(self):
2236-
frame = tm.makeTimeDataFrame()
2237-
sql.to_sql(frame, name='test_table', con=self.conn, index=False)
2238-
result = sql.tquery("select A from test_table", self.conn)
2239-
expected = Series(frame.A.values, frame.index) # not to have name
2240-
result = Series(result, frame.index)
2241-
tm.assert_series_equal(result, expected)
2242-
2243-
try:
2244-
sys.stdout = StringIO()
2245-
self.assertRaises(sql.DatabaseError, sql.tquery,
2246-
'select * from blah', con=self.conn)
2247-
2248-
self.assertRaises(sql.DatabaseError, sql.tquery,
2249-
'select * from blah', con=self.conn, retry=True)
2250-
finally:
2251-
sys.stdout = sys.__stdout__
2252-
2253-
def test_uquery(self):
2254-
frame = tm.makeTimeDataFrame()
2255-
sql.to_sql(frame, name='test_table', con=self.conn, index=False)
2256-
stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)'
2257-
self.assertEqual(sql.uquery(stmt, con=self.conn), 1)
2258-
2259-
try:
2260-
sys.stdout = StringIO()
2261-
2262-
self.assertRaises(sql.DatabaseError, sql.tquery,
2263-
'insert into blah values (1)', con=self.conn)
2264-
2265-
self.assertRaises(sql.DatabaseError, sql.tquery,
2266-
'insert into blah values (1)', con=self.conn,
2267-
retry=True)
2268-
finally:
2269-
sys.stdout = sys.__stdout__
2270-
22712233
def test_keyword_as_column_names(self):
22722234
df = DataFrame({'From': np.ones(5)})
22732235
sql.to_sql(df, con=self.conn, name='testkeywords', index=False)
@@ -2324,22 +2286,22 @@ def clean_up(test_table_to_drop):
23242286
# test if_exists='replace'
23252287
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
23262288
if_exists='replace', index=False)
2327-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2289+
self.assertEqual(tquery(sql_select, con=self.conn),
23282290
[(1, 'A'), (2, 'B')])
23292291
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
23302292
if_exists='replace', index=False)
2331-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2293+
self.assertEqual(tquery(sql_select, con=self.conn),
23322294
[(3, 'C'), (4, 'D'), (5, 'E')])
23332295
clean_up(table_name)
23342296

23352297
# test if_exists='append'
23362298
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
23372299
if_exists='fail', index=False)
2338-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2300+
self.assertEqual(tquery(sql_select, con=self.conn),
23392301
[(1, 'A'), (2, 'B')])
23402302
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
23412303
if_exists='append', index=False)
2342-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2304+
self.assertEqual(tquery(sql_select, con=self.conn),
23432305
[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')])
23442306
clean_up(table_name)
23452307

@@ -2445,7 +2407,7 @@ def test_write_row_by_row(self):
24452407
ins = "INSERT INTO test VALUES (%s, %s, %s, %s)"
24462408
for idx, row in frame.iterrows():
24472409
fmt_sql = format_query(ins, *row)
2448-
sql.tquery(fmt_sql, cur=cur)
2410+
tquery(fmt_sql, cur=cur)
24492411

24502412
self.conn.commit()
24512413

@@ -2554,7 +2516,7 @@ def test_execute_closed_connection(self):
25542516
self.conn.close()
25552517
try:
25562518
sys.stdout = StringIO()
2557-
self.assertRaises(Exception, sql.tquery, "select * from test",
2519+
self.assertRaises(Exception, tquery, "select * from test",
25582520
con=self.conn)
25592521
finally:
25602522
sys.stdout = sys.__stdout__
@@ -2603,58 +2565,6 @@ def _check_roundtrip(self, frame):
26032565
expected.index.names = result.index.names
26042566
tm.assert_frame_equal(expected, result)
26052567

2606-
def test_tquery(self):
2607-
try:
2608-
import pymysql # noqa
2609-
except ImportError:
2610-
raise nose.SkipTest("no pymysql")
2611-
frame = tm.makeTimeDataFrame()
2612-
drop_sql = "DROP TABLE IF EXISTS test_table"
2613-
cur = self.conn.cursor()
2614-
cur.execute(drop_sql)
2615-
sql.to_sql(frame, name='test_table',
2616-
con=self.conn, index=False)
2617-
result = sql.tquery("select A from test_table", self.conn)
2618-
expected = Series(frame.A.values, frame.index) # not to have name
2619-
result = Series(result, frame.index)
2620-
tm.assert_series_equal(result, expected)
2621-
2622-
try:
2623-
sys.stdout = StringIO()
2624-
self.assertRaises(sql.DatabaseError, sql.tquery,
2625-
'select * from blah', con=self.conn)
2626-
2627-
self.assertRaises(sql.DatabaseError, sql.tquery,
2628-
'select * from blah', con=self.conn, retry=True)
2629-
finally:
2630-
sys.stdout = sys.__stdout__
2631-
2632-
def test_uquery(self):
2633-
try:
2634-
import pymysql # noqa
2635-
except ImportError:
2636-
raise nose.SkipTest("no pymysql")
2637-
frame = tm.makeTimeDataFrame()
2638-
drop_sql = "DROP TABLE IF EXISTS test_table"
2639-
cur = self.conn.cursor()
2640-
cur.execute(drop_sql)
2641-
sql.to_sql(frame, name='test_table',
2642-
con=self.conn, index=False)
2643-
stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)'
2644-
self.assertEqual(sql.uquery(stmt, con=self.conn), 1)
2645-
2646-
try:
2647-
sys.stdout = StringIO()
2648-
2649-
self.assertRaises(sql.DatabaseError, sql.tquery,
2650-
'insert into blah values (1)', con=self.conn)
2651-
2652-
self.assertRaises(sql.DatabaseError, sql.tquery,
2653-
'insert into blah values (1)', con=self.conn,
2654-
retry=True)
2655-
finally:
2656-
sys.stdout = sys.__stdout__
2657-
26582568
def test_keyword_as_column_names(self):
26592569
_skip_if_no_pymysql()
26602570
df = DataFrame({'From': np.ones(5)})
@@ -2698,22 +2608,22 @@ def clean_up(test_table_to_drop):
26982608
# test if_exists='replace'
26992609
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
27002610
if_exists='replace', index=False)
2701-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2611+
self.assertEqual(tquery(sql_select, con=self.conn),
27022612
[(1, 'A'), (2, 'B')])
27032613
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
27042614
if_exists='replace', index=False)
2705-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2615+
self.assertEqual(tquery(sql_select, con=self.conn),
27062616
[(3, 'C'), (4, 'D'), (5, 'E')])
27072617
clean_up(table_name)
27082618

27092619
# test if_exists='append'
27102620
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
27112621
if_exists='fail', index=False)
2712-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2622+
self.assertEqual(tquery(sql_select, con=self.conn),
27132623
[(1, 'A'), (2, 'B')])
27142624
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
27152625
if_exists='append', index=False)
2716-
self.assertEqual(sql.tquery(sql_select, con=self.conn),
2626+
self.assertEqual(tquery(sql_select, con=self.conn),
27172627
[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')])
27182628
clean_up(table_name)
27192629

0 commit comments

Comments
 (0)