Skip to content

Commit f791b1b

Browse files
jorisvandenbosschecldy
authored andcommitted
DEPR: removal of deprecated sql functions
Start for removing some of the deprecated functions. Other functions to add: `write_frame`, `tquery`, `uquery` Author: Joris Van den Bossche <[email protected]> Closes pandas-dev#12205 from jorisvandenbossche/remove-depr-sql and squashes the following commits: b097dba [Joris Van den Bossche] DEPR: removal of deprecated write_frame function 541e0e7 [Joris Van den Bossche] DEPR: removal of deprecated pd.io.sql.read_frame/frame_query functions
1 parent 817ae30 commit f791b1b

File tree

3 files changed

+52
-130
lines changed

3 files changed

+52
-130
lines changed

doc/source/whatsnew/v0.18.0.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -695,7 +695,9 @@ Removal of prior version deprecations/changes
695695
- Removal of ``expanding_corr_pairwise`` in favor of ``.expanding().corr(pairwise=True)`` (:issue:`4950`)
696696
- Removal of ``DataMatrix`` module. This was not imported into the pandas namespace in any event (:issue:`12111`)
697697
- Removal of ``cols`` keyword in favor of ``subset`` in ``DataFrame.duplicated()`` and ``DataFrame.drop_duplicates()`` (:issue:`6680`)
698-
698+
- Removal of the ``read_frame`` and ``frame_query`` (both aliases for ``pd.read_sql``)
699+
and ``write_frame`` (alias of ``to_sql``) functions in the ``pd.io.sql`` namespace,
700+
deprecated since 0.14.0 (:issue:`6292`).
699701

700702
.. _whatsnew_0180.performance:
701703

pandas/io/sql.py

-63
Original file line numberDiff line numberDiff line change
@@ -1704,66 +1704,3 @@ def get_schema(frame, name, flavor='sqlite', keys=None, con=None, dtype=None):
17041704

17051705
pandas_sql = pandasSQL_builder(con=con, flavor=flavor)
17061706
return pandas_sql._create_sql_schema(frame, name, keys=keys, dtype=dtype)
1707-
1708-
1709-
# legacy names, with depreciation warnings and copied docs
1710-
1711-
@Appender(read_sql.__doc__, join='\n')
1712-
def read_frame(*args, **kwargs):
1713-
"""DEPRECATED - use read_sql
1714-
"""
1715-
warnings.warn("read_frame is deprecated, use read_sql", FutureWarning,
1716-
stacklevel=2)
1717-
return read_sql(*args, **kwargs)
1718-
1719-
1720-
@Appender(read_sql.__doc__, join='\n')
1721-
def frame_query(*args, **kwargs):
1722-
"""DEPRECATED - use read_sql
1723-
"""
1724-
warnings.warn("frame_query is deprecated, use read_sql", FutureWarning,
1725-
stacklevel=2)
1726-
return read_sql(*args, **kwargs)
1727-
1728-
1729-
def write_frame(frame, name, con, flavor='sqlite', if_exists='fail', **kwargs):
1730-
"""DEPRECATED - use to_sql
1731-
1732-
Write records stored in a DataFrame to a SQL database.
1733-
1734-
Parameters
1735-
----------
1736-
frame : DataFrame
1737-
name : string
1738-
con : DBAPI2 connection
1739-
flavor : {'sqlite', 'mysql'}, default 'sqlite'
1740-
The flavor of SQL to use.
1741-
if_exists : {'fail', 'replace', 'append'}, default 'fail'
1742-
- fail: If table exists, do nothing.
1743-
- replace: If table exists, drop it, recreate it, and insert data.
1744-
- append: If table exists, insert data. Create if does not exist.
1745-
index : boolean, default False
1746-
Write DataFrame index as a column
1747-
1748-
Notes
1749-
-----
1750-
This function is deprecated in favor of ``to_sql``. There are however
1751-
two differences:
1752-
1753-
- With ``to_sql`` the index is written to the sql database by default. To
1754-
keep the behaviour this function you need to specify ``index=False``.
1755-
- The new ``to_sql`` function supports sqlalchemy connectables to work
1756-
with different sql flavors.
1757-
1758-
See also
1759-
--------
1760-
pandas.DataFrame.to_sql
1761-
1762-
"""
1763-
warnings.warn("write_frame is deprecated, use to_sql", FutureWarning,
1764-
stacklevel=2)
1765-
1766-
# for backwards compatibility, set index=False when not specified
1767-
index = kwargs.pop('index', False)
1768-
return to_sql(frame, name, con, flavor=flavor, if_exists=if_exists,
1769-
index=index, **kwargs)

