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 write!(sql, "ALTER TABLE ").unwrap();
12 if let Some(table) = &drop.table {
13 self.prepare_table_ref_fk_stmt(table, sql);
14 }
15 write!(sql, " ").unwrap();
16 }
17
18 write!(sql, "DROP CONSTRAINT ").unwrap();
19 if let Some(name) = &drop.foreign_key.name {
20 write!(
21 sql,
22 "{}{}{}",
23 self.quote().left(),
24 name,
25 self.quote().right()
26 )
27 .unwrap();
28 }
29 }
30
31 fn prepare_foreign_key_create_statement_internal(
32 &self,
33 create: &ForeignKeyCreateStatement,
34 sql: &mut dyn SqlWriter,
35 mode: Mode,
36 ) {
37 if mode == Mode::Alter {
38 write!(sql, "ALTER TABLE ").unwrap();
39 if let Some(table) = &create.foreign_key.table {
40 self.prepare_table_ref_fk_stmt(table, sql);
41 }
42 write!(sql, " ").unwrap();
43 }
44
45 if mode != Mode::Creation {
46 write!(sql, "ADD ").unwrap();
47 }
48
49 if let Some(name) = &create.foreign_key.name {
50 write!(sql, "CONSTRAINT ").unwrap();
51 write!(
52 sql,
53 "{}{}{} ",
54 self.quote().left(),
55 name,
56 self.quote().right()
57 )
58 .unwrap();
59 }
60
61 write!(sql, "FOREIGN KEY (").unwrap();
62 create.foreign_key.columns.iter().fold(true, |first, col| {
63 if !first {
64 write!(sql, ", ").unwrap();
65 }
66 col.prepare(sql.as_writer(), self.quote());
67 false
68 });
69 write!(sql, ")").unwrap();
70
71 write!(sql, " REFERENCES ").unwrap();
72 if let Some(ref_table) = &create.foreign_key.ref_table {
73 self.prepare_table_ref_fk_stmt(ref_table, sql);
74 }
75 write!(sql, " ").unwrap();
76
77 write!(sql, "(").unwrap();
78 create
79 .foreign_key
80 .ref_columns
81 .iter()
82 .fold(true, |first, col| {
83 if !first {
84 write!(sql, ", ").unwrap();
85 }
86 col.prepare(sql.as_writer(), self.quote());
87 false
88 });
89 write!(sql, ")").unwrap();
90
91 if let Some(foreign_key_action) = &create.foreign_key.on_delete {
92 write!(sql, " ON DELETE ").unwrap();
93 self.prepare_foreign_key_action(foreign_key_action, sql);
94 }
95
96 if let Some(foreign_key_action) = &create.foreign_key.on_update {
97 write!(sql, " ON UPDATE ").unwrap();
98 self.prepare_foreign_key_action(foreign_key_action, sql);
99 }
100 }
101
102 fn prepare_table_ref_fk_stmt(&self, table_ref: &TableRef, sql: &mut dyn SqlWriter) {
103 match table_ref {
104 TableRef::Table(_)
105 | TableRef::SchemaTable(_, _)
106 | TableRef::DatabaseSchemaTable(_, _, _) => self.prepare_table_ref_iden(table_ref, sql),
107 _ => panic!("Not supported"),
108 }
109 }
110}