@@ -374,31 +374,33 @@ def delete_table(self):
374374 self .cursor .execute (f"DROP TABLE IF EXISTS { self .table_name } " )
375375 self .con .commit ()
376376
377- def add_rows (self , field_list ): # Used execute_many
378- for field in field_list :
379- self .add_row (** field )
377+ def add_rows (self , fields_df ):
378+ fields_df .to_sql (self .table_name , self .con , if_exists = "append" )
380379
381380 def add_row (self , ** fields ):
382- # Note, missing fields will be set as NULL
383- columns = self .columns
384- field_values = [fields .get (col , None ) for col in self .columns ]
385- field_values = [
386- pd .to_datetime (el ) if isinstance (el , np .datetime64 ) else el for el in field_values
387- ]
388- field_values = [
389- el .to_pydatetime () if isinstance (el , pd .Timestamp ) else el for el in field_values
390- ]
391-
392- if self .primary_key .policy != "insert" :
393- field_values = field_values [1 :]
394- columns = columns [1 :]
395-
396- placeholders = ", " .join (["?" ] * len (field_values ))
397- self .cursor .execute (
398- f"INSERT INTO { self .table_name } { columns !s} VALUES({ placeholders } );" , field_values
399- )
400- self .primary_key .validate (self .cursor .lastrowid , fields [self .primary_key .field_name ])
401- self .con .commit ()
381+ df = pd .DataFrame ([fields ]).set_index (self .primary_key .field_name )
382+ self .add_rows (df )
383+
384+ # # Note, missing fields will be set as NULL
385+ # columns = self.columns
386+ # field_values = [fields.get(col, None) for col in self.columns]
387+ # field_values = [
388+ # pd.to_datetime(el) if isinstance(el, np.datetime64) else el for el in field_values
389+ # ]
390+ # field_values = [
391+ # el.to_pydatetime() if isinstance(el, pd.Timestamp) else el for el in field_values
392+ # ]
393+
394+ # if self.primary_key.policy != "insert":
395+ # field_values = field_values[1:]
396+ # columns = columns[1:]
397+
398+ # placeholders = ", ".join(["?"] * len(field_values))
399+ # self.cursor.execute(
400+ # f"INSERT INTO {self.table_name} {columns!s} VALUES({placeholders});", field_values
401+ # )
402+ # self.primary_key.validate(self.cursor.lastrowid, fields[self.primary_key.field_name])
403+ # self.con.commit()
402404
403405 def delete_all_rows (self ):
404406 "Obviously a destructive operation!"
@@ -412,10 +414,24 @@ def delete_row(self, id_val):
412414 )
413415 self .con .commit ()
414416
417+ def delete_rows (self , id_vals ):
418+ query = f"DELETE FROM { self .table_name } WHERE { self .primary_key .field_name } = ?"
419+ self .cursor .executemany (query , [tuple (map (self .primary_key .cast , id_vals .index ))])
420+ self .con .commit ()
421+
415422 def update_row (self , ** updates ): # updates as a dictionary OR remove posarg?
416423 assert self .primary_key .field_name in updates
417424 id_val = updates .pop (self .primary_key .field_name )
418- set_updates = ", " .join ('"' + k + '"' + " = ?" for k in updates )
425+ set_updates = ", " .join ([ f'" { k } " = ?' for k in updates ] )
419426 query = f'UPDATE { self .table_name } SET { set_updates } WHERE "{ self .primary_key .field_name } " = ?;'
420427 self .cursor .execute (query , [* updates .values (), id_val ])
421- self .con .commit ()
428+
429+ def update_rows (self , updates_df ):
430+ def replace_into (table_name , conn , keys , data_iter ):
431+ # First key is the primary key
432+ placeholders = ", " .join ([f'"{ k } " = ?' for k in keys [1 :]])
433+ query = f'UPDATE { table_name .name } SET { placeholders } WHERE "{ keys [0 ]} " = ?;'
434+ data = [(* row [1 :], row [0 ]) for row in data_iter ]
435+ conn .executemany (query , data )
436+
437+ updates_df .to_sql (self .table_name , self .con , if_exists = "append" , method = replace_into )
0 commit comments