use roomrs::{DatabaseSpec, Migration, dao, database, entity, params};
#[entity(table = "docs")]
struct DocV1 {
#[pk(autoincrement)]
id: i64,
title: String,
}
#[database(entities(DocV1), version = 1)]
struct DbV1;
#[entity(table = "docs")]
#[derive(Debug)]
struct DocV3 {
#[pk(autoincrement)]
id: i64,
title: String,
note: String,
done: bool,
}
#[dao]
trait DocDao {
#[query("SELECT * FROM docs ORDER BY id")]
fn all(&self) -> roomrs::Result<Vec<DocV3>>;
}
#[database(entities(DocV3), daos(DocDao), version = 3)]
struct DbV3;
fn main() -> roomrs::Result<()> {
let dir = tempfile::tempdir().expect("tempdir");
let path = dir.path().join("m.db");
{
let db = DbV1::builder().sqlite(&path).build()?;
db.run_sync()
.execute("INSERT INTO docs (title) VALUES ('구버전 행')", params![])?;
}
let db = DbV3::builder()
.sqlite(&path)
.migration(Migration::sql(
1,
2,
r#"ALTER TABLE "docs" ADD COLUMN "note" TEXT NOT NULL DEFAULT ''"#,
))
.migration(Migration::code(2, 3, |tx| {
tx.execute_batch(r#"ALTER TABLE "docs" ADD COLUMN "done" INTEGER NOT NULL DEFAULT 0"#)
}))
.build()?;
let v: i64 = db
.run_sync()
.query_scalar("PRAGMA user_version", params![])?;
println!("마이그레이션 완료: user_version = {v}");
for d in db.run_sync().doc_dao().all()? {
println!(" {d:?} (기존 데이터 보존)");
}
let old = <DbV1 as DatabaseSpec>::schema().to_snapshot();
let new = <DbV3 as DatabaseSpec>::schema().to_snapshot();
println!(
"\n--- diff 초안 (roomrs migrate diff 동일) ---\n{}",
roomrs::diff_sql(&old, &new)
);
Ok(())
}