sea_query/backend/sqlite/
foreign_key.rs1use super::*;
2
3impl ForeignKeyBuilder for SqliteQueryBuilder {
4 fn prepare_table_ref_fk_stmt(&self, table_ref: &TableRef, sql: &mut impl SqlWriter) {
5 match table_ref {
6 TableRef::Table(TableName(None, _), None) => {
8 self.prepare_table_ref_iden(table_ref, sql)
9 }
10 TableRef::Table(TableName(Some(_), iden), None) => self
13 .prepare_table_ref_iden(&TableRef::Table(TableName(None, iden.clone()), None), sql),
14 _ => panic!("Not supported"),
16 }
17 }
18
19 fn prepare_foreign_key_drop_statement_internal(
20 &self,
21 drop: &ForeignKeyDropStatement,
22 sql: &mut impl SqlWriter,
23 mode: Mode,
24 ) {
25 if mode != Mode::Creation {
26 panic!(
27 "Sqlite does not support modification of foreign key constraints to existing tables"
28 );
29 }
30
31 sql.write_str("DROP FOREIGN KEY ").unwrap();
32 if let Some(name) = &drop.foreign_key.name {
33 sql.write_char(self.quote().left()).unwrap();
34 sql.write_str(name).unwrap();
35 sql.write_char(self.quote().right()).unwrap();
36 }
37 }
38
39 fn prepare_foreign_key_create_statement_internal(
40 &self,
41 create: &ForeignKeyCreateStatement,
42 sql: &mut impl SqlWriter,
43 mode: Mode,
44 ) {
45 if mode != Mode::Creation {
46 panic!(
47 "Sqlite does not support modification of foreign key constraints to existing tables"
48 );
49 }
50
51 sql.write_str("FOREIGN KEY (").unwrap();
52
53 let mut cols = create.foreign_key.columns.iter();
54 join_io!(
55 cols,
56 col,
57 join {
58 sql.write_str(", ").unwrap();
59 },
60 do {
61 self.prepare_iden(col, sql);
62 }
63 );
64
65 sql.write_str(") REFERENCES ").unwrap();
66 if let Some(ref_table) = &create.foreign_key.ref_table {
67 self.prepare_table_ref_fk_stmt(ref_table, sql);
68 }
69 sql.write_str(" (").unwrap();
70
71 let mut ref_cols = create.foreign_key.ref_columns.iter();
72 join_io!(
73 ref_cols,
74 col,
75 join {
76 sql.write_str(", ").unwrap();
77 },
78 do {
79 self.prepare_iden(col, sql);
80 }
81 );
82
83 sql.write_str(")").unwrap();
84
85 if let Some(foreign_key_action) = &create.foreign_key.on_delete {
86 sql.write_str(" ON DELETE ").unwrap();
87 self.prepare_foreign_key_action(foreign_key_action, sql);
88 }
89
90 if let Some(foreign_key_action) = &create.foreign_key.on_update {
91 sql.write_str(" ON UPDATE ").unwrap();
92 self.prepare_foreign_key_action(foreign_key_action, sql);
93 }
94 }
95}