pandas/io/tests/test_sql.py

+49-66
Original file line numberDiff line numberDiff line change
@@ -524,12 +524,6 @@ def test_read_sql_view(self):
524524
"SELECT * FROM iris_view", self.conn)
525525
self._check_iris_loaded_frame(iris_frame)
526526

527-
def test_legacy_read_frame(self):
528-
with tm.assert_produces_warning(FutureWarning):
529-
iris_frame = sql.read_frame(
530-
"SELECT * FROM iris", self.conn)
531-
self._check_iris_loaded_frame(iris_frame)
532-
533527
def test_to_sql(self):
534528
sql.to_sql(self.test_frame1, 'test_frame1', self.conn, flavor='sqlite')
535529
self.assertTrue(
@@ -598,17 +592,6 @@ def test_to_sql_panel(self):
598592
self.assertRaises(NotImplementedError, sql.to_sql, panel,
599593
'test_panel', self.conn, flavor='sqlite')
600594

601-
def test_legacy_write_frame(self):
602-
# Assume that functionality is already tested above so just do
603-
# quick check that it basically works
604-
with tm.assert_produces_warning(FutureWarning):
605-
sql.write_frame(self.test_frame1, 'test_frame_legacy', self.conn,
606-
flavor='sqlite')
607-
608-
self.assertTrue(
609-
sql.has_table('test_frame_legacy', self.conn, flavor='sqlite'),
610-
'Table not written to DB')
611-
612595
def test_roundtrip(self):
613596
sql.to_sql(self.test_frame1, 'test_frame_roundtrip',
614597
con=self.conn, flavor='sqlite')
@@ -2239,7 +2222,7 @@ def test_write_row_by_row(self):
22392222

22402223
self.conn.commit()
22412224

2242-
result = sql.read_frame("select * from test", con=self.conn)
2225+
result = sql.read_sql("select * from test", con=self.conn)
22432226
result.index = frame.index
22442227
tm.assert_frame_equal(result, frame)
22452228

@@ -2254,7 +2237,7 @@ def test_execute(self):
22542237
sql.execute(ins, self.conn, params=tuple(row))
22552238
self.conn.commit()
22562239

2257-
result = sql.read_frame("select * from test", self.conn)
2240+
result = sql.read_sql("select * from test", self.conn)
22582241
result.index = frame.index[:1]
22592242
tm.assert_frame_equal(result, frame[:1])
22602243

@@ -2327,8 +2310,8 @@ def test_na_roundtrip(self):
23272310
pass
23282311

23292312
def _check_roundtrip(self, frame):
2330-
sql.write_frame(frame, name='test_table', con=self.conn)
2331-
result = sql.read_frame("select * from test_table", self.conn)
2313+
sql.to_sql(frame, name='test_table', con=self.conn, index=False)
2314+
result = sql.read_sql("select * from test_table", self.conn)
23322315

23332316
# HACK! Change this once indexes are handled properly.
23342317
result.index = frame.index
@@ -2339,8 +2322,8 @@ def _check_roundtrip(self, frame):
23392322
frame['txt'] = ['a'] * len(frame)
23402323
frame2 = frame.copy()
23412324
frame2['Idx'] = Index(lrange(len(frame2))) + 10
2342-
sql.write_frame(frame2, name='test_table2', con=self.conn)
2343-
result = sql.read_frame("select * from test_table2", self.conn,
2325+
sql.to_sql(frame2, name='test_table2', con=self.conn, index=False)
2326+
result = sql.read_sql("select * from test_table2", self.conn,
23442327
index_col='Idx')
23452328
expected = frame.copy()
23462329
expected.index = Index(lrange(len(frame2))) + 10
@@ -2349,7 +2332,7 @@ def _check_roundtrip(self, frame):
23492332

23502333
def test_tquery(self):
23512334
frame = tm.makeTimeDataFrame()
2352-
sql.write_frame(frame, name='test_table', con=self.conn)
2335+
sql.to_sql(frame, name='test_table', con=self.conn, index=False)
23532336
result = sql.tquery("select A from test_table", self.conn)
23542337
expected = Series(frame.A.values, frame.index) # not to have name
23552338
result = Series(result, frame.index)
@@ -2367,7 +2350,7 @@ def test_tquery(self):
23672350

23682351
def test_uquery(self):
23692352
frame = tm.makeTimeDataFrame()
2370-
sql.write_frame(frame, name='test_table', con=self.conn)
2353+
sql.to_sql(frame, name='test_table', con=self.conn, index=False)
23712354
stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)'
23722355
self.assertEqual(sql.uquery(stmt, con=self.conn), 1)
23732356

@@ -2387,22 +2370,22 @@ def test_keyword_as_column_names(self):
23872370
'''
23882371
'''
23892372
df = DataFrame({'From': np.ones(5)})
2390-
sql.write_frame(df, con=self.conn, name='testkeywords')
2373+
sql.to_sql(df, con=self.conn, name='testkeywords', index=False)
23912374

23922375
def test_onecolumn_of_integer(self):
23932376
# GH 3628
23942377
# a column_of_integers dataframe should transfer well to sql
23952378

23962379
mono_df = DataFrame([1, 2], columns=['c0'])
2397-
sql.write_frame(mono_df, con=self.conn, name='mono_df')
2380+
sql.to_sql(mono_df, con=self.conn, name='mono_df', index=False)
23982381
# computing the sum via sql
23992382
con_x = self.conn
24002383
the_sum = sum([my_c0[0]
24012384
for my_c0 in con_x.execute("select * from mono_df")])
24022385
# it should not fail, and gives 3 ( Issue #3628 )
24032386
self.assertEqual(the_sum, 3)
24042387

2405-
result = sql.read_frame("select * from mono_df", con_x)
2388+
result = sql.read_sql("select * from mono_df", con_x)
24062389
tm.assert_frame_equal(result, mono_df)
24072390

24082391
def test_if_exists(self):
@@ -2421,7 +2404,7 @@ def clean_up(test_table_to_drop):
24212404

24222405
# test if invalid value for if_exists raises appropriate error
24232406
self.assertRaises(ValueError,
2424-
sql.write_frame,
2407+
sql.to_sql,
24252408
frame=df_if_exists_1,
24262409
con=self.conn,
24272410
name=table_name,
@@ -2430,34 +2413,34 @@ def clean_up(test_table_to_drop):
24302413
clean_up(table_name)
24312414

24322415
# test if_exists='fail'
2433-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2434-
flavor='sqlite', if_exists='fail')
2416+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2417+
flavor='sqlite', if_exists='fail')
24352418
self.assertRaises(ValueError,
2436-
sql.write_frame,
2419+
sql.to_sql,
24372420
frame=df_if_exists_1,
24382421
con=self.conn,
24392422
name=table_name,
24402423
flavor='sqlite',
24412424
if_exists='fail')
24422425

