Drop key column from backlogs table
Backlogs are identified by name, not key. The key column was already
unused — create() generated a dummy value just to satisfy the schema.
Backup-and-restore pattern avoids ON DELETE CASCADE wiping backlog_tasks
during the table rebuild.

Assisted-by: Claude Opus 4.6 via pi
change lunnsryuvvvtzlqvzusmsnmqvkslpyrr
commit f9faf724ebb48209ae19d21d27cc0dd9ed21a9c6
author Alpha Chen <alpha@kejadlen.dev>
date
parent vytquqyk
diff --git a/migrations/003_drop_backlog_key.sql b/migrations/003_drop_backlog_key.sql
new file mode 100644
index 0000000..3aa2585
--- /dev/null
+++ b/migrations/003_drop_backlog_key.sql
@@ -0,0 +1,22 @@
+-- Backup backlog_tasks (DROP TABLE backlogs cascades the foreign key delete)
+CREATE TEMPORARY TABLE backlog_tasks_backup AS SELECT * FROM backlog_tasks;
+
+-- Rebuild backlogs without the key column, with UNIQUE on name directly
+CREATE TABLE backlogs_new (
+    id INTEGER PRIMARY KEY AUTOINCREMENT,
+    name TEXT NOT NULL UNIQUE,
+    created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
+    updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
+);
+
+INSERT INTO backlogs_new (id, name, created_at, updated_at)
+SELECT id, name, created_at, updated_at FROM backlogs;
+
+-- Drop the separate index and old table
+DROP INDEX IF EXISTS idx_backlogs_name;
+DROP TABLE backlogs;
+ALTER TABLE backlogs_new RENAME TO backlogs;
+
+-- Restore backlog_tasks
+INSERT INTO backlog_tasks SELECT * FROM backlog_tasks_backup;
+DROP TABLE backlog_tasks_backup;
diff --git a/src/ops/backlog.rs b/src/ops/backlog.rs
index 31babef..de8c93b 100644
--- a/src/ops/backlog.rs
+++ b/src/ops/backlog.rs
@@ -1,15 +1,11 @@
 use crate::error::RangerError;
-use crate::key;
 use crate::models::Backlog;
 use sqlx::sqlite::SqliteConnection;
 
 pub async fn create(conn: &mut SqliteConnection, name: &str) -> Result<Backlog, RangerError> {
-    // key column still exists in the schema but is unused; generate a dummy value
-    let key = key::generate_key();
     let backlog = sqlx::query_as::<_, Backlog>(
-        "INSERT INTO backlogs (key, name) VALUES (?, ?) RETURNING id, name, created_at, updated_at",
+        "INSERT INTO backlogs (name) VALUES (?) RETURNING id, name, created_at, updated_at",
     )
-    .bind(&key)
     .bind(name)
     .fetch_one(&mut *conn)
     .await?;