| | |
| | |
| |
|
| | library(RSQLite) |
| | library(DBI) |
| |
|
| | cat("开始数据库迁移...\n") |
| |
|
| | |
| | con <- dbConnect(SQLite(), "biofree_users.sqlite") |
| |
|
| | |
| | cat("\n1. 备份原始数据...\n") |
| | users_data <- dbGetQuery(con, "SELECT * FROM users") |
| | usage_logs_data <- dbGetQuery(con, "SELECT * FROM usage_logs") |
| |
|
| | cat("备份了", nrow(users_data), "条用户记录和", nrow(usage_logs_data), "条使用日志\n") |
| |
|
| | |
| | cat("\n2. 检查当前表结构...\n") |
| | users_info <- dbGetQuery(con, "PRAGMA table_info(users)") |
| | print(users_info) |
| |
|
| | |
| | existing_columns <- users_info$name |
| |
|
| | |
| | new_columns <- list( |
| | email = "TEXT", |
| | school = "TEXT", |
| | is_active = "INTEGER DEFAULT 0", |
| | activation_code = "TEXT", |
| | activated_at = "TEXT" |
| | ) |
| |
|
| | |
| | cat("\n3. 添加缺失的列...\n") |
| | for (col_name in names(new_columns)) { |
| | if (!col_name %in% existing_columns) { |
| | sql <- sprintf("ALTER TABLE users ADD COLUMN %s %s", col_name, new_columns[[col_name]]) |
| | dbExecute(con, sql) |
| | cat("已添加列:", col_name, "\n") |
| | } else { |
| | cat("列已存在:", col_name, "\n") |
| | } |
| | } |
| |
|
| | |
| | cat("\n4. 创建registration_codes表...\n") |
| | if (!dbExistsTable(con, "registration_codes")) { |
| | dbExecute(con, " |
| | CREATE TABLE registration_codes ( |
| | email TEXT PRIMARY KEY, |
| | code TEXT, |
| | username TEXT, |
| | real_name TEXT, |
| | school TEXT, |
| | created_at TEXT, |
| | expires_at TEXT |
| | )") |
| | cat("已创建registration_codes表\n") |
| | } else { |
| | cat("registration_codes表已存在\n") |
| | } |
| |
|
| | |
| | cat("\n5. 更新现有用户数据...\n") |
| | if (nrow(users_data) > 0) { |
| | |
| | for (i in 1:nrow(users_data)) { |
| | username <- users_data$username[i] |
| |
|
| | |
| | current_user <- dbGetQuery(con, "SELECT email, school, is_active FROM users WHERE username = ?", |
| | params = list(username)) |
| |
|
| | |
| | if (is.na(current_user$email) || current_user$email == "") { |
| | dbExecute(con, "UPDATE users SET email = ? WHERE username = ?", |
| | params = list("", username)) |
| | } |
| |
|
| | |
| | if (is.na(current_user$school) || current_user$school == "") { |
| | default_school <- if (username == "admin") "系统管理" else "未知" |
| | dbExecute(con, "UPDATE users SET school = ? WHERE username = ?", |
| | params = list(default_school, username)) |
| | } |
| |
|
| | |
| | if (is.na(current_user$is_active) || current_user$is_active == 0) { |
| | dbExecute(con, "UPDATE users SET is_active = 1 WHERE username = ?", |
| | params = list(username)) |
| | } |
| | } |
| | cat("已更新", nrow(users_data), "条用户记录\n") |
| | } |
| |
|
| | |
| | cat("\n6. 验证迁移结果...\n") |
| | final_info <- dbGetQuery(con, "PRAGMA table_info(users)") |
| | cat("users表最终结构:\n") |
| | print(final_info) |
| |
|
| | |
| | cat("\n7. 迁移后的用户数据:\n") |
| | final_data <- dbGetQuery(con, "SELECT username, name, email, school, is_active FROM users") |
| | print(final_data) |
| |
|
| | |
| | dbDisconnect(con) |
| |
|
| | cat("\n✅ 数据库迁移完成!\n") |
| | cat("现在可以正常使用注册功能了。\n") |