修复迁移兼容性问题,避免切换数据库失败

This commit is contained in:
JSR
2026-03-20 18:03:56 +08:00
parent 8155dac75e
commit 9dd2e8b424
+18 -16
View File
@@ -123,25 +123,27 @@ impl Migration {
sqlite: bool,
) -> Result<(), DbErr> {
let db_backend = Self::get_db_backend(sqlite);
let exists_sql = if sqlite {
"SELECT 1 AS exists FROM pragma_table_info('students') WHERE name = 'reward_points' LIMIT 1"
.to_string()
} else {
"SELECT 1 AS exists FROM information_schema.columns WHERE table_name = 'students' AND column_name = 'reward_points' LIMIT 1"
.to_string()
};
let exists = conn
.query_one(Statement::from_string(db_backend.clone(), exists_sql))
.await?
.is_some();
if !exists {
let alter_sql = "ALTER TABLE students ADD COLUMN reward_points INTEGER DEFAULT 0";
conn.execute(Statement::from_string(db_backend.clone(), alter_sql.to_string()))
.await?;
let result = conn
.execute(Statement::from_string(db_backend.clone(), alter_sql.to_string()))
.await;
match result {
Ok(_) => {
info!("Added students.reward_points column");
}
Err(e) => {
let msg = e.to_string().to_lowercase();
let already_exists = msg.contains("duplicate column")
|| msg.contains("already exists")
|| msg.contains("duplicate");
if already_exists {
info!("students.reward_points already exists, skip alter");
} else {
return Err(e);
}
}
}
Ok(())
}