修复0索引时建表失败的bug

master 3.0.7
宇天 2019-09-19 15:19:40 +08:00
parent 97484744a7
commit 247c6591fa
5 changed files with 63 additions and 53 deletions

View File

@ -1,3 +1,12 @@
# 3.0.7 / 2019-09-19
* 修复tableCreate在没有索引时建表失败的bug
* 更新文档
# 3.0.6 / 2019-03-12
* 修改默认编码为 utf8mb4
# 3.0.5 / 2018-07-17 # 3.0.5 / 2018-07-17
* 修复join方法一处的笔误 * 修复join方法一处的笔误

View File

@ -12,7 +12,7 @@ let conn = new Mysqli({
post: 3306, //端口, 默认 3306 post: 3306, //端口, 默认 3306
user: '', //用户名 user: '', //用户名
passwd: '', //密码 passwd: '', //密码
charset: '', // 数据库编码,默认 utf8 【可选】 charset: '', // 数据库编码,默认 utf8mb4 【可选】
db: '' // 可指定数据库,也可以不指定 【可选】 db: '' // 可指定数据库,也可以不指定 【可选】
}) })
@ -34,8 +34,8 @@ let conn = new Mysqli([
### emit([slave], [db]) ### emit([slave], [db])
* slave <Boolean> [可选]是否"从库", 默认为 false, * slave `<Boolean>` [可选]是否"从库", 默认为 false,
* db <String> [可选]要连接的数据库名, 默认为空 * db `<String>` [可选]要连接的数据库名, 默认为空
> 返回一个 db 实例, 这个方法是必须要的, 所有的 sql 操作,都要先实例一个 db 对象。 > 返回一个 db 实例, 这个方法是必须要的, 所有的 sql 操作,都要先实例一个 db 对象。
@ -57,7 +57,7 @@ db
### query(sql) ### query(sql)
* sql <String> sql 语句, [必传] * sql `<String>` sql 语句, [必传]
> 直接执行 sql 语句, 用于在内置的 API 不满足需求的情况下, 可以自己手写 sql 执行。 > 直接执行 sql 语句, 用于在内置的 API 不满足需求的情况下, 可以自己手写 sql 执行。
@ -74,7 +74,7 @@ db.query('select * from `test`.`student` limit 10').then(result => {
### drop(db) ### drop(db)
* db <String> [可选] 要删除 db 名, 不传则删除当前连接的数据库 * db `<String>` [可选] 要删除 db 名, 不传则删除当前连接的数据库
> 删除当前或指定数据库。 > 删除当前或指定数据库。
@ -107,35 +107,35 @@ db.tableList().then(list => {
### dbCreate(name, options) ### dbCreate(name, options)
* name <String> [必传], 数据库名字 * name `<String>` [必传], 数据库名字
* options <Object>, [必传], 数据库的配置 * options `<Object>`, [必传], 数据库的配置
- charset <String> 默认 utf8 - charset `<String>` 默认 utf8mb4
> 创建新的数据库, 成功返回true。 > 创建新的数据库, 成功返回true。
```javascript ```javascript
db.dbCreate('foo', { charset: 'utf8mb4' }) // 默认是utf8 db.dbCreate('foo', { charset: 'utf8' }) // 默认是utf8mb4
``` ```
### tableCreate(name, columns ,options) ### tableCreate(name, columns ,options)
* name <String> [必传], 表名字 * name `<String>` [必传], 表名字
* columns <Array>, [必传], 表字段的配置 * columns `<Array>`, [必传], 表字段的配置
- name <String> 字段名, 区分大小写, 建议全小写+下划线 - name `<String>` 字段名, 区分大小写, 建议全小写+下划线
- type <String> 字段类型, 不区分大小写 - type `<String>` 字段类型, 不区分大小写
- primary <Boolean> 是否主键(有且只能有 1 个主键) - primary `<Boolean>` 是否主键(有且只能有 1 个主键)
- inc <Boolean> 是否自增(只允许主键设置,且为整型时才可设置) - inc `<Boolean>` 是否自增(只允许主键设置,且为整型时才可设置)
- notnull <Boolean> 是否允许非空 - notnull `<Boolean>` 是否允许非空
- index <Boolean> 是否设为索引 - index `<Boolean>` 是否设为索引
- unique <Boolean> 是否为 唯一索引 - unique `<Boolean>` 是否为 唯一索引
- default <Any> 设置默认值 - default `<Any>` 设置默认值
- update <Boolean> 是否自动更新(只有 datetime & timestamp 可以设) - update `<Boolean>` 是否自动更新(只有 datetime & timestamp 可以设)
* options <Object>, [必传], 表的配置 * options `<Object>`, [必传], 表的配置
- charset <String> 默认 utf8 - charset `<String>` 默认 utf8mb4
- engine <String> 默认 InnoDB - engine `<String>` 默认 InnoDB
> 创建新的数据表, 成功返回true。 > 创建新的数据表, 成功返回true。
@ -164,8 +164,7 @@ db.tableCreate('student',
index: true index: true
}, },
... ...
] ])
{charset: 'utf8mb4'}) // 默认是utf8
``` ```
@ -174,7 +173,7 @@ db.tableCreate('student',
### table(name) ### table(name)
* name <String> [必传], 数据表名字 * name `<String>` [必传], 数据表名字
> 选择指定表。 返回一个表操作的 API 实例 > 选择指定表。 返回一个表操作的 API 实例
@ -192,9 +191,9 @@ let table = db.table('student') //
### leftJoin(tables) ### leftJoin(tables)
* tables <Array> 左联, 可以联多个表 * tables `<Array>` 左联, 可以联多个表
- table <String> 表名 - table `<String>` 表名
- on <String> 左联的条件 - on `<String>` 左联的条件
```javascript ```javascript
@ -222,7 +221,7 @@ db.table('student')
### filter(options) ### filter(options)
* options <Object> * options `<Object>`
> 查询过滤, 这个方法是增删改查中使用率最高的。 也是 Mysqli 模块的核心方法之一。也是参数最复杂的方法, 一条查询里, 只能出现一次 filter, 多次调用, 会覆盖之前的条件. > 查询过滤, 这个方法是增删改查中使用率最高的。 也是 Mysqli 模块的核心方法之一。也是参数最复杂的方法, 一条查询里, 只能出现一次 filter, 多次调用, 会覆盖之前的条件.
> options 里有几个特殊的关键字 > options 里有几个特殊的关键字
@ -294,7 +293,7 @@ db
### sort(keys) ### sort(keys)
* keys <Object> * keys `<Object>`
> 对结果集排序 > 对结果集排序
@ -316,7 +315,7 @@ db
### skip(num) ### skip(num)
* num <Number> * num `<Number>`
> 跳过指定条数, 可用于分页。 > 跳过指定条数, 可用于分页。
@ -331,7 +330,7 @@ db.table('student').skip(10) // 跳过前9条, 即从第10条结果开始返回
### limit(num) ### limit(num)
* num <Number> * num `<Number>`
> 限制返回的结果总数, 做分页时, 配合 skip 方法使用。 > 限制返回的结果总数, 做分页时, 配合 skip 方法使用。
@ -347,8 +346,8 @@ db.table('student').limit(10) // 限制只返回10条记录
### slice(start, end) ### slice(start, end)
* start <Number> * start `<Number>`
* end <Number> * end `<Number>`
> 截取指定范围的结果集, 这是 skip & limit 结合体。 > 截取指定范围的结果集, 这是 skip & limit 结合体。
@ -369,7 +368,7 @@ db
### withFields(fields) ### withFields(fields)
* fields <Array> [可选], 不传则返回所有的字段 * fields `<Array>` [可选], 不传则返回所有的字段
> 指定要返回的字段 > 指定要返回的字段
@ -382,7 +381,7 @@ db.table('student').withFields(['id', 'name', 'sex']) // 只取 学号,姓名,
### getAll([ids]) ### getAll([ids])
* ids <Array> [可选],返回指定 id 的结果集; 不传则返回所有结果集。(仅当没有调用过 filter 的情况下,本参数才有效) * ids `<Array>` [可选],返回指定 id 的结果集; 不传则返回所有结果集。(仅当没有调用过 filter 的情况下,本参数才有效)
> 返回符合条件的所有记录, 这个方法是 查询必须要调用的方法之一, 上面 .filter, .sort 等方法, 只是组件条件, 并不会返回结果, 只有调用了 getAll/get 之后, 才会返回结果集。 > 返回符合条件的所有记录, 这个方法是 查询必须要调用的方法之一, 上面 .filter, .sort 等方法, 只是组件条件, 并不会返回结果, 只有调用了 getAll/get 之后, 才会返回结果集。
> `这里有一个地方要注意的, 传入的参数ids, 即意味着, 该数据表里, 必须有一个字段为"id", 否则会出错, 没有id的表, 查询时请使用 .filter过滤。` > `这里有一个地方要注意的, 传入的参数ids, 即意味着, 该数据表里, 必须有一个字段为"id", 否则会出错, 没有id的表, 查询时请使用 .filter过滤。`
@ -425,7 +424,7 @@ db
### get(id) ### get(id)
* id <Any> [可选], 传入单个 ID。 * id `<Any>` [可选], 传入单个 ID。
> 该方法是对 getAll 的补充, 它最终是调用 getAll 来实现, 目的在于返回 单个结果集(不是数组)。 > 该方法是对 getAll 的补充, 它最终是调用 getAll 来实现, 目的在于返回 单个结果集(不是数组)。
@ -473,7 +472,7 @@ db
### insert(doc) ### insert(doc)
* doc <Object> 要插入的记录 * doc `<Object>` 要插入的记录
> 用于插入单条记录。如果有自增ID的话, 将返回刚插入的记录的自增ID。 > 用于插入单条记录。如果有自增ID的话, 将返回刚插入的记录的自增ID。
@ -494,7 +493,7 @@ db
### update(doc) ### update(doc)
* doc <Object> 要插入的记录 * doc `<Object>` 要插入的记录
> 用于更新指定条件的记录, 返回成功修改的总数 > 用于更新指定条件的记录, 返回成功修改的总数
@ -579,7 +578,7 @@ db
### indexDrop(name) ### indexDrop(name)
* name <String> 索引名 * name `<String>` 索引名
> 删除当前表的指定索引. 成功返回true。 > 删除当前表的指定索引. 成功返回true。
@ -596,10 +595,10 @@ db
### indexDrop(name, options) ### indexDrop(name, options)
* name <String> 索引名 * name `<String>` 索引名
* options <Object> 索引的配置 * options `<Object>` 索引的配置
- field <String> 该索引绑定的字段 - field `<String>` 该索引绑定的字段
- unique <Bollean> 是否是唯一索引 - unique `<Bollean>` 是否是唯一索引
> 给当前表创建索引. 成功返回true。 > 给当前表创建索引. 成功返回true。

View File

@ -124,7 +124,7 @@ class Api {
} }
// 创建新的数据库 // 创建新的数据库
dbCreate(name, { charset = 'utf8' }) { dbCreate(name, { charset = 'utf8mb4' }) {
if (!name) { if (!name) {
return Promise.reject('Empty database name.') return Promise.reject('Empty database name.')
} }
@ -146,7 +146,7 @@ class Api {
} }
// 创建新的表, // 创建新的表,
tableCreate(name, fields, { charset = 'utf8', engine = 'InnoDB' }) { tableCreate(name, fields, { charset = 'utf8mb4', engine = 'InnoDB' }) {
if (!name) { if (!name) {
return Promise.reject('Empty database name.') return Promise.reject('Empty database name.')
} }

View File

@ -229,7 +229,7 @@ const parser = {
let defaultVal = '' let defaultVal = ''
// 只处理1个主键, 其他的忽略, 且作为主键,必须 NOT NULL // 只处理1个主键, 其他的忽略, 且作为主键,必须 NOT NULL
if (!primary && it.primary) { if (!primary && it.primary) {
primary = `PRIMARY KEY (\`${it.name}\`),\n` primary = `PRIMARY KEY (\`${it.name}\`)`
it.notnull = true it.notnull = true
if (it.inc) { if (it.inc) {
inc = 'AUTO_INCREMENT' inc = 'AUTO_INCREMENT'
@ -272,15 +272,17 @@ const parser = {
indexes.push(idx) indexes.push(idx)
} }
} }
sql += `\`${it.name}\` ${ sql += `\`${it.name}\` ${it.type} ${notnull} ${defaultVal} ${inc} ${autoUpdate},\n`
it.type
} ${notnull} ${defaultVal} ${inc} ${autoUpdate},\n`
} }
if (!primary) { if (!primary) {
throw new Error('Can not create table without primary key.') throw new Error('Can not create table without primary key.')
} }
sql += primary sql += primary
sql += indexes.join(', \n') + ')' if (indexes.length) {
sql += indexes.join(', \n') + ')'
} else {
sql += '\n)'
}
return sql return sql
} }
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "mysqli", "name": "mysqli",
"version": "3.0.6", "version": "3.0.7",
"description": "MySQL tool", "description": "MySQL tool",
"main": "index.js", "main": "index.js",
"dependencies": { "dependencies": {