Skip to content

Commit 28f9b74

Browse files
committed
BUG: Fix if_exists='replace' functionality in io.sql.write_frame
This should resolve issues pandas-dev#2971 and pandas-dev#4110
1 parent 0c14a1a commit 28f9b74

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

pandas/io/sql.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,13 @@ def write_frame(frame, name, con, flavor='sqlite', if_exists='fail', **kwargs):
207207
#create or drop-recreate if necessary
208208
create = None
209209
if exists and if_exists == 'replace':
210-
create = "DROP TABLE %s" % name
210+
create = "DROP TABLE %s;" % name + get_schema(frame, name, flavor)
211211
elif not exists:
212212
create = get_schema(frame, name, flavor)
213213

214214
if create is not None:
215215
cur = con.cursor()
216-
cur.execute(create)
216+
cur.executescript(create)
217217
cur.close()
218218

219219
cur = con.cursor()

pandas/io/tests/test_sql.py

+14
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ def test_if_exists(self):
244244
df_if_exists_1 = DataFrame({'col1': [1, 2], 'col2': ['A', 'B']})
245245
df_if_exists_2 = DataFrame({'col1': [3, 4, 5], 'col2': ['C', 'D', 'E']})
246246
table_name = 'table_if_exists'
247+
sql_select = "SELECT * FROM %s" % table_name
247248

248249
# test if invalid value for if_exists raises appropriate error
249250
self.assertRaises(ValueError,
@@ -258,6 +259,19 @@ def test_if_exists(self):
258259
cur.execute("DROP TABLE %s" % table_name)
259260
cur.close()
260261

262+
# test if_exists='replace'
263+
sql.write_frame(frame=df_if_exists_1, con=self.db, name=table_name,
264+
flavor='sqlite', if_exists='replace')
265+
sql.write_frame(frame=df_if_exists_2, con=self.db, name=table_name,
266+
flavor='sqlite', if_exists='replace')
267+
self.assertEqual(sql.tquery(sql_select, con=self.db),
268+
[(3, 'C'), (4, 'D'), (5, 'E')])
269+
if sql.table_exists(table_name, self.db, flavor='sqlite'):
270+
cur = self.db.cursor()
271+
cur.execute("DROP TABLE %s" % table_name)
272+
cur.close()
273+
274+
261275

262276
class TestMySQL(unittest.TestCase):
263277

0 commit comments

Comments
 (0)