Sequelize
是一个基于 Promise 的 Node.js ORM,目前支持 Postgres、 MySQL 、SQLite 和 Microsoft SQL Server。它具有强大的事务支持,关联关系、读取和复制等功能。在阅读本文前,如果你对 Sequelize 还不了解,建议先阅读Sequelize 快速入门 这篇文章。
数据模型中的表关系一般有三种:一对一、一对多、多对多。 Sequelize
为开发者提供了清晰易用的接口来定义关系、进行表之间的操作。本文我们将介绍在 Sequelize
中如何定义一对多的表关系。
基本概念
Source & Target
我们首先从一个基本概念开始,你将会在大多数关联中使用 source
和 target
模型。 假设您正试图在两个模型之间添加关联。 这里我们在 User
和 Project
之间添加一个 hasOne
关联。
const User = sequelize.define('User', {
name: Sequelize.STRING,
email: Sequelize.STRING
});
const Project = sequelize.define('Project', {
name: Sequelize.STRING
});
User.hasOne(Project);
User
模型(函数被调用的模型)是 source
。 Project
模型(作为参数传递的模型)是 target
。
HasMany
一对多关联将一个来源与多个目标连接起来。 而多个目标接到同一个特定的源。
const User = sequelize.define('user', {/* ... */})
const Project = sequelize.define('project', {/* ... */})
// 首先我们来定义一个 hasMany 关联
Project.hasMany(User, {as: 'Workers'})
这会将 projectId
属性添加到 User。 根据当前的设置,表中的列将被称为 projectId
或 project_id
。 Project 的实例将获得访问器 getWorkers
和 setWorkers
。
有时你可能需要在不同的列上关联记录,这时候你可以使用 sourceKey
选项:
const City = sequelize.define('city', { countryCode: Sequelize.STRING });
const Country = sequelize.define('country', { isoCode: Sequelize.STRING });
// 在这里,我们可以根据国家代码连接国家和城市
Country.hasMany(City, {foreignKey: 'countryCode', sourceKey: 'isoCode'});
City.belongsTo(Country, {foreignKey: 'countryCode', targetKey: 'isoCode'});
一对多关系
模型定义
model/user.js
const Sequelize = require("sequelize");
module.exports = sequelize => {
const User = sequelize.define("user", {
empId: {
type: Sequelize.STRING,
allowNull: false,
unique: true
}
});
return User;
};
model/note.js
const Sequelize = require("sequelize");
module.exports = sequelize => {
const Note = sequelize.define("note", {
title: {
type: Sequelize.CHAR(64),
allowNull: false
}
});
return Note;
};
数据库连接及关系定义
db.js
const Sequelize = require('sequelize');
const sequelize = new Sequelize(
'exe', // 数据库名称
'root', // 用户名
'', // 密码
{
host: 'localhost',
dialect: 'mysql',
operatorsAliases: false,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
}
});
sequelize
.