sea_query/backend/postgres/
foreign_key.rs1use super::*;
2
3impl ForeignKeyBuilder for PostgresQueryBuilder {
4 fn prepare_foreign_key_drop_statement_internal(
5 &self,
6 drop: &ForeignKeyDropStatement,
7 sql: &mut dyn SqlWriter,
8 mode: Mode,
9 ) {
10 if mode == Mode::Alter {
11 sql.write_str("ALTER TABLE ").unwrap();
12 if let Some(table) = &drop.table {
13 self.prepare_table_ref_fk_stmt(table, sql);
14 }
15 sql.write_str(" ").unwrap();
16 }
17
18 sql.write_str("DROP CONSTRAINT ").unwrap();
19 if let Some(name) = &drop.foreign_key.name {
20 sql.write_char(self.quote().left()).unwrap();
21 sql.write_str(name).unwrap();
22 sql.write_char(self.quote().right()).unwrap();
23 }
24 }
25
26 fn prepare_foreign_key_create_statement_internal(
27 &self,
28 create: &ForeignKeyCreateStatement,
29 sql: &mut dyn SqlWriter,
30 mode: Mode,
31 ) {
32 if mode == Mode::Alter {
33 sql.write_str("ALTER TABLE ").unwrap();
34 if let Some(table) = &create.foreign_key.table {
35 self.prepare_table_ref_fk_stmt(table, sql);
36 }
37 sql.write_str(" ").unwrap();
38 }
39
40 if mode != Mode::Creation {
41 sql.write_str("ADD ").unwrap();
42 }
43
44 if let Some(name) = &create.foreign_key.name {
45 sql.write_str("CONSTRAINT ").unwrap();
46 sql.write_char(self.quote().left()).unwrap();
47 sql.write_str(name).unwrap();
48 sql.write_char(self.quote().right()).unwrap();
49 sql.write_str(" ").unwrap();
50 }
51
52 sql.write_str("FOREIGN KEY (").unwrap();
53
54 let mut fk_cols = create.foreign_key.columns.iter();
55
56 join_io!(
57 fk_cols,
58 col,
59 join {
60 sql.write_str(", ").unwrap();
61 },
62 do {
63 self.prepare_iden(col, sql);
64 }
65 );
66
67 sql.write_str(") REFERENCES ").unwrap();
68 if let Some(ref_table) = &create.foreign_key.ref_table {
69 self.prepare_table_ref_fk_stmt(ref_table, sql);
70 }
71 sql.write_str(" (").unwrap();
72
73 let mut fk_ref_cols = create.foreign_key.ref_columns.iter();
74
75 join_io!(
76 fk_ref_cols,
77 col,
78 join {
79 sql.write_str(", ").unwrap();
80 },
81 do {
82 self.prepare_iden(col, sql);
83 }
84 );
85
86 sql.write_str(")").unwrap();
87
88 if let Some(foreign_key_action) = &create.foreign_key.on_delete {
89 sql.write_str(" ON DELETE ").unwrap();
90 self.prepare_foreign_key_action(foreign_key_action, sql);
91 }
92
93 if let Some(foreign_key_action) = &create.foreign_key.on_update {
94 sql.write_str(" ON UPDATE ").unwrap();
95 self.prepare_foreign_key_action(foreign_key_action, sql);
96 }
97 }
98
99 fn prepare_table_ref_fk_stmt(&self, table_ref: &TableRef, sql: &mut dyn SqlWriter) {
100 match table_ref {
101 TableRef::Table(.., None) => self.prepare_table_ref_iden(table_ref, sql),
103 _ => panic!("Not supported"),
104 }
105 }
106}