@@ -374,31 +374,33 @@ def delete_table(self):
374
374
self .cursor .execute (f"DROP TABLE IF EXISTS { self .table_name } " )
375
375
self .con .commit ()
376
376
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" )
380
379
381
380
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()
402
404
403
405
def delete_all_rows (self ):
404
406
"Obviously a destructive operation!"
@@ -412,10 +414,24 @@ def delete_row(self, id_val):
412
414
)
413
415
self .con .commit ()
414
416
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
+
415
422
def update_row (self , ** updates ): # updates as a dictionary OR remove posarg?
416
423
assert self .primary_key .field_name in updates
417
424
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 ] )
419
426
query = f'UPDATE { self .table_name } SET { set_updates } WHERE "{ self .primary_key .field_name } " = ?;'
420
427
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