每天 Shaarli
GitHub - lukasbach/yana: Powerful note-taking app with nested documents, full-text search, rich-text editor, code snippet editor and more
Powerful note-taking app with nested documents, full-text search, rich-text editor, code snippet editor and more - lukasbach/yana
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(())
}
}
✅ 可以用 Navicat 直接设计表结构
✅ 导出 SQL 结构后,直接放到 create_table.sql 里
✅ migrate up 自动创建 SCHEMA 并执行 SQL,不需要手动改 Rust 代码
✅ 如果要换 schema,只需要改 SCHEMA 变量,甚至可以让它动态读取环境变量
cargo build --release
默认情况下不会自动并行使用多个 CPU 核心进行编译,但你可以手动启用 多线程编译 来加速构建。
方法 1:使用 JOBS
选项
你可以在编译时使用 -j
选项,指定使用的并行编译线程数。例如:
cargo build --release -j 8
-
-j 8
表示使用 8 个核心进行编译。 -
你可以将
8
替换为$(nproc)
以自动获取 CPU 核心数:cargo build --release -j $(nproc)
这样可以最大化使用 CPU 资源,提高编译速度。
-
- *
方法 2:设置 CARGO_BUILD_JOBS
环境变量
如果你不想每次都输入 -j
选项,可以设置环境变量:
export CARGO_BUILD_JOBS=$(nproc)
cargo build --release
或者将其加入 ~/.bashrc
/ ~/.bash_profile
以使其永久生效:
echo 'export CARGO_BUILD_JOBS=$(nproc)' >> ~/.bashrc
source ~/.bashrc
方法 3:修改 config.toml
配置文件
你还可以在 Cargo 配置文件 中全局设置并行编译:
mkdir -p ~/.cargo
nano ~/.cargo/config.toml
然后添加以下内容:
[build]
jobs = 8 # 或者 $(nproc) 的实际值
保存后,运行 cargo build --release
时会默认使用 8 个核心。
方法 4:使用 sccache
加速编译
如果你的 Rust 项目编译非常缓慢,你还可以使用 sccache
进行缓存加速:
cargo install sccache
export RUSTC_WRAPPER=sccache
cargo build --release -j $(nproc)
sccache
主要用于缓存编译结果,特别适用于 增量编译,加快二次编译速度。
总结
✅ 推荐方式
- 临时并行:
cargo build --release -j $(nproc)
- 永久生效:设置
CARGO_BUILD_JOBS
或修改config.toml
- 加速工具:使用
sccache
进一步优化
最终的cargo.toml
[source.crates-io]
replace-with = 'rsproxy-sparse'
[source.rsproxy]
registry = "https://rsproxy.cn/crates.io-index"
[source.rsproxy-sparse]
registry = "sparse+https://rsproxy.cn/index/"
[registries.rsproxy]
index = "https://rsproxy.cn/crates.io-index"
[net]
git-fetch-with-cli = true
[profile.dev]
opt-level = 0 # 优化等级最低,编译速度最快(默认值)
debug = true # 保留调试符号,方便调试和断点追踪
codegen-units = 16 # 生成多个并行代码单元,加快多核编译速度
incremental = true # 启用增量编译,修改部分代码时加速后续编译
overflow-checks = false # 关闭整数溢出检查(调试时略快,需小心)
[profile.release]
opt-level = "z" # 优化最小二进制体积(比 "s" 更激进)
lto = false # 关闭 LTO(Link Time Optimization),加快构建但牺牲些许体积
codegen-units = 8 # 控制并行生成单元,8 通常能平衡速度和优化
panic = "abort" # 遇到 panic 时直接终止,无回溯,减小代码体积
strip = true # 编译后移除符号表和调试信息,减小最终文件体积
[alias]
b = "build --release"
r = "run --release"
[build]
jobs = 16
这样,你的 cargo build --release
就可以 最大限度利用多核 CPU 进行编译了 🚀
cpu_test.sh
#!/bin/bash
# 获取 CPU 核心数
CPU_COUNT=$(nproc)
# 定义一个数组存储进程 ID
declare -a PIDS
# 计算密集型任务(无限循环计算)
cpu_stress() {
while :; do :; done
}
echo "开始逐步激活 CPU 核心..."
# 逐个核心启动计算任务
for ((i=1; i<=CPU_COUNT; i++)); do
cpu_stress & # 后台运行计算任务
PIDS+=($!) # 记录进程 ID
echo "已激活 ${i} 个核心..."
sleep 1 # 每秒增加一个核心
done
echo "CPU 已全部占满,保持 5 秒..."
# 维持 CPU 满载 5 秒
sleep 5
echo "开始逐步释放 CPU 核心..."
# 逐个终止计算任务
for ((i=CPU_COUNT-1; i>=0; i--)); do
kill ${PIDS[i]}
unset PIDS[i]
echo "已释放 ${CPU_COUNT-i} 个核心..."
sleep 1 # 每秒释放一个核心
done
echo "所有 CPU 核心已释放,脚本结束。"