Koa + Sequelize 操作 MySQL 数据库 - 联表查询

查看更多资源

1. 本地启动mysql,建表user、message:

Koa + Sequelize 操作 MySQL 数据库 - 联表查询_第1张图片  Koa + Sequelize 操作 MySQL 数据库 - 联表查询_第2张图片

2. 新建项目及安装:

npm init
npm install sequelize mysql2 --save

3. app.js 代码:

(async function () {
  const Sequelize = require('sequelize'); // 1、引入模块

  const sequelize = new Sequelize('miaov', 'root', '1234', { // 2、连接数据库
    host: '127.0.0.1',
    port: '3306',
    dialect: 'mysql',
    timezone: 'Asia/Shanghai', // 设置 时区
  });

  sequelize.authenticate().then(() => { // 3、 连接数据库是否成功
    console.log('link success');
  }).catch(err => {
    console.log('link err')
  })

  // 4、 创建数据表模型 user -> 定义数据结构 及 表信息
  const UserModel = sequelize.define('User', {
    id: {
      type: Sequelize.INTEGER(10), // 数据类型
      allowNull: false, // 是否为 null
      primaryKey: true, // 是否为 主键
      autoIncrement: true // 是否 自动填值
    },
    username: {
      type: Sequelize.STRING(255),
      allowNull: false,
      defaultValue: '' // 默认值
    },
    age: {
      type: Sequelize.TINYINT,
      allowNull: false,
      defaultValue: 0
    },
    gender: {
      type: Sequelize.ENUM(['男', '女']),
      allowNull: false,
      defaultValue: '男'
    }
  }, { // 定义 表信息
      timestamps: false, // 是否 自动添加数据的 创建、更新 时间戳
      paranoid: false, // 是否 硬删除数据
      freezeTableName: true, // 是否 冻结表名,false 访问 users表
      tableName: 'user', // 访问数据库 user 表
      indexes: [ // 设置 索引
        {
          name: 'uname',
          fields: ['username']
        },
        {
          name: 'age',
          fields: ['age']
        }
      ]

    });

  // 5、创建message数据表 -> 用户发送的消息 
  const MessageModel = sequelize.define('message', {
    id: {
      type: Sequelize.INTEGER(10),
      primaryKey: true,
      allowNull: false,
      autoIncrement: true
    },
    uid: {
      type: Sequelize.INTEGER(10),
      defaultValue: 0,
      references: { // 定义uid为外键,关联UserModel中的id
        model: UserModel,
        key: 'id'
      }
    },
    content: {
      type: Sequelize.STRING(255),
      allowNull: true,
      defaultValue: ''
    }

  }, {
      timestamps: false,
      freezeTableName: true,
      tableName: 'message'
    });

  MessageModel.belongsTo(UserModel, {
    foreignKey: 'uid'
  });

  /* 
  *  查询:某条信息及对应的用户信息
  *  方法一:
  */

  // let message = await MessageModel.findById(3);
  // let user = await UserModel.findById( message.get('uid') );

  // Object.assign( data, {
  //     id: message.get('id'), 
  //     uid: message.get('uid'), 
  //     username: user.get('username'),
  //     age: user.get('age'),
  //     gender: user.get('gender'),
  //     content: message.get('content'),
  // }  );

  // console.log(data);

  /* 
  *  查询:某条信息及对应的用户信息
  *  方法二: belongsTo
  */

  // MessageModel.belongsTo(UserModel, {
  //     foreignKey: 'uid'
  // });

  // let data2 = await MessageModel.findById(1, {
  //     include: [UserModel]
  // });

  // console.log(data2);

  // console.log(`
  //     留言id:${data2.get('id')}
  //     留言人名称:${data2.User.username}
  //     留言内容:${data2.get('content')}
  // `);

  /* 
  *  查询:某用户信息 发送的 所有信息
  *  方法: hasMany
  */

  UserModel.hasMany(MessageModel, {
    foreignKey: 'uid'
  });

  let data3 = await UserModel.findById(4, {
    include: [MessageModel]
  });

  console.log(data3);

})()

// 启动: node app

4. 文档:

1. 英文 文档
https://sequelize.org/

2. 中文 文档
https://github.com/demopark/sequelize-docs-Zh-CN

 

你可能感兴趣的:(node,进阶之旅)