Nodejs开发环境中基于sequelize对mysql基本操作,主外建是怎么用的呢?
Nodejs开发环境中基于sequelize对mysql基本操作,主外建是怎么用的呢?
var Series, Trainer, Video
// Series has a trainer_id=Trainer.id foreign reference key after we call Trainer.hasMany(series) Series = sequelize.define(‘Series’, { title: DataTypes.STRING, sub_title: DataTypes.STRING, description: DataTypes.TEXT,
// Set FK relationship (hasMany) with Trainer
trainer_id: {
type: DataTypes.INTEGER,
references: “Trainer”,
referencesKey: “id”
}
})
Trainer = sequelize.define(‘Trainer’, { first_name: DataTypes.STRING, last_name: DataTypes.STRING });
Trainer.hasMany(Series);
//用法 Trainer.findAll({ include: [ Series] }).success(function(res) { console.log(JSON.stringify(res)) }) 不能用,求解
Node.js 开发环境中基于 Sequelize 对 MySQL 基本操作,主外键是怎么用的?
在使用 Node.js 和 Sequelize 进行数据库操作时,主外键关系是一种常见的数据关联方式。以下是一个详细的示例,展示了如何定义模型之间的主外键关系,并进行查询。
定义模型
首先,我们需要定义两个模型 Trainer
和 Series
,并设置它们之间的关联。
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'
});
// 定义 Trainer 模型
const Trainer = sequelize.define('Trainer', {
first_name: {
type: DataTypes.STRING,
allowNull: false
},
last_name: {
type: DataTypes.STRING,
allowNull: false
}
}, {
timestamps: false // 禁用自动创建时间戳字段
});
// 定义 Series 模型,并设置与 Trainer 的关联
const Series = sequelize.define('Series', {
title: {
type: DataTypes.STRING,
allowNull: false
},
sub_title: DataTypes.STRING,
description: DataTypes.TEXT
}, {
timestamps: false // 禁用自动创建时间戳字段
});
// 设置外键关系
Trainer.hasMany(Series, { foreignKey: 'trainer_id' });
创建关联
通过调用 has-many
方法,我们将 Trainer
模型与 Series
模型关联起来。这里我们指定了外键为 trainer_id
。
Trainer.hasMany(Series, { foreignKey: 'trainer_id' });
查询数据
接下来,我们可以使用 include
选项来查询关联的数据。例如,我们可以查询所有训练师及其相关的系列:
Trainer.findAll({
include: [Series]
}).then(res => {
console.log(JSON.stringify(res, null, 2));
});
示例输出
假设我们有以下数据:
-
训练师表 (
Trainer
):- id: 1, first_name: “John”, last_name: “Doe”
- id: 2, first_name: “Jane”, last_name: “Smith”
-
系列表 (
Series
):- id: 1, title: “Series A”, trainer_id: 1
- id: 2, title: “Series B”, trainer_id: 1
- id: 3, title: “Series C”, trainer_id: 2
查询结果将类似于:
[
{
"id": 1,
"first_name": "John",
"last_name": "Doe",
"Series": [
{
"id": 1,
"title": "Series A",
"sub_title": null,
"description": null,
"trainer_id": 1
},
{
"id": 2,
"title": "Series B",
"sub_title": null,
"description": null,
"trainer_id": 1
}
]
},
{
"id": 2,
"first_name": "Jane",
"last_name": "Smith",
"Series": [
{
"id": 3,
"title": "Series C",
"sub_title": null,
"description": null,
"trainer_id": 2
}
]
}
]
这样,我们就成功地定义了主外键关系,并能够通过 Sequelize 查询包含关联数据的结果。
在Node.js环境下使用Sequelize进行MySQL数据库的基本操作时,定义模型之间的关联(如主键和外键)是常见的需求。你提到的例子中存在一些小问题,我将提供正确的示例,并解释如何正确设置和使用主键与外键的关系。
示例代码
首先,我们需要正确地定义两个模型及其关系:
const { Sequelize, DataTypes } = require('sequelize');
const sequelize = new Sequelize('database', 'username', 'password', {
host: 'localhost',
dialect: 'mysql'
});
// 定义Trainer模型
const Trainer = sequelize.define('Trainer', {
first_name: {
type: DataTypes.STRING,
allowNull: false
},
last_name: {
type: DataTypes.STRING,
allowNull: false
}
}, {
timestamps: false // 禁止自动添加时间戳字段
});
// 定义Series模型
const Series = sequelize.define('Series', {
title: {
type: DataTypes.STRING,
allowNull: false
},
sub_title: DataTypes.STRING,
description: DataTypes.TEXT
}, {
timestamps: false // 禁止自动添加时间戳字段
});
// 建立一对多关系(Trainer to Series)
Trainer.hasMany(Series, { foreignKey: 'trainer_id' });
Series.belongsTo(Trainer, { foreignKey: 'trainer_id' });
// 同步模型到数据库
sequelize.sync().then(() => {
console.log('Database and tables created!');
});
使用方式
你可以通过include
选项来获取相关的记录:
Trainer.findAll({
include: [Series]
}).then(result => {
console.log(JSON.stringify(result, null, 2));
});
上述代码首先创建了两个模型Trainer
和Series
,然后定义了一个Trainer
可以拥有多个Series
的关系。最后,我们通过findAll
方法结合include
选项来查询所有的Trainer
以及他们的相关Series
记录。
以上就是使用Sequelize处理一对多关系的基本方法,确保你定义的外键名称正确,并且在相关的模型之间建立正确的关联。