@@ -738,7 +738,7 @@ def to_sql(
738
738
name : str ,
739
739
con ,
740
740
schema : str | None = None ,
741
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
741
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
742
742
index : bool = True ,
743
743
index_label : IndexLabel | None = None ,
744
744
chunksize : int | None = None ,
@@ -764,10 +764,11 @@ def to_sql(
764
764
schema : str, optional
765
765
Name of SQL schema in database to write to (if database flavor
766
766
supports this). If None, use default schema (default).
767
- if_exists : {'fail', 'replace', 'append'}, default 'fail'
767
+ if_exists : {'fail', 'replace', 'append', 'delete_rows' }, default 'fail'
768
768
- fail: If table exists, do nothing.
769
769
- replace: If table exists, drop it, recreate it, and insert data.
770
770
- append: If table exists, insert data. Create if does not exist.
771
+ - delete_rows: If a table exists, delete all records and insert data.
771
772
index : bool, default True
772
773
Write DataFrame index as a column.
773
774
index_label : str or sequence, optional
@@ -818,7 +819,7 @@ def to_sql(
818
819
`sqlite3 <https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.rowcount>`__ or
819
820
`SQLAlchemy <https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount>`__
820
821
""" # noqa: E501
821
- if if_exists not in ("fail" , "replace" , "append" ):
822
+ if if_exists not in ("fail" , "replace" , "append" , "delete_rows" ):
822
823
raise ValueError (f"'{ if_exists } ' is not valid for if_exists" )
823
824
824
825
if isinstance (frame , Series ):
@@ -926,7 +927,7 @@ def __init__(
926
927
pandas_sql_engine ,
927
928
frame = None ,
928
929
index : bool | str | list [str ] | None = True ,
929
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
930
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
930
931
prefix : str = "pandas" ,
931
932
index_label = None ,
932
933
schema = None ,
@@ -974,11 +975,13 @@ def create(self) -> None:
974
975
if self .exists ():
975
976
if self .if_exists == "fail" :
976
977
raise ValueError (f"Table '{ self .name } ' already exists." )
977
- if self .if_exists == "replace" :
978
+ elif self .if_exists == "replace" :
978
979
self .pd_sql .drop_table (self .name , self .schema )
979
980
self ._execute_create ()
980
981
elif self .if_exists == "append" :
981
982
pass
983
+ elif self .if_exists == "delete_rows" :
984
+ self .pd_sql .delete_rows (self .name , self .schema )
982
985
else :
983
986
raise ValueError (f"'{ self .if_exists } ' is not valid for if_exists" )
984
987
else :
@@ -1480,7 +1483,7 @@ def to_sql(
1480
1483
self ,
1481
1484
frame ,
1482
1485
name : str ,
1483
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1486
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
1484
1487
index : bool = True ,
1485
1488
index_label = None ,
1486
1489
schema = None ,
@@ -1866,7 +1869,7 @@ def prep_table(
1866
1869
self ,
1867
1870
frame ,
1868
1871
name : str ,
1869
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1872
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
1870
1873
index : bool | str | list [str ] | None = True ,
1871
1874
index_label = None ,
1872
1875
schema = None ,
@@ -1943,7 +1946,7 @@ def to_sql(
1943
1946
self ,
1944
1947
frame ,
1945
1948
name : str ,
1946
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1949
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
1947
1950
index : bool = True ,
1948
1951
index_label = None ,
1949
1952
schema : str | None = None ,
@@ -1961,10 +1964,11 @@ def to_sql(
1961
1964
frame : DataFrame
1962
1965
name : string
1963
1966
Name of SQL table.
1964
- if_exists : {'fail', 'replace', 'append'}, default 'fail'
1967
+ if_exists : {'fail', 'replace', 'append', 'delete_rows' }, default 'fail'
1965
1968
- fail: If table exists, do nothing.
1966
1969
- replace: If table exists, drop it, recreate it, and insert data.
1967
1970
- append: If table exists, insert data. Create if does not exist.
1971
+ - delete_rows: If a table exists, delete all records and insert data.
1968
1972
index : boolean, default True
1969
1973
Write DataFrame index as a column.
1970
1974
index_label : string or sequence, default None
@@ -2061,6 +2065,18 @@ def drop_table(self, table_name: str, schema: str | None = None) -> None:
2061
2065
self .get_table (table_name , schema ).drop (bind = self .con )
2062
2066
self .meta .clear ()
2063
2067
2068
+ def delete_rows (self , table_name : str , schema : str | None = None ) -> None :
2069
+ schema = schema or self .meta .schema
2070
+ if self .has_table (table_name , schema ):
2071
+ self .meta .reflect (
2072
+ bind = self .con , only = [table_name ], schema = schema , views = True
2073
+ )
2074
+ with self .run_transaction () as con :
2075
+ table = self .get_table (table_name , schema )
2076
+ con .execute (table .delete ())
2077
+
2078
+ self .meta .clear ()
2079
+
2064
2080
def _create_sql_schema (
2065
2081
self ,
2066
2082
frame : DataFrame ,
@@ -2296,7 +2312,7 @@ def to_sql(
2296
2312
self ,
2297
2313
frame ,
2298
2314
name : str ,
2299
- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
2315
+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
2300
2316
index : bool = True ,
2301
2317
index_label = None ,
2302
2318
schema : str | None = None ,
@@ -2318,6 +2334,7 @@ def to_sql(
2318
2334
- fail: If table exists, do nothing.
2319
2335
- replace: If table exists, drop it, recreate it, and insert data.
2320
2336
- append: If table exists, insert data. Create if does not exist.
2337
+ - delete_rows: If a table exists, delete all records and insert data.
2321
2338
index : boolean, default True
2322
2339
Write DataFrame index as a column.
2323
2340
index_label : string or sequence, default None
@@ -2335,6 +2352,7 @@ def to_sql(
2335
2352
engine : {'auto', 'sqlalchemy'}, default 'auto'
2336
2353
Raises NotImplementedError if not set to 'auto'
2337
2354
"""
2355
+
2338
2356
if index_label :
2339
2357
raise NotImplementedError (
2340
2358
"'index_label' is not implemented for ADBC drivers"
@@ -2368,6 +2386,10 @@ def to_sql(
2368
2386
cur .execute (f"DROP TABLE { table_name } " )
2369
2387
elif if_exists == "append" :
2370
2388
mode = "append"
2389
+ elif if_exists == "delete_rows" :
2390
+ mode = "append"
2391
+ with self .con .cursor () as cur :
2392
+ cur .execute (f"DELETE FROM { table_name } " )
2371
2393
2372
2394
import pyarrow as pa
2373
2395
@@ -2769,10 +2791,11 @@ def to_sql(
2769
2791
frame: DataFrame
2770
2792
name: string
2771
2793
Name of SQL table.
2772
- if_exists: {'fail', 'replace', 'append'}, default 'fail'
2794
+ if_exists: {'fail', 'replace', 'append', 'delete_rows' }, default 'fail'
2773
2795
fail: If table exists, do nothing.
2774
2796
replace: If table exists, drop it, recreate it, and insert data.
2775
2797
append: If table exists, insert data. Create if it does not exist.
2798
+ delete_rows: If a table exists, delete all records and insert data.
2776
2799
index : bool, default True
2777
2800
Write DataFrame index as a column
2778
2801
index_label : string or sequence, default None
@@ -2848,6 +2871,10 @@ def drop_table(self, name: str, schema: str | None = None) -> None:
2848
2871
drop_sql = f"DROP TABLE { _get_valid_sqlite_name (name )} "
2849
2872
self .execute (drop_sql )
2850
2873
2874
+ def delete_rows (self , name : str , schema : str | None = None ) -> None :
2875
+ delete_sql = f"DELETE FROM { _get_valid_sqlite_name (name )} "
2876
+ self .execute (delete_sql )
2877
+
2851
2878
def _create_sql_schema (
2852
2879
self ,
2853
2880
frame ,
0 commit comments