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