diff --git a/src/arcaea/import_charts.rs b/src/arcaea/import_charts.rs
index ce295a8..784960f 100644
--- a/src/arcaea/import_charts.rs
+++ b/src/arcaea/import_charts.rs
@@ -171,12 +171,21 @@ pub fn import_songlist(
 	let ptt_entries = get_ptt_entries(paths).context("Failed to read ptt entries")?;
 
 	let transaction = conn.transaction()?;
-	transaction.execute("DELETE FROM charts", ())?;
-	transaction.execute("DELETE FROM songs", ())?;
+	transaction.pragma_update(None, "defer_foreign_keys", "ON")?;
+
+	transaction
+		.execute("DELETE FROM charts", ())
+		.with_context(|| anyhow!("Failed to delete all charts"))?;
+
+	transaction
+		.execute("DELETE FROM songs", ())
+		.with_context(|| anyhow!("Failed to delete all songs"))?;
 
 	let songlist: Songlist = serde_json::from_reader(std::io::BufReader::new(
-		std::fs::File::open(paths.songlist_path())?,
-	))?;
+		std::fs::File::open(paths.songlist_path())
+			.with_context(|| anyhow!("Failed to read songlist file"))?,
+	))
+	.with_context(|| anyhow!("Failed to parse songlist file"))?;
 
 	let mut song_count = 0;
 	let mut chart_count = 0;
@@ -218,7 +227,7 @@ pub fn import_songlist(
 			chart_count += 1;
 
 			let difficulty = crate::private_server::decode_difficulty(chart.difficulty)
-				.ok_or_else(|| anyhow!("Invalid difficulty"))?;
+				.ok_or_else(|| anyhow!("Invalid difficulty {}", chart.difficulty))?;
 
 			let level = format!(
 				"{}{}",
diff --git a/src/context/db.rs b/src/context/db.rs
index 37a2b88..2002885 100644
--- a/src/context/db.rs
+++ b/src/context/db.rs
@@ -19,6 +19,7 @@ pub fn connect_db(paths: &ShimmeringPaths) -> anyhow::Result<SqlitePool> {
 	let mut conn = rusqlite::Connection::open(&db_path)
 		.with_context(|| "Could not connect to sqlite database")?;
 	conn.pragma_update(None, "journal_mode", "WAL")?;
+	conn.pragma_update(None, "foreign_keys", "ON")?;
 
 	// {{{ Run migrations
 	static MIGRATIONS_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/migrations");