每天 Shaarli

一天内的所有链接,汇聚在一个页面上。

March 3, 2025

Note: nmslsb.top
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

Note: sea_orm_migration的sea migrate up和sea migrate down初始化数据库表的rs脚本
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 变量,甚至可以让它动态读取环境变量
Note: Cargo build --release加速编译

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 进行编译了 🚀

Note: CentOS7测试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 核心已释放,脚本结束。"