180 条记录
15 私有链接
15 私有链接
use sea_orm_migration::prelude::*;
use std::fs;
use std::process::Command;
#[derive(DeriveMigrationName)]
pub struct Migration;
// SQL 文件中的占位符,需要替换成 SCHEMA
const SQL_FILE_SCHEMA: &str = "dev_001";
// 常量:数据库 schema 名称
const SCHEMA: &str = "dev_002";
// 要读取的 SQL 文件
const SQL_FILE_PATH: &str = "C:\\PATH\\Ccreate_table.sql";
// 直接使用 `DATABASE_URL` 常量
const DATABASE_URL: &str = "postgres://postgres:123456@localhost:5432/purchasing";
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
// 创建 schema 的 SQL 语句(不变)
let create_schema_sql = format!(
r#"
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_namespace WHERE nspname = '{SCHEMA}')
THEN CREATE SCHEMA {SCHEMA};
END IF;
END $$;
"#
);
// 读取 SQL 文件(可变)
let create_table_sql = match fs::read_to_string(SQL_FILE_PATH) {
Ok(content) => content.replace(SQL_FILE_SCHEMA, SCHEMA), // 替换 schema 占位符
Err(err) => {
println!("❌ 读取 SQL 文件 `{}` 失败: {}", SQL_FILE_PATH, err);
return Err(DbErr::Custom(format!("无法读取 SQL 文件: {}", err)));
}
};
// 执行创建 schema 语句(如果 schema 不存在)
manager.get_connection().execute_unprepared(&create_schema_sql).await?;
// 执行创建 users 表的 SQL(从文件读取)
manager.get_connection().execute_unprepared(&create_table_sql).await?;
println!("✅ 成功执行 SQL 文件 `{}`,创建 schema `{}`", SQL_FILE_PATH, SCHEMA);
// 运行 sea-orm-cli 生成实体
let cmd_args = [
"generate",
"entity",
"--output-dir",
"./src/entity",
"--database-schema",
SCHEMA,
"--database-url",
DATABASE_URL,
];
let output = Command::new("sea-orm-cli")
.args(&cmd_args)
.env("DATABASE_URL", DATABASE_URL) // 手动传递 DATABASE_URL
.output();
match output {
Ok(output) if output.status.success() => {
println!("✅ SeaORM 实体已成功更新!");
println!("📝 SeaORM 输出 (stdout):\n{}", String::from_utf8_lossy(&output.stdout));
}
Ok(output) => {
println!("⚠️ SeaORM 实体更新失败: {:?}", String::from_utf8_lossy(&output.stderr));
}
Err(err) => {
println!("❌ 无法运行 sea-orm-cli: {}", err);
}
}
// 打印命令,方便调试
println!("🚀 手动执行命令更新实体: \n\nsea-orm-cli {}\n\n", cmd_args.join(" "));
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
// 删除 schema 及所有表
let drop_schema_sql = format!(
r#"
DROP SCHEMA IF EXISTS {SCHEMA} CASCADE;
"#
);
// 执行删除 schema 及其所有表的 SQL
manager.get_connection().execute_unprepared(&drop_schema_sql).await?;
println!("✅ 成功删除 schema `{}` 及所有表", SCHEMA);
Ok(())
}
}