utils.rs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use std::fs;
  2. use sea_orm::{ConnectionTrait, DatabaseConnection, Statement, TransactionTrait};
  3. use tauri::{Manager, path::BaseDirectory};
  4. pub async fn migration_db(app: &tauri::App, conn: &DatabaseConnection) -> anyhow::Result<()> {
  5. let sql_path = app
  6. .path()
  7. .resolve("resources/table_struct.sql", BaseDirectory::Resource)?;
  8. conn.execute(Statement::from_string(
  9. conn.get_database_backend(),
  10. "CREATE TABLE IF NOT EXISTS seaql_migrations (
  11. version VARCHAR(255) PRIMARY KEY,
  12. applied_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  13. )"
  14. .to_owned(),
  15. ))
  16. .await?;
  17. let applied: Vec<String> = conn
  18. .query_all(Statement::from_string(
  19. conn.get_database_backend(),
  20. "SELECT version FROM seaql_migrations".to_owned(),
  21. ))
  22. .await?
  23. .into_iter()
  24. .filter_map(|row| row.try_get("", "version").ok())
  25. .collect();
  26. if let Some(sql_path_stem) = sql_path.file_stem() {
  27. if let Some(version) = sql_path_stem.to_str() {
  28. if !applied.contains(&version.to_string()) {
  29. let sql_str = fs::read_to_string(&sql_path)?;
  30. let tx = conn.begin().await?;
  31. tx.execute(Statement::from_string(conn.get_database_backend(), sql_str))
  32. .await?;
  33. tx.execute(Statement::from_string(
  34. conn.get_database_backend(),
  35. format!(
  36. "INSERT INTO seaql_migrations (version) VALUES ('{}')",
  37. version
  38. ),
  39. ))
  40. .await?;
  41. tx.commit().await?;
  42. println!("✅ Applied migration: {}", version);
  43. }
  44. }
  45. }
  46. Ok(())
  47. }