diff --git a/src/backend/mysql/table.rs b/src/backend/mysql/table.rs index e1dc878e1..41c192a4d 100644 --- a/src/backend/mysql/table.rs +++ b/src/backend/mysql/table.rs @@ -190,8 +190,11 @@ impl TableBuilder for MysqlQueryBuilder { sql.write_str(" TO ").unwrap(); self.prepare_iden(to_name, sql); } - TableAlterOption::DropColumn(column_name) => { + TableAlterOption::DropColumn(DropColumnOption { column_name, if_exists }) => { sql.write_str("DROP COLUMN ").unwrap(); + if *if_exists{ + panic!("MySQL does not support drop column if exists"); + } self.prepare_iden(column_name, sql); } TableAlterOption::DropForeignKey(name) => { diff --git a/src/backend/postgres/table.rs b/src/backend/postgres/table.rs index 1c67bb625..69ede96e3 100644 --- a/src/backend/postgres/table.rs +++ b/src/backend/postgres/table.rs @@ -170,8 +170,14 @@ impl TableBuilder for PostgresQueryBuilder { sql.write_str(" TO ").unwrap(); self.prepare_iden(to_name, sql); } - TableAlterOption::DropColumn(column_name) => { + TableAlterOption::DropColumn(DropColumnOption{ + column_name, + if_exists + }) => { sql.write_str("DROP COLUMN ").unwrap(); + if *if_exists { + sql.write_str("IF EXISTS ").unwrap(); + } self.prepare_iden(column_name, sql); } TableAlterOption::DropForeignKey(name) => { diff --git a/src/backend/sqlite/table.rs b/src/backend/sqlite/table.rs index cd5d36177..53d1bcf2c 100644 --- a/src/backend/sqlite/table.rs +++ b/src/backend/sqlite/table.rs @@ -62,9 +62,15 @@ impl TableBuilder for SqliteQueryBuilder { sql.write_str(" TO ").unwrap(); self.prepare_iden(to_name, sql); } - TableAlterOption::DropColumn(col_name) => { + TableAlterOption::DropColumn(DropColumnOption { + column_name, + if_exists, + }) => { sql.write_str("DROP COLUMN ").unwrap(); - self.prepare_iden(col_name, sql); + if *if_exists { + panic!("Sqlite does not support drop column if exists"); + } + self.prepare_iden(column_name, sql); } TableAlterOption::DropForeignKey(_) => { panic!( diff --git a/src/table/alter.rs b/src/table/alter.rs index bc29224ed..5c06dbae0 100644 --- a/src/table/alter.rs +++ b/src/table/alter.rs @@ -42,6 +42,13 @@ pub struct AddColumnOption { pub(crate) if_not_exists: bool, } +/// table alter drop column options +#[derive(Debug, Clone)] +pub struct DropColumnOption { + pub(crate) column_name: DynIden, + pub(crate) if_exists: bool, +} + /// All available table alter options #[allow(clippy::large_enum_variant)] #[derive(Debug, Clone)] @@ -50,7 +57,7 @@ pub enum TableAlterOption { AddColumn(AddColumnOption), ModifyColumn(ColumnDef), RenameColumn(DynIden, DynIden), - DropColumn(DynIden), + DropColumn(DropColumnOption), AddForeignKey(TableForeignKey), DropForeignKey(DynIden), } @@ -234,7 +241,38 @@ impl TableAlterStatement { where T: IntoIden, { - self.add_alter_option(TableAlterOption::DropColumn(col_name.into_iden())) + self.add_alter_option(TableAlterOption::DropColumn(DropColumnOption { + column_name: col_name.into(), + if_exists: false, + })) + } + + /// Drop a column from an existing table if it exists + /// + /// # Examples + /// + /// ``` + /// use sea_query::{tests_cfg::*, *}; + /// + /// let table = Table::alter() + /// .table(Font::Table) + /// .drop_column_if_exists("new_column") + /// .to_owned(); + /// + /// assert_eq!( + /// table.to_string(PostgresQueryBuilder), + /// r#"ALTER TABLE "font" DROP COLUMN IF EXISTS "new_column""# + /// ); + /// // MySQL and Sqlite do not support DROP COLUMN IF EXISTS + /// ``` + pub fn drop_column_if_exists(&mut self, col_name: T) -> &mut Self + where + T: IntoIden, + { + self.add_alter_option(TableAlterOption::DropColumn(DropColumnOption { + column_name: col_name.into(), + if_exists: true, + })) } /// Add a foreign key to existing table