Skip to content

Commit

Permalink
docs: improve mysql doc
Browse files Browse the repository at this point in the history
  • Loading branch information
mansonchor committed Jan 12, 2017
1 parent aa53511 commit 570e295
Showing 1 changed file with 54 additions and 22 deletions.
76 changes: 54 additions & 22 deletions docs/source/zh-cn/practice/mysql.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ title: MySQL

我们提供了 [egg-mysql](https://github.com/eggjs/egg-mysql) 插件来访问 MySQL 数据库。这个插件既可以访问普通的 MySQL 数据库,也可以访问基于 MySQL 协议的在线数据库服务。

## 安装与配置
### 安装与配置

在 package.json 里面依赖 egg-mysql模块,并通过 `config/plugin.js` 配置启动 MySQL 插件:

Expand All @@ -28,11 +28,11 @@ exports.mysql = {
};
```

`config/config.${env}.js` 配置各个环境的数据库连接信息
`config/config.${env}.js` 配置各个环境的数据库连接信息

#### 单数据源

如果你的应用只需要访问一个 MySQL 数据库实例,可以如下配置:
如果我们的应用只需要访问一个 MySQL 数据库实例,可以如下配置:

```js
exports.mysql = {
Expand Down Expand Up @@ -64,7 +64,7 @@ app.mysql.query(sql, values); // 单实例可以直接通过 app.mysql 访问

#### 多数据源

如果你的应用需要访问多个 MySQL 数据源,可以按照如下配置:
如果我们的应用需要访问多个 MySQL 数据源,可以按照如下配置:

```js
exports.mysql = {
Expand Down Expand Up @@ -124,19 +124,12 @@ client2.query(sql, values);

下面是一个 service 中访问 MySQL数据库的例子。

更多 service 层的介绍,可以参考 egg 文档中的 service 一节。
更多 service 层的介绍,可以参考 [service](../basics/service.md)

```js
// app/service/user.js
module.exports = app => {
class User extends app.Service {
// 默认不需要提供构造函数。
// constructor(ctx) {
// super(ctx); 如果需要在构造函数做一些处理,一定要有这句话,才能保证后面 `this.ctx`的使用。
// // 就可以直接通过 this.ctx 获取 ctx 了
// // 还可以直接通过 this.app 获取 app 了
// }

* find(uid) {
// 假如 我们拿到用户 id 从数据库获取用户详细信息
const user = yield this.app.mysql.get('users', {
Expand Down Expand Up @@ -173,25 +166,63 @@ exports.info = function* () {
```js
// 插入
const result = yield this.app.mysql.insert('posts', { title: 'Hello World' }); // 在 post 表中,插入 title 为 Hello World 的记录

=> INSERT INTO `posts` (title) VALUES ('Hello World');

console.log(result);
=>
{
fieldCount: 0,
affectedRows: 1,
insertId: 3710,
serverStatus: 2,
warningCount: 2,
message: '',
protocol41: true,
changedRows: 0
}

// 判断插入成功
const insertSuccess = result.affectedRows === 1;
```

### Read

可以直接使用 `get` 方法或 `select` 方法获取一条或多条记录。`select` 方法支持条件查询与结果的定制

- 查询一条记录

```js
const post = yield this.app.mysql.get('posts', { id: 12 });

=> SELECT * FROM `posts` WHERE `id` = 12 LIMIT 0, 1;
```

- 查询全表

```js
const results = yield this.app.mysql.select('posts');

=> SELECT * FROM `posts`;
```

- 条件查询和结果定制

```js
// 获得一个
const post = yield this.app.mysql.get('posts', { id: 12 }); // 在 post 表中,搜索 id 为 12 的记录
// 查询
const results = yield this.app.mysql.select('posts',{ // 搜索 post 表
where: { status: 'draft' }, // 条件 : status 为 draft
where: { status: 'draft', author: ['author1', 'author2'] }, // WHERE 条件
columns: ['author', 'title'], // 要查询的表字段
orders: [['created_at','desc'], ['id','desc']], // 排序方式
limit: 10, // 返回数据量
offset: 0 // 数据偏移量
});

=> SELECT `author`, `title` FROM `posts`
WHERE `status` = 'draft' AND `author` IN('author1','author2')
ORDER BY `created_at` DESC, `id` DESC LIMIT 0, 10;
```


### Update

可以直接使用 `update` 方法更新数据库记录。
Expand All @@ -213,18 +244,20 @@ const updateSuccess = result.affectedRows === 1;
可以直接使用 `delete` 方法删除数据库记录。

```js
const result = yield this.app.mysql.delete('table-name', {
name: 'fengmk2' // 在 table-name 表中删除苏千
const result = yield this.app.mysql.delete('posts', {
author: 'fengmk2'
});

=> DELETE FROM `posts` WHERE `author` = 'fengmk2'
```

## 直接执行 sql 语句

插件本身也支持拼接与直接执行 sql 语句。使用 `query` 可以执行合法的 sql 语句。

**注意!!我们及其不建议开发者拼接 sql 语句,这样很容易引起 sql 注入!!**
**注意!!我们极其不建议开发者拼接 sql 语句,这样很容易引起 sql 注入!!**

如果必须要自己拼接 sql 语句,请使用 mysql.escape 方法。
如果必须要自己拼接 sql 语句,请使用 `mysql.escape` 方法。

参考 [preventing-sql-injection-in-node-js](http://stackoverflow.com/questions/15778572/preventing-sql-injection-in-node-js)

Expand Down Expand Up @@ -322,5 +355,4 @@ yield this.app.mysql.insert(table, {
});

// INSERT INTO `$table`(`id`, `fullname`) VALUES(123, CONCAT("James", "Bond"))
```

```

0 comments on commit 570e295

Please sign in to comment.