Skip to content

Commit 9f96760

Browse files
committed
Re-order drop DDL
1 parent c9079c4 commit 9f96760

File tree

11 files changed

+65
-17
lines changed

11 files changed

+65
-17
lines changed

butane_core/src/migrations/adb.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,9 @@ pub fn diff(old: &ADB, new: &ADB) -> Vec<Operation> {
616616
}
617617

618618
// Remove tables
619-
let removed_tables = old_names.difference(&new_names);
619+
let removed_tables: Vec<&String> = old_names.difference(&new_names).copied().collect();
620+
let removed_tables =
621+
reorder_table_drops(old, &removed_tables).expect("failed reordering table drops");
620622
for removed in removed_tables.clone() {
621623
let removed: &str = removed.as_ref();
622624
let table = old.tables.get(removed).expect("no table").clone();
@@ -644,6 +646,29 @@ pub fn diff(old: &ADB, new: &ADB) -> Vec<Operation> {
644646
ops
645647
}
646648

649+
/// Drop tables without dependencies first.
650+
fn reorder_table_drops(old: &ADB, removed_table_names: &[&String]) -> Result<Vec<String>> {
651+
use std::collections::HashSet;
652+
let removed_table_names: HashSet<&String> = removed_table_names.iter().copied().collect();
653+
let mut new_table_order: Vec<String> = vec![];
654+
while new_table_order.len() != removed_table_names.len() {
655+
for removed_table_name in &removed_table_names {
656+
let removed_table = old
657+
.tables
658+
.get(*removed_table_name)
659+
.ok_or(Error::MigrationError("Table should exist".to_string()))?;
660+
for column in &removed_table.columns {
661+
if let Some(_reference) = &column.reference {
662+
continue;
663+
}
664+
}
665+
// No columns are a reference, so this table can be dropped first.
666+
new_table_order.push((**removed_table_name).clone());
667+
}
668+
}
669+
Ok(new_table_order)
670+
}
671+
647672
fn col_by_name<'a>(columns: &'a [AColumn], name: &str) -> Option<&'a AColumn> {
648673
columns.iter().find(|c| c.name == name)
649674
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
2+
3+
4+
5+
DROP TABLE Tag;
16
DROP TABLE Blog;
2-
DROP TABLE Post;
37
DROP TABLE Post_tags_Many;
4-
DROP TABLE Tag;
8+
DROP TABLE Post;
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
DROP TABLE Blog;
2-
DROP TABLE Post;
1+
2+
3+
4+
35
DROP TABLE Post_tags_Many;
6+
DROP TABLE Blog;
47
DROP TABLE Tag;
8+
DROP TABLE Post;

