MySQL 快速上手

环境准备

本文假设你本地已经部署好 MySQL 服务,且采用默认端口 3306。 如果你还没准备好 MySQL 服务,可以参考 MySQL 官网文档下载并部署 MySQL

开发环境更推荐采用 Docker 容器化部署,以降低维护成本。 Docker 快速使用指引请看考这篇文章:前端工程师眼中的 Docker

mysql 模块

require 引入 mysql 模块:

1
const mysql = require('mysql')

连接数据库

首先,使用 createConnection 方法创建连接,并得到对象 connection

1
2
3
4
5
6
const connection = mysql.createConnection({
    host: '127.0.0.1',
    port: '3306',
    user: 'root',
    password: 'to0r'
})

connect 方法用于连接数据库,传入 callback 参数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
connection.connect((err) => {
    if (err) {
        console.log(err)
        return
    }

    console.log('connected!')

    connection.query('create database testDB', (err) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('create database testDB successfully!')
    })

    connection.query('use testDB', (err, result, field) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('use testDB successfully!')
    })

回调函数中,我们做了这样一些操作:创建名为 testDB 的数据库,并将其指定为当前使用的数据库。 query 方法可接收 SQL 语句,接下来的一系列操作,我们还会继续用到它。

建表

query 方法接收 SQL 语句和回调函数 callback,使用起来对于熟悉 SQL 语句的开发者甚为方便:

1
2
3
4
5
6
7
8
    connection.query('create table user (name VARCHAR(40) NOT NULL, age INT NOT NULL)', (err, result) => {
        if (err) {
            console.log(err)
            return
        }

        console.log('create table successfully!')
    })

至此,我们新建了一张 user 表,分别有 nameage 字段。 其中,name 字段为 varchar 类型,ageint 类型。

接下来,便可操作数据库,进行数据的插入、查询、更新、删除。 由于数据库的操作,均需建立在成功连接的基础上,因此,我们需要在 connect 方法的回调函数中执行这些操作。

代码框架如下:

connection.connect((err) => {
    // 建表
    // 插入
    // 查询
    // 更新
    // 删除
    // 断开连接
})

插入

往 user 表中插入一条数据:

1
2
3
4
5
6
7
    connection.query('insert into user set ?', {name: 'Alin', age: 21}, (err, results) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('insert data successfully! insertId is ' + results.insertId)
    })

query 方法接收三个参数: 第一个参数是 SQL 语句;第二个参数是一个 Object,表示待插入的数据;最后一个参数是回调函数,返回执行后的结果。 注意到,SQL 语句中有 ? 符号,指代的便是待插入的数据。

查询

查询 user 表中的所有数据:

1
2
3
4
5
6
7
8
    connection.query('select * from user', (err, results) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('select user all data:')
        console.log(results)
    })

更新

Alinage 字段值更改为 22

1
2
3
4
5
6
7
8
    connection.query('update user set age = ? where name = ?', [22, 'Alin'], (err, results) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('update Alin age successfully!')
        console.log(results)
    })

注意到,query 方法接收的第二个参数,是一个数组,按顺序分别对应 SQL 语句中的 ? 符号。

删除

删除有关 Alin 的数据:

1
2
3
4
5
6
7
    connection.query('delete from user where name = ?', ['Alin'], (err, results) => {
        if (err) {
            console.log(err)
            return
        }
        console.log('delete Alin successfully!');
    })

断开连接

end 方法表示断开数据库连接:

1
2
3
4
5
6
7
8
9
    connection.end((err) => {
        if (err) {
            console.log('end connect error')
            return
        }

        console.log('close mysql connection')
    })
})

运行 Demo

最后我们在终端执行以下命令,运行 demo:

$ node demo.js

输出以下结果:

connected!
create database testDB successfully!
use testDB successfully!
create table successfully!
insert data successfully! insertId is 0
select user all data:
[ RowDataPacket { name: 'Alin', age: 21 } ]
update Alin age successfully!
OkPacket {
fieldCount: 0,
affectedRows: 1,
insertId: 0,
serverStatus: 34,
warningCount: 0,
message: '(Rows matched: 1  Changed: 1  Warnings: 0',
protocol41: true,
changedRows: 1
}
delete Alin successfully!
close mysql connection

下一步

订阅更新,获取更多学习资料,请关注我们的 微信公众号

../../_images/wechat-mp-qrcode.png

小菜学编程