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)) }) 不能用,求解


2 回复

Node.js 开发环境中基于 Sequelize 对 MySQL 基本操作,主外键是怎么用的?

在使用 Node.js 和 Sequelize 进行数据库操作时,主外键关系是一种常见的数据关联方式。以下是一个详细的示例,展示了如何定义模型之间的主外键关系,并进行查询。

定义模型

首先,我们需要定义两个模型 TrainerSeries,并设置它们之间的关联。

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));
});

上述代码首先创建了两个模型TrainerSeries,然后定义了一个Trainer可以拥有多个Series的关系。最后,我们通过findAll方法结合include选项来查询所有的Trainer以及他们的相关Series记录。

以上就是使用Sequelize处理一对多关系的基本方法,确保你定义的外键名称正确,并且在相关的模型之间建立正确的关联。

回到顶部