examples/getting_started/src/butane_migrations.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,8 @@ pub fn get_migrations() -> Result<MemMigrations, butane::Error> {
160160
"sqlite": "CREATE TABLE Blog (\nid INTEGER NOT NULL PRIMARY KEY,\n\"name\" TEXT NOT NULL\n);\nCREATE TABLE Post (\nid INTEGER NOT NULL PRIMARY KEY,\ntitle TEXT NOT NULL,\nbody TEXT NOT NULL,\npublished INTEGER NOT NULL,\nblog INTEGER NOT NULL,\nbyline TEXT\n);\nCREATE TABLE Post_tags_Many (\nowner INTEGER NOT NULL,\nhas TEXT NOT NULL\n);\nCREATE TABLE Tag (\ntag TEXT NOT NULL PRIMARY KEY\n);\nCREATE TABLE IF NOT EXISTS butane_migrations (\n\"name\" TEXT NOT NULL PRIMARY KEY\n);\n"
161161
},
162162
"down": {
163-
"pg": "DROP TABLE Blog;\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\nDROP TABLE Tag;\n",
164-
"sqlite": "DROP TABLE Blog;\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\nDROP TABLE Tag;\n"
163+
"pg": "\n\n\n\nDROP TABLE Tag;\nDROP TABLE Blog;\nDROP TABLE Post_tags_Many;\nDROP TABLE Post;\n",
164+
"sqlite": "\n\n\n\nDROP TABLE Post_tags_Many;\nDROP TABLE Blog;\nDROP TABLE Tag;\nDROP TABLE Post;\n"
165165
}
166166
},
167167
"20201229_171630604_likes": {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
DROP TABLE Blog;
1+
ALTER TABLE Post DROP CONSTRAINT Post_blog_fkey;
2+
ALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_owner_fkey;
3+
ALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_has_fkey;
4+
5+
26
DROP TABLE Post;
37
DROP TABLE Post_tags_Many;
8+
DROP TABLE Blog;
49
DROP TABLE Tag;

examples/newtype/.butane/migrations/20240401_095709389_init/pg_up.sql

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ title TEXT NOT NULL,
88
body TEXT NOT NULL,
99
published BOOLEAN NOT NULL,
1010
blog BYTEA NOT NULL,
11-
byline TEXT ,
11+
byline TEXT,
1212
likes INTEGER NOT NULL
1313
);
1414
CREATE TABLE Post_tags_Many (

examples/newtype/.butane/migrations/20240401_095709389_init/sqlite_down.sql

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
2+
3+
4+
5+
DROP TABLE Tag;
16
DROP TABLE Blog;
27
DROP TABLE Post;
38
DROP TABLE Post_tags_Many;
4-
DROP TABLE Tag;
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1-
DROP TABLE Post_tags_Many;
1+
2+
ALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_owner_fkey;
3+
ALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_has_fkey;
24
DROP TABLE Tag;
5+
DROP TABLE Post_tags_Many;
36
ALTER TABLE Post ADD COLUMN tags JSONB NOT NULL DEFAULT null;
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
DROP TABLE Post_tags_Many;
1+
2+
23
DROP TABLE Tag;
4+
DROP TABLE Post_tags_Many;
35
ALTER TABLE Post ADD COLUMN tags TEXT NOT NULL DEFAULT null;

examples/newtype/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ publish = false
99
doc = false
1010

1111
[features]
12+
debug = ["butane/log", "butane/debug"]
1213
default = ["pg", "sqlite", "sqlite-bundled"]
1314
pg = ["butane/pg"]
1415
sqlite = ["butane/sqlite"]

examples/newtype/src/butane_migrations.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,12 @@ pub fn get_migrations() -> Result<MemMigrations, butane::Error> {
209209
},
210210
"from": null,
211211
"up": {
212-
"pg": "CREATE TABLE Blog (\nid BYTEA NOT NULL PRIMARY KEY,\n\"name\" TEXT NOT NULL\n);\nCREATE TABLE Post (\nid BYTEA NOT NULL PRIMARY KEY,\ntitle TEXT NOT NULL,\nbody TEXT NOT NULL,\npublished BOOLEAN NOT NULL,\nblog BYTEA NOT NULL,\nbyline TEXT ,\nlikes INTEGER NOT NULL\n);\nCREATE TABLE Post_tags_Many (\nowner BYTEA NOT NULL,\nhas TEXT NOT NULL\n);\nCREATE TABLE Tag (\ntag TEXT NOT NULL PRIMARY KEY\n);\nALTER TABLE Post ADD FOREIGN KEY (blog) REFERENCES Blog(id);\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (owner) REFERENCES Post(id);\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (has) REFERENCES Tag(tag);\nCREATE TABLE IF NOT EXISTS butane_migrations (\n\"name\" TEXT NOT NULL PRIMARY KEY\n);\n",
212+
"pg": "CREATE TABLE Blog (\nid BYTEA NOT NULL PRIMARY KEY,\n\"name\" TEXT NOT NULL\n);\nCREATE TABLE Post (\nid BYTEA NOT NULL PRIMARY KEY,\ntitle TEXT NOT NULL,\nbody TEXT NOT NULL,\npublished BOOLEAN NOT NULL,\nblog BYTEA NOT NULL,\nbyline TEXT,\nlikes INTEGER NOT NULL\n);\nCREATE TABLE Post_tags_Many (\nowner BYTEA NOT NULL,\nhas TEXT NOT NULL\n);\nCREATE TABLE Tag (\ntag TEXT NOT NULL PRIMARY KEY\n);\nALTER TABLE Post ADD FOREIGN KEY (blog) REFERENCES Blog(id);\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (owner) REFERENCES Post(id);\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (has) REFERENCES Tag(tag);\nCREATE TABLE IF NOT EXISTS butane_migrations (\n\"name\" TEXT NOT NULL PRIMARY KEY\n);\n",
213213
"sqlite": "CREATE TABLE Blog (\nid BLOB NOT NULL PRIMARY KEY,\n\"name\" TEXT NOT NULL\n);\nCREATE TABLE Post (\nid BLOB NOT NULL PRIMARY KEY,\ntitle TEXT NOT NULL,\nbody TEXT NOT NULL,\npublished INTEGER NOT NULL,\nblog BLOB NOT NULL,\nbyline TEXT,\nlikes INTEGER NOT NULL,\nFOREIGN KEY (blog) REFERENCES Blog(id)\n);\nCREATE TABLE Post_tags_Many (\nowner BLOB NOT NULL,\nhas TEXT NOT NULL,\nFOREIGN KEY (owner) REFERENCES Post(id)\nFOREIGN KEY (has) REFERENCES Tag(tag)\n);\nCREATE TABLE Tag (\ntag TEXT NOT NULL PRIMARY KEY\n);\n\n\nCREATE TABLE IF NOT EXISTS butane_migrations (\n\"name\" TEXT NOT NULL PRIMARY KEY\n);\n"
214214
},
215215
"down": {
216-
"pg": "DROP TABLE Blog;\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\nDROP TABLE Tag;\n",
217-
"sqlite": "DROP TABLE Blog;\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\nDROP TABLE Tag;\n"
216+
"pg": "ALTER TABLE Post DROP CONSTRAINT Post_blog_fkey;\nALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_owner_fkey;\nALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_has_fkey;\n\n\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\nDROP TABLE Blog;\nDROP TABLE Tag;\n",
217+
"sqlite": "\n\n\n\nDROP TABLE Tag;\nDROP TABLE Blog;\nDROP TABLE Post;\nDROP TABLE Post_tags_Many;\n"
218218
}
219219
},
220220
"20240406_035726416_tags": {
@@ -372,8 +372,8 @@ pub fn get_migrations() -> Result<MemMigrations, butane::Error> {
372372
},
373373
"from": "20240401_095709389_init",
374374
"up": {
375-
"pg": "DROP TABLE Post_tags_Many;\nDROP TABLE Tag;\nALTER TABLE Post ADD COLUMN tags JSONB NOT NULL DEFAULT null;\n",
376-
"sqlite": "DROP TABLE Post_tags_Many;\nDROP TABLE Tag;\nALTER TABLE Post ADD COLUMN tags TEXT NOT NULL DEFAULT null;\n"
375+
"pg": "\nALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_owner_fkey;\nALTER TABLE Post_tags_Many DROP CONSTRAINT Post_tags_Many_has_fkey;\nDROP TABLE Tag;\nDROP TABLE Post_tags_Many;\nALTER TABLE Post ADD COLUMN tags JSONB NOT NULL DEFAULT null;\n",
376+
"sqlite": "\n\nDROP TABLE Tag;\nDROP TABLE Post_tags_Many;\nALTER TABLE Post ADD COLUMN tags TEXT NOT NULL DEFAULT null;\n"
377377
},
378378
"down": {
379379
"pg": "CREATE TABLE Post_tags_Many (\nowner BYTEA NOT NULL,\nhas TEXT NOT NULL\n);\nCREATE TABLE Tag (\ntag TEXT NOT NULL PRIMARY KEY\n);\nALTER TABLE Post DROP COLUMN tags;\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (owner) REFERENCES Post(id);\nALTER TABLE Post_tags_Many ADD FOREIGN KEY (has) REFERENCES Tag(tag);\n",

0 commit comments

Comments
 (0)