参考链接

安装

1
npm install --save sequelize

同时必须安装你选择的数据库驱动

1
2
3
4
5
6
# One of the following:
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

设置连接

你必须创建一个 Sequelize 实例去连接数据库。这可以通过将连接参数单独传给 Sequelize 构造函数,或通过直接传递一个 URI。

1
2
3
4
5
6
7
8
9
10
const Sequelize = require('sequelize');

// Option 1: Passing parameters separately
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: /* one of 'mysql' | 'mariadb' | 'postgres' | 'mssql' */
});

// Option 2: Using a connection URI
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');

Note: 设置 SQLite

如果使用 SQLite,则应该使用以下代码

1
2
3
4
const sequelize = new Sequelize({
dialect: 'sqlite',
storage: 'path/to/database.sqlite'
});

Note: 连接池

如果从单个进程连接到数据库,你应该只创建一个 Sequelize 实例。Sequelize 将在初始化时设置连接池。你可以通过构造选项(options.pool) 配置连接池。例如

1
2
3
4
5
6
7
8
9
const sequelize = new Sequelize(/* ... */, {
// ...
pool: {
max: 5, // 最大连接数
min: 0, // 最小连接数
acquire: 30000, // 连接超时时间,默认 60000,ms
idle: 10000 // 最大闲置时间,默认 10000,ms
}
});

更多信息参考 API Reference for the Sequelize constructor。如果你要从多个进程连接到数据库,则必须为每个进程创建一个示例,但是每个实例都应设定一个最大连接池大小,这样才能保证总的最大连接数大小。例如,如果你希望最大连接池大小为 90,同时拥有 3 个进程,那么每个进程的 Sequelize 示例的最大连接池大小应该是 30。

测试连接

你可以使用 .authenticate() 方法测试连接是否正常

1
2
3
4
5
6
7
8
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});

关闭连接

Sequelize 将在默认情况下保持连接打开,并对所有查询使用相同连接。如果需要关闭连接,调用 sequelize.close(),这是一个异步方法,会返回一个 Promise。

建立模型

使用 sequelize.define('name', attributes, options) 去定义模型:

1
2
3
4
5
6
7
8
9
10
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING,
allowNull: false
},
lastName: {
type: Sequelize.STRING
// allowNull defaults to true
}
});

上面的代码告诉 Sequelize 数据库中有一张 users 的表,其中包含字段 firstNamelastName。默认情况下,表名会自动多元化(底层采用 inflection 库实现。如果要停止这种行为,对于特定的模型,可以使用 freezeTableName: true 选项去停止这种行为;对于所有模型,可以将选项用于 Sequelize 构造函数中的 define

Sequelize 还默认为每个模型定义字段 id(主键)、createdAtupdatedAt。当然,此行为也可以更改。

修改默认模型选项

Sequelize 构造函数接受一个 define 选项,此选项将更改所有已定义模型的默认选项。

1
2
3
4
5
6
7
8
9
10
11
12
13
const sequelize = new Sequelize(connectionURI, {
define: {
// The `timestamps` field specify whether or not the `createdAt` and `updatedAt` fields will be created.
// This was true by default, but now is false by default
timestamps: false
}
});

// Here `timestamps` will be false, so the `createdAt` and `updatedAt` fields will not be created.
const Foo = sequelize.define('foo', { /* ... */ });

// Here `timestamps` is directly set to true, so the `createdAt` and `updatedAt` fields will be created.
const Bar = sequelize.define('bar', { /* ... */ }, { timestamps: true });

你可以在 define API ReferenceModel API reference 中了解关于创建模型的更多信息。

同步数据库模型

如果你想要 Sequelize 根据你的模型定义自动创建(修改)记录,可以使用 sync 方法,如下所示:

1
2
3
4
5
6
7
8
// Note: using `force: true` will drop the table if it already exists
User.sync({ force: true }).then(() => {
// Now the `users` table in the database corresponds to the model definition
return User.create({
firstName: 'John',
lastName: 'Hancock'
});
});

一次同步所有模型

你可以使用 sequelize.sync() 取代每个模型的 sync() 调用,去自动同步所有模型

生产环境

在生产环境中,你可能考虑使用 Migrations 而非 sync()。参考 Migrations 指南

查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Find all users
User.findAll().then(users => {
console.log("All users:", JSON.stringify(users, null, 4));
});

// Create a new user
User.create({ firstName: "Jane", lastName: "Doe" }).then(jane => {
console.log("Jane's auto-generated ID:", jane.id);
});

// Delete everyone named "Jane"
User.destroy({
where: {
firstName: "Jane"
}
}).then(() => {
console.log("Done");
});

// Change everyone without a last name to "Doe"
User.update({ lastName: "Doe" }, {
where: {
lastName: null
}
}).then(() => {
console.log("Done");
});

Sequelize 有很多查询选项。如果确实需要,也可以进行原始的 SQL 查询。