24432426
# test if_exists='replace'
2444-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2445-
flavor='sqlite', if_exists='replace')
2427+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2428+
flavor='sqlite', if_exists='replace', index=False)
24462429
self.assertEqual(sql.tquery(sql_select, con=self.conn),
24472430
[(1, 'A'), (2, 'B')])
2448-
sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name,
2449-
flavor='sqlite', if_exists='replace')
2431+
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
2432+
flavor='sqlite', if_exists='replace', index=False)
24502433
self.assertEqual(sql.tquery(sql_select, con=self.conn),
24512434
[(3, 'C'), (4, 'D'), (5, 'E')])
24522435
clean_up(table_name)
24532436

24542437
# test if_exists='append'
2455-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2456-
flavor='sqlite', if_exists='fail')
2438+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2439+
flavor='sqlite', if_exists='fail', index=False)
24572440
self.assertEqual(sql.tquery(sql_select, con=self.conn),
24582441
[(1, 'A'), (2, 'B')])
2459-
sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name,
2460-
flavor='sqlite', if_exists='append')
2442+
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
2443+
flavor='sqlite', if_exists='append', index=False)
24612444
self.assertEqual(sql.tquery(sql_select, con=self.conn),
24622445
[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')])
24632446
clean_up(table_name)
@@ -2542,7 +2525,7 @@ def test_write_row_by_row(self):
25422525

25432526
self.conn.commit()
25442527

2545-
result = sql.read_frame("select * from test", con=self.conn)
2528+
result = sql.read_sql("select * from test", con=self.conn)
25462529
result.index = frame.index
25472530
tm.assert_frame_equal(result, frame)
25482531

@@ -2577,7 +2560,7 @@ def test_execute(self):
25772560
sql.execute(ins, self.conn, params=tuple(row))
25782561
self.conn.commit()
25792562

2580-
result = sql.read_frame("select * from test", self.conn)
2563+
result = sql.read_sql("select * from test", self.conn)
25812564
result.index = frame.index[:1]
25822565
tm.assert_frame_equal(result, frame[:1])
25832566

@@ -2666,9 +2649,9 @@ def _check_roundtrip(self, frame):
26662649
with warnings.catch_warnings():
26672650
warnings.filterwarnings("ignore", "Unknown table.*")
26682651
cur.execute(drop_sql)
2669-
sql.write_frame(frame, name='test_table',
2670-
con=self.conn, flavor='mysql')
2671-
result = sql.read_frame("select * from test_table", self.conn)
2652+
sql.to_sql(frame, name='test_table',
2653+
con=self.conn, flavor='mysql', index=False)
2654+
result = sql.read_sql("select * from test_table", self.conn)
26722655

26732656
# HACK! Change this once indexes are handled properly.
26742657
result.index = frame.index
@@ -2686,9 +2669,9 @@ def _check_roundtrip(self, frame):
26862669
with warnings.catch_warnings():
26872670
warnings.filterwarnings("ignore", "Unknown table.*")
26882671
cur.execute(drop_sql)
2689-
sql.write_frame(frame2, name='test_table2',
2690-
con=self.conn, flavor='mysql')
2691-
result = sql.read_frame("select * from test_table2", self.conn,
2672+
sql.to_sql(frame2, name='test_table2',
2673+
con=self.conn, flavor='mysql', index=False)
2674+
result = sql.read_sql("select * from test_table2", self.conn,
26922675
index_col='Idx')
26932676
expected = frame.copy()
26942677

@@ -2706,8 +2689,8 @@ def test_tquery(self):
27062689
drop_sql = "DROP TABLE IF EXISTS test_table"
27072690
cur = self.conn.cursor()
27082691
cur.execute(drop_sql)
2709-
sql.write_frame(frame, name='test_table',
2710-
con=self.conn, flavor='mysql')
2692+
sql.to_sql(frame, name='test_table',
2693+
con=self.conn, flavor='mysql', index=False)
27112694
result = sql.tquery("select A from test_table", self.conn)
27122695
expected = Series(frame.A.values, frame.index) # not to have name
27132696
result = Series(result, frame.index)
@@ -2732,8 +2715,8 @@ def test_uquery(self):
27322715
drop_sql = "DROP TABLE IF EXISTS test_table"
27332716
cur = self.conn.cursor()
27342717
cur.execute(drop_sql)
2735-
sql.write_frame(frame, name='test_table',
2736-
con=self.conn, flavor='mysql')
2718+
sql.to_sql(frame, name='test_table',
2719+
con=self.conn, flavor='mysql', index=False)
27372720
stmt = 'INSERT INTO test_table VALUES(2.314, -123.1, 1.234, 2.3)'
27382721
self.assertEqual(sql.uquery(stmt, con=self.conn), 1)
27392722

@@ -2754,8 +2737,8 @@ def test_keyword_as_column_names(self):
27542737
'''
27552738
_skip_if_no_pymysql()
27562739
df = DataFrame({'From': np.ones(5)})
2757-
sql.write_frame(df, con=self.conn, name='testkeywords',
2758-
if_exists='replace', flavor='mysql')
2740+
sql.to_sql(df, con=self.conn, name='testkeywords',
2741+
if_exists='replace', flavor='mysql', index=False)
27592742

27602743
def test_if_exists(self):
27612744
_skip_if_no_pymysql()
@@ -2774,7 +2757,7 @@ def clean_up(test_table_to_drop):
27742757

27752758
# test if invalid value for if_exists raises appropriate error
27762759
self.assertRaises(ValueError,
2777-
sql.write_frame,
2760+
sql.to_sql,
27782761
frame=df_if_exists_1,
27792762
con=self.conn,
27802763
name=table_name,
@@ -2783,34 +2766,34 @@ def clean_up(test_table_to_drop):
27832766
clean_up(table_name)
27842767

27852768
# test if_exists='fail'
2786-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2787-
flavor='mysql', if_exists='fail')
2769+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2770+
flavor='mysql', if_exists='fail', index=False)
27882771
self.assertRaises(ValueError,
2789-
sql.write_frame,
2772+
sql.to_sql,
27902773
frame=df_if_exists_1,
27912774
con=self.conn,
27922775
name=table_name,
27932776
flavor='mysql',
27942777
if_exists='fail')
27952778

27962779
# test if_exists='replace'
2797-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2798-
flavor='mysql', if_exists='replace')
2780+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2781+
flavor='mysql', if_exists='replace', index=False)
27992782
self.assertEqual(sql.tquery(sql_select, con=self.conn),
28002783
[(1, 'A'), (2, 'B')])
2801-
sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name,
2802-
flavor='mysql', if_exists='replace')
2784+
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
2785+
flavor='mysql', if_exists='replace', index=False)
28032786
self.assertEqual(sql.tquery(sql_select, con=self.conn),
28042787
[(3, 'C'), (4, 'D'), (5, 'E')])
28052788
clean_up(table_name)
28062789

28072790
# test if_exists='append'
2808-
sql.write_frame(frame=df_if_exists_1, con=self.conn, name=table_name,
2809-
flavor='mysql', if_exists='fail')
2791+
sql.to_sql(frame=df_if_exists_1, con=self.conn, name=table_name,
2792+
flavor='mysql', if_exists='fail', index=False)
28102793
self.assertEqual(sql.tquery(sql_select, con=self.conn),
28112794
[(1, 'A'), (2, 'B')])
2812-
sql.write_frame(frame=df_if_exists_2, con=self.conn, name=table_name,
2813-
flavor='mysql', if_exists='append')
2795+
sql.to_sql(frame=df_if_exists_2, con=self.conn, name=table_name,
2796+
flavor='mysql', if_exists='append', index=False)
28142797
self.assertEqual(sql.tquery(sql_select, con=self.conn),
28152798
[(1, 'A'), (2, 'B'), (3, 'C'), (4, 'D'), (5, 'E')])
28162799
clean_up(table_name)

0 commit comments

Comments
 (0)