mysql-noschema
v1.0.2
Published
> Use mysql2/promise
Downloads
14
Readme
mysql-noschema
Use mysql2/promise
- 给 mysql 添加 NoSQL 的风格,根据 insert 语句 自动创建表和字段
- 内置一系列钩子,可以根据条件自定义类型和忽略某些情况的 NoSQL
- 自动类型推导
Install
$ yarn add mysql-noschema
Use
import MysqlNoSchema from 'mysql-noschema'
async function start(){
// db 为 mysql2 连机器默认对象
const db = await MysqlNoSchema({
host: "localhost",
user: "root",
password: "...",
database: "...",
});
// 默认 query 若未创建表,或者个别字段未有,下面这句会抛出错误
await db.query('INSERT INTO user (name, age) VALUES ("dog", 20)');
// 使用 insert 方法执行 `INSERT INTO` 语句,会自动创建表或字段
await db.inset('INSERT INTO user (name, age) VALUES ("dog", 20)');
}
start();
自动类型推导
根据 VALUES ("dog", 20, 1.3, "2020-12-20")
等内容,默认情况做如下推导:
- string 类型: 根据插入的长度 * 4 判定在 255 - 65500 的某个2的平方区间
- boolean 类型: TINYINT
- number 类型,若有小数点: FLOAT
- number 类型,若无小数点: INT
- 时间字符串, 若有小数点: TIMESTAMP
- 时间字符串, 若无小数点: DATETIME
钩子
const db = await MysqlNoSchema({
host: "localhost",
user: "root",
password: "...",
database: "...",
noSchema: {
/** 判断哪些情况忽略 NoSchema, 线上稳定之后,可以改为默认返回 true */
ignoreNoSchema?: (checker) => any;
/** 仅在开发时使用, 当 Table 小于一定的长度,若插入的内容和表结构冲突,自动重新创建表,清空表数据 */
resetTableLimit?: { [tableName: string]: number };
/** 主键名称,默认为 id */
primaryKey?: string;
/** 忽略默认字段 id 的 tableNames */
ignoreId?: string[];
/** 忽略默认字段 create_at 的 tableNames */
ignoreCreateAt?: string[];
/** 忽略默认字段 update_at 的 tableNames */
ignoreUpdateAt?: string[];
/** 带小数点的 number 自动识别为 Double 的 tableNames,默认为 Float */
focusDoubleType?: string[];
/** string 类型默认创建 varchar 最小值, 默认为 255 */
varcharMinLength?: number;
/** 根据首次插入的长度 * varcharRate 来判定 varchar 区间, 默认为 4 倍, 最后会和 varcharMinLength 之间取最大值 */
varcharRate?: number;
// 每个表自动添加时,都会执行此方法,可用于覆盖 `CREATE TABLE` 的 SQL
replaceCreateTable: ({ table, sql, columns }) => string,
// 每个字段自动添加时,都会执行此方法,可用于覆盖 `ALTER TABLE` 的 SQL
replaceAlterColumn: ({ table, column, sql }) => string,
}
});