@@ -240,6 +240,65 @@ def test_onecolumn_of_integer(self):
240240 result = sql .read_frame ("select * from mono_df" ,con_x )
241241 tm .assert_frame_equal (result ,mono_df )
242242
243+ def test_if_exists (self ):
244+ df_if_exists_1 = DataFrame ({'col1' : [1 , 2 ], 'col2' : ['A' , 'B' ]})
245+ df_if_exists_2 = DataFrame ({'col1' : [3 , 4 , 5 ], 'col2' : ['C' , 'D' , 'E' ]})
246+ table_name = 'table_if_exists'
247+ sql_select = "SELECT * FROM %s" % table_name
248+
249+ def clean_up (test_table_to_drop ):
250+ """
251+ Drops tables created from individual tests
252+ so no dependencies arise from sequential tests
253+ """
254+ if sql .table_exists (test_table_to_drop , self .db , flavor = 'sqlite' ):
255+ cur = self .db .cursor ()
256+ cur .execute ("DROP TABLE %s" % test_table_to_drop )
257+ cur .close ()
258+
259+ # test if invalid value for if_exists raises appropriate error
260+ self .assertRaises (ValueError ,
261+ sql .write_frame ,
262+ frame = df_if_exists_1 ,
263+ con = self .db ,
264+ name = table_name ,
265+ flavor = 'sqlite' ,
266+ if_exists = 'notvalidvalue' )
267+ clean_up (table_name )
268+
269+ # test if_exists='fail'
270+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
271+ flavor = 'sqlite' , if_exists = 'fail' )
272+ self .assertRaises (ValueError ,
273+ sql .write_frame ,
274+ frame = df_if_exists_1 ,
275+ con = self .db ,
276+ name = table_name ,
277+ flavor = 'sqlite' ,
278+ if_exists = 'fail' )
279+
280+ # test if_exists='replace'
281+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
282+ flavor = 'sqlite' , if_exists = 'replace' )
283+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
284+ [(1 , 'A' ), (2 , 'B' )])
285+ sql .write_frame (frame = df_if_exists_2 , con = self .db , name = table_name ,
286+ flavor = 'sqlite' , if_exists = 'replace' )
287+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
288+ [(3 , 'C' ), (4 , 'D' ), (5 , 'E' )])
289+ clean_up (table_name )
290+
291+ # test if_exists='append'
292+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
293+ flavor = 'sqlite' , if_exists = 'fail' )
294+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
295+ [(1 , 'A' ), (2 , 'B' )])
296+ sql .write_frame (frame = df_if_exists_2 , con = self .db , name = table_name ,
297+ flavor = 'sqlite' , if_exists = 'append' )
298+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
299+ [(1 , 'A' ), (2 , 'B' ), (3 , 'C' ), (4 , 'D' ), (5 , 'E' )])
300+ clean_up (table_name )
301+
243302
244303class TestMySQL (tm .TestCase ):
245304
@@ -483,6 +542,66 @@ def test_keyword_as_column_names(self):
483542 sql .write_frame (df , con = self .db , name = 'testkeywords' ,
484543 if_exists = 'replace' , flavor = 'mysql' )
485544
545+ def test_if_exists (self ):
546+ _skip_if_no_MySQLdb ()
547+ df_if_exists_1 = DataFrame ({'col1' : [1 , 2 ], 'col2' : ['A' , 'B' ]})
548+ df_if_exists_2 = DataFrame ({'col1' : [3 , 4 , 5 ], 'col2' : ['C' , 'D' , 'E' ]})
549+ table_name = 'table_if_exists'
550+ sql_select = "SELECT * FROM %s" % table_name
551+
552+ def clean_up (test_table_to_drop ):
553+ """
554+ Drops tables created from individual tests
555+ so no dependencies arise from sequential tests
556+ """
557+ if sql .table_exists (test_table_to_drop , self .db , flavor = 'mysql' ):
558+ cur = self .db .cursor ()
559+ cur .execute ("DROP TABLE %s" % test_table_to_drop )
560+ cur .close ()
561+
562+ # test if invalid value for if_exists raises appropriate error
563+ self .assertRaises (ValueError ,
564+ sql .write_frame ,
565+ frame = df_if_exists_1 ,
566+ con = self .db ,
567+ name = table_name ,
568+ flavor = 'mysql' ,
569+ if_exists = 'notvalidvalue' )
570+ clean_up (table_name )
571+
572+ # test if_exists='fail'
573+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
574+ flavor = 'mysql' , if_exists = 'fail' )
575+ self .assertRaises (ValueError ,
576+ sql .write_frame ,
577+ frame = df_if_exists_1 ,
578+ con = self .db ,
579+ name = table_name ,
580+ flavor = 'mysql' ,
581+ if_exists = 'fail' )
582+
583+ # test if_exists='replace'
584+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
585+ flavor = 'mysql' , if_exists = 'replace' )
586+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
587+ [(1 , 'A' ), (2 , 'B' )])
588+ sql .write_frame (frame = df_if_exists_2 , con = self .db , name = table_name ,
589+ flavor = 'mysql' , if_exists = 'replace' )
590+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
591+ [(3 , 'C' ), (4 , 'D' ), (5 , 'E' )])
592+ clean_up (table_name )
593+
594+ # test if_exists='append'
595+ sql .write_frame (frame = df_if_exists_1 , con = self .db , name = table_name ,
596+ flavor = 'mysql' , if_exists = 'fail' )
597+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
598+ [(1 , 'A' ), (2 , 'B' )])
599+ sql .write_frame (frame = df_if_exists_2 , con = self .db , name = table_name ,
600+ flavor = 'mysql' , if_exists = 'append' )
601+ self .assertEqual (sql .tquery (sql_select , con = self .db ),
602+ [(1 , 'A' ), (2 , 'B' ), (3 , 'C' ), (4 , 'D' ), (5 , 'E' )])
603+ clean_up (table_name )
604+
486605
487606if __name__ == '__main__' :
488607 nose .runmodule (argv = [__file__ , '-vvs' , '-x' , '--pdb' , '--pdb-failure' ],
0 commit comments