# fast-db-codegen

> a code generator base on ejs template and mysql database

Latest version **2.0.1** (published 2020-05-29) · ISC license · 0 weekly downloads

## Install

```sh
npm install fast-db-codegen
pnpm add fast-db-codegen
yarn add fast-db-codegen
bun add fast-db-codegen
```

Provides the command `codegen`.

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.1 |
| Published | 2020-05-29 |
| First published | 2019-11-09 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Unpacked size | 59 KB |
| Known vulnerabilities | 0 (+2 in 1 direct dependencies) |
| Install scripts | no |
| GitHub stars | 1 |
| Author | diamondfsd |
| Maintainers | diamondfsd |

## Links

- npm: https://www.npmjs.com/package/fast-db-codegen
- Repository: https://github.com/k55k32/fast-db-codegen
- Homepage: https://github.com/k55k32/fast-db-codegen#readme
- Issues: https://github.com/k55k32/fast-db-codegen/issues
- npm.io page: https://npm.io/package/fast-db-codegen

## Dependencies (2)

- [ejs](https://npm.io/package/ejs.md) ^2.7.4
- [mysql](https://npm.io/package/mysql.md) ^2.18.1

## Recent versions

- 2.0.1 (latest) — 2020-05-29
- 2.0.0 — 2020-04-13
- 1.0.12 — 2019-12-13
- 1.0.11 — 2019-12-06
- 1.0.10 — 2019-11-11
- 1.0.9 — 2019-11-11
- 1.0.8 — 2019-11-11
- 1.0.7 — 2019-11-11
- 1.0.6 — 2019-11-11
- 1.0.5 — 2019-11-11
- 1.0.4 — 2019-11-11
- 1.0.3 — 2019-11-09
- 1.0.2 — 2019-11-09
- 1.0.1 — 2019-11-09

## README

## Fast Db Codegen
以Mysql数据库作为数据源, 根据读取到的表结构和提前写好的模板, 生成对应的代码, 使用ejs作为模板引擎

### 使用
#### 安装
```bash
# npm
npm install -D fast-db-codegen
# yarn
yarn add -D fast-db-codegen
```
#### 数据源配置
- 在项目根目录新建 `.fast-codegen` 文件夹
- 创建 `config.json` 数据源配置
```json
{
    "datasource": {
        "host": "yourMysqlHost",
        "user": "yourMysqlUser",
        "password": "yourMysqlPassword",
        "port": "yourMysqlPort",
        "database": "yourMysqlDatabase"
    }
}
```

### 模板内参数
- 所有 `.fast-codegen/default` 文件夹下, 以`.ejs`为扩展名, 并且内容的第一行以`#!`开头的文件, 都会当做模板处理进行编译
- 可以根据需求创建多套模板，在 `.fast-codege` 下创建新的文件夹 `dirName`，在运行的时候通过 `npm run codegen template=dirName xxxx` 进行选择模板
- 第一行为描述行 `#! xxx/xxx.xx` 为渲染目标路径（第一行如果不是以 `#!` 开头, 不进行渲染）,  `#!`后的内容同样支持 ejs 语法
- 可以给描述行传参进行不同的渲染模式, 格式为 `#! xxx/xxx/xx.xx?mode=youMode`, 其中`youMode`替换为需要的模式
  - 啥都不传: 默认模式, 目标文件不存在, 则会创建目录并且创建目标文件并写入
  - append: 追加模式, 目标文件不存在, 则创建并写入内容, 如目标文件已存在, 则在文件末尾处追加模板渲染结果
  - overwrite: 重写模式, 目标文件不存在, 则创建别写入内容, 如目标文件已存在, 则删除模板文件后, 再进行创建和写入的流程
- 模板内model格式如下
```ts
/**
 * 全局参数类型
 */
class ModelType {
     /** 根据表名转换的类型名称 `fs_user` -> `FsUser` */
    typeName: string
    /**  根据表名转换类型名称连字符模式 `fs_demo_table_string` -> `fs-demo-table-string` */
    typeNameWithHyphen: string
    /** 所有表字段 */
    params: Field[]
    /** 目前和typeName一致 */
    realType: string
    /** 表名 */
    tableName?: string
    /** 主键名称 */
    primaryKey?: string
    /** 表备注 */
    typeRemark?: string
}

 class Field {
    /** 字段名驼峰 test_field -> testField */
    name: string
    /** 字段类型(经过转换的javascript类型) */
    type: string
    /** 原始数据库类型 */
    rawType: string
    /** 字段备注 */
    remark?: string
}

```

### 举个例子
- `fs_user` 表结构如下:
```sql
CREATE TABLE `fs_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `username` varchar(36) CHARACTER  NOT NULL COMMENT '用户名',
  `password` char(64) CHARACTER  NOT NULL COMMENT '密码',
  `password_salt` char(32) CHARACTER  NOT NULL COMMENT '密码Salt',
  `real_name` varchar(36) CHARACTER  DEFAULT NULL COMMENT '真实姓名',
  `email` varchar(128) DEFAULT NULL COMMENT '邮箱',
  `mobile` varchar(20) DEFAULT NULL COMMENT '电话',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `last_login_time` timestamp NULL DEFAULT NULL COMMENT '最后一次登录时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户基础表'
```

- 有个模板文件如下 `.fast-codege/default/demo.ejs` :
```
#! .temp/<%=realType%>.json
{
    "typeName":  <%-JSON.stringify(typeName)%>,
    "fields": [<%-
        fields.map(JSON.stringify).join(',\n')%>
    ],
    "realType": <%-JSON.stringify(realType)%>,
    "tableName": <%-JSON.stringify(tableName)%>,
    "primaryKey": <%-JSON.stringify(primaryKey)%>,
    "typeRemark": <%-JSON.stringify(typeRemark)%>
}
```
- 生成文件 `.temp/FsUser.json`
```json
{
    "typeName":  "FsUser",
    "typeNameWithHyphen":  "fs-user",
    "fields": [
        {"name":"id","rawType":"int","type":"number","remark":"ID"},
{"name":"username","rawType":"varchar","type":"string","remark":"用户名"},
{"name":"password","rawType":"char","type":"string","remark":"密码"},
{"name":"passwordSalt","rawType":"char","type":"string","remark":"密码Salt"},
{"name":"realName","rawType":"varchar","type":"string","remark":"真实姓名"},
{"name":"email","rawType":"varchar","type":"string","remark":"邮箱"},
{"name":"mobile","rawType":"varchar","type":"string","remark":"电话"},
{"name":"createTime","rawType":"timestamp","type":"number","remark":"创建时间"},
{"name":"updateTime","rawType":"timestamp","type":"number","remark":"更新时间"},
{"name":"lastLoginTime","rawType":"timestamp","type":"number","remark":"最后一次登录时间"}
    ],
    "realType": "FsUser",
    "tableName": "fs_user",
    "primaryKey": "id",
    "typeRemark": "用户基础表"
}
```

### 生成代码
在 `package.json`的`scripts`中添加配置
```js
{
    codegen: "codegen"
}
```
运行
```bash
npm run codegen yourTable yourTable2 yourTable3
```

### 开发
- 运行 `npm i`
- 运行 `npm run dev` 编译 `bin/index.ts` 至 `dist\index.js`
- 运行 `npm run start || node dist\index.js` ` tablename1 tablename2 tablename3` 进行测试

---
_Source: https://npm.io/package/fast-db-codegen · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
