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            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}