sea_query/backend/postgres/
foreign_key.rs

1use 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            // Support only unaliased (but potentialy qualified) table names.
102            TableRef::Table(.., None) => self.prepare_table_ref_iden(table_ref, sql),
103            _ => panic!("Not supported"),
104        }
105    }
106}