@@ -738,7 +738,7 @@ def to_sql(
738738 name : str ,
739739 con ,
740740 schema : str | None = None ,
741- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
741+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
742742 index : bool = True ,
743743 index_label : IndexLabel | None = None ,
744744 chunksize : int | None = None ,
@@ -764,10 +764,11 @@ def to_sql(
764764 schema : str, optional
765765 Name of SQL schema in database to write to (if database flavor
766766 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'
768768 - fail: If table exists, do nothing.
769769 - replace: If table exists, drop it, recreate it, and insert data.
770770 - append: If table exists, insert data. Create if does not exist.
771+ - delete_rows: If a table exists, delete all records and insert data.
771772 index : bool, default True
772773 Write DataFrame index as a column.
773774 index_label : str or sequence, optional
@@ -818,7 +819,7 @@ def to_sql(
818819 `sqlite3 <https://docs.python.org/3/library/sqlite3.html#sqlite3.Cursor.rowcount>`__ or
819820 `SQLAlchemy <https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.BaseCursorResult.rowcount>`__
820821 """ # noqa: E501
821- if if_exists not in ("fail" , "replace" , "append" ):
822+ if if_exists not in ("fail" , "replace" , "append" , "delete_rows" ):
822823 raise ValueError (f"'{ if_exists } ' is not valid for if_exists" )
823824
824825 if isinstance (frame , Series ):
@@ -926,7 +927,7 @@ def __init__(
926927 pandas_sql_engine ,
927928 frame = None ,
928929 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" ,
930931 prefix : str = "pandas" ,
931932 index_label = None ,
932933 schema = None ,
@@ -974,11 +975,13 @@ def create(self) -> None:
974975 if self .exists ():
975976 if self .if_exists == "fail" :
976977 raise ValueError (f"Table '{ self .name } ' already exists." )
977- if self .if_exists == "replace" :
978+ elif self .if_exists == "replace" :
978979 self .pd_sql .drop_table (self .name , self .schema )
979980 self ._execute_create ()
980981 elif self .if_exists == "append" :
981982 pass
983+ elif self .if_exists == "delete_rows" :
984+ self .pd_sql .delete_rows (self .name , self .schema )
982985 else :
983986 raise ValueError (f"'{ self .if_exists } ' is not valid for if_exists" )
984987 else :
@@ -1480,7 +1483,7 @@ def to_sql(
14801483 self ,
14811484 frame ,
14821485 name : str ,
1483- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1486+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
14841487 index : bool = True ,
14851488 index_label = None ,
14861489 schema = None ,
@@ -1874,7 +1877,7 @@ def prep_table(
18741877 self ,
18751878 frame ,
18761879 name : str ,
1877- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1880+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
18781881 index : bool | str | list [str ] | None = True ,
18791882 index_label = None ,
18801883 schema = None ,
@@ -1951,7 +1954,7 @@ def to_sql(
19511954 self ,
19521955 frame ,
19531956 name : str ,
1954- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
1957+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
19551958 index : bool = True ,
19561959 index_label = None ,
19571960 schema : str | None = None ,
@@ -1969,10 +1972,11 @@ def to_sql(
19691972 frame : DataFrame
19701973 name : string
19711974 Name of SQL table.
1972- if_exists : {'fail', 'replace', 'append'}, default 'fail'
1975+ if_exists : {'fail', 'replace', 'append', 'delete_rows' }, default 'fail'
19731976 - fail: If table exists, do nothing.
19741977 - replace: If table exists, drop it, recreate it, and insert data.
19751978 - append: If table exists, insert data. Create if does not exist.
1979+ - delete_rows: If a table exists, delete all records and insert data.
19761980 index : boolean, default True
19771981 Write DataFrame index as a column.
19781982 index_label : string or sequence, default None
@@ -2069,6 +2073,18 @@ def drop_table(self, table_name: str, schema: str | None = None) -> None:
20692073 self .get_table (table_name , schema ).drop (bind = self .con )
20702074 self .meta .clear ()
20712075
2076+ def delete_rows (self , table_name : str , schema : str | None = None ) -> None :
2077+ schema = schema or self .meta .schema
2078+ if self .has_table (table_name , schema ):
2079+ self .meta .reflect (
2080+ bind = self .con , only = [table_name ], schema = schema , views = True
2081+ )
2082+ with self .run_transaction () as con :
2083+ table = self .get_table (table_name , schema )
2084+ con .execute (table .delete ())
2085+
2086+ self .meta .clear ()
2087+
20722088 def _create_sql_schema (
20732089 self ,
20742090 frame : DataFrame ,
@@ -2304,7 +2320,7 @@ def to_sql(
23042320 self ,
23052321 frame ,
23062322 name : str ,
2307- if_exists : Literal ["fail" , "replace" , "append" ] = "fail" ,
2323+ if_exists : Literal ["fail" , "replace" , "append" , "delete_rows" ] = "fail" ,
23082324 index : bool = True ,
23092325 index_label = None ,
23102326 schema : str | None = None ,
@@ -2326,6 +2342,7 @@ def to_sql(
23262342 - fail: If table exists, do nothing.
23272343 - replace: If table exists, drop it, recreate it, and insert data.
23282344 - append: If table exists, insert data. Create if does not exist.
2345+ - delete_rows: If a table exists, delete all records and insert data.
23292346 index : boolean, default True
23302347 Write DataFrame index as a column.
23312348 index_label : string or sequence, default None
@@ -2416,6 +2433,12 @@ def has_table(self, name: str, schema: str | None = None) -> bool:
24162433
24172434 return False
24182435
2436+ def delete_rows (self , name : str , schema : str | None = None ) -> None :
2437+ delete_sql = f"DELETE FROM { schema } .{ name } " if schema else f"DELETE FROM { name } "
2438+ if self .has_table (name , schema ):
2439+ with self .con .cursor () as cur :
2440+ cur .execute (delete_sql )
2441+
24192442 def _create_sql_schema (
24202443 self ,
24212444 frame : DataFrame ,
@@ -2790,10 +2813,11 @@ def to_sql(
27902813 frame: DataFrame
27912814 name: string
27922815 Name of SQL table.
2793- if_exists: {'fail', 'replace', 'append'}, default 'fail'
2816+ if_exists: {'fail', 'replace', 'append', 'delete_rows' }, default 'fail'
27942817 fail: If table exists, do nothing.
27952818 replace: If table exists, drop it, recreate it, and insert data.
27962819 append: If table exists, insert data. Create if it does not exist.
2820+ delete_rows: If a table exists, delete all records and insert data.
27972821 index : bool, default True
27982822 Write DataFrame index as a column
27992823 index_label : string or sequence, default None
@@ -2869,6 +2893,12 @@ def drop_table(self, name: str, schema: str | None = None) -> None:
28692893 drop_sql = f"DROP TABLE { _get_valid_sqlite_name (name )} "
28702894 self .execute (drop_sql )
28712895
2896+ def delete_rows (self , name : str , schema : str | None = None ) -> None :
2897+ delete_sql = f"DELETE FROM { _get_valid_sqlite_name (name )} "
2898+ if self .has_table (name , schema ):
2899+ with self .run_transaction () as cur :
2900+ cur .execute (delete_sql )
2901+
28722902 def _create_sql_schema (
28732903 self ,
28742904 frame ,
0 commit comments