45 个版本

0.16.0-rc.12024年8月9日
0.15.0-rc.72024年6月19日
0.15.0-rc.42024年3月24日
0.14.1 2023年9月14日
0.2.3 2021年6月19日

#79数据库接口

Download history 28358/week @ 2024-05-04 32461/week @ 2024-05-11 32533/week @ 2024-05-18 28004/week @ 2024-05-25 31933/week @ 2024-06-01 39657/week @ 2024-06-08 26325/week @ 2024-06-15 31078/week @ 2024-06-22 31555/week @ 2024-06-29 35284/week @ 2024-07-06 25374/week @ 2024-07-13 30618/week @ 2024-07-20 28634/week @ 2024-07-27 33186/week @ 2024-08-03 36475/week @ 2024-08-10 42891/week @ 2024-08-17

每月 146,126 次下载
用于 78 个 Crates(直接使用 4 个)

MIT/Apache 许可协议

3MB
8K SLoC

SeaSchema

🌿 SQL 模式定义和发现

crate docs build status

关于

SeaSchema 是一个用于帮助您管理 MySQL、Postgres 和 SQLite 数据库模式的库。它提供:1) 用于表示数据库模式映射的类型定义,每个数据库都与之紧密相连;2) 用于发现它们的实用工具。

GitHub stars 如果您喜欢我们所做的工作,请考虑为我们点赞、评论、分享并贡献!

Discord 加入我们的 Discord 服务器,与其他 SeaQL 社区成员交流!

架构

该包分为不同的模块

  • def:类型定义
  • queryparser:用于查询和解析 information_schema
  • discovery:连接到实时数据库并发现 Schema
  • writer:用于将 Schema 导出为 SeaQuery 和 SQL 语句

可以使用 with-serde 启用类型定义上的 JSON 序列化和反序列化。

模式发现

以 MySQL 的 Sakila 示例数据库 为例,给定以下表

CREATE TABLE film_actor (
  actor_id SMALLINT UNSIGNED NOT NULL,
  film_id SMALLINT UNSIGNED NOT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (actor_id,film_id),
  KEY idx_fk_film_id (`film_id`),
  CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE,
  CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

发现的模式结果

TableDef {
    info: TableInfo {
        name: "film_actor",
        engine: InnoDb,
        auto_increment: None,
        char_set: Utf8Mb4,
        collation: Utf8Mb40900AiCi,
        comment: "",
    },
    columns: [
        ColumnInfo {
            name: "actor_id",
            col_type: SmallInt(
                NumericAttr {
                    maximum: None,
                    decimal: None,
                    unsigned: Some(true),
                    zero_fill: None,
                },
            ),
            null: false,
            key: Primary,
            default: None,
            extra: ColumnExtra {
                auto_increment: false,
                on_update_current_timestamp: false,
                generated: false,
                default_generated: false,
            },
            expression: None,
            comment: "",
        },
        ColumnInfo {
            name: "film_id",
            col_type: SmallInt(
                NumericAttr {
                    maximum: None,
                    decimal: None,
                    unsigned: Some(true),
                    zero_fill: None,
                },
            ),
            null: false,
            key: Primary,
            default: None,
            extra: ColumnExtra {
                auto_increment: false,
                on_update_current_timestamp: false,
                generated: false,
                default_generated: false,
            },
            expression: None,
            comment: "",
        },
        ColumnInfo {
            name: "last_update",
            col_type: Timestamp(TimeAttr { fractional: None }),
            null: false,
            key: NotKey,
            default: Some(ColumnDefault::CurrentTimestamp),
            extra: ColumnExtra {
                auto_increment: false,
                on_update_current_timestamp: true,
                generated: false,
                default_generated: true,
            },
            expression: None,
            comment: "",
        },
    ],
    indexes: [
        IndexInfo {
            unique: false,
            name: "idx_fk_film_id",
            parts: [
                IndexPart {
                    column: "film_id",
                    order: Ascending,
                    sub_part: None,
                },
            ],
            nullable: false,
            idx_type: BTree,
            comment: "",
            functional: false,
        },
        IndexInfo {
            unique: true,
            name: "PRIMARY",
            parts: [
                IndexPart {
                    column: "actor_id",
                    order: Ascending,
                    sub_part: None,
                },
                IndexPart {
                    column: "film_id",
                    order: Ascending,
                    sub_part: None,
                },
            ],
            nullable: false,
            idx_type: BTree,
            comment: "",
            functional: false,
        },
    ],
    foreign_keys: [
        ForeignKeyInfo {
            name: "fk_film_actor_actor",
            columns: [ "actor_id" ],
            referenced_table: "actor",
            referenced_columns: [ "actor_id" ],
            on_update: Cascade,
            on_delete: Restrict,
        },
        ForeignKeyInfo {
            name: "fk_film_actor_film",
            columns: [ "film_id" ],
            referenced_table: "film",
            referenced_columns: [ "film_id" ],
            on_update: Cascade,
            on_delete: Restrict,
        },
    ],
}

许可证

许可协议为以下之一

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可协议定义的,您提交给作品的所有有意贡献,应按上述方式双许可,不附加任何额外的条款或条件。

SeaSchema 是一个由社区驱动的项目。我们欢迎您参与、贡献,共同为 Rust 的未来努力。

向我们的贡献者致敬!

Contributors

依赖项

~1–17MB
~241K SLoC