使用orm(Sequelize) 操作 MySQL (2)

来源:互联网 发布:反相比例运算电路数据 编辑:程序博客网 时间:2024/04/30 02:37

前面有篇文章我讲了一些当数据库比较简单, 数据间不存在关联时的一些基本操作, 这次我们讲讲数据关系(association)的建立以及当数据存在关联时相应的操作

代码模板

'use strict';let co = require("co");let _ = require("underscore");let Sequelize = require("sequelize");let Database = new Sequelize(    'test',                  // 要连接的数据库    'username',              // 数据库用户名    'password',              // 密码    {        'dialect': 'mysql',  // 数据库使用mysql        'host': 'localhost', // 数据库服务器ip        'port': 3306,        // 数据库运行端口        'timestamp': true    // 这个参数为true是MySQL会自动给每条数据添加createdAt和updateAt字段    });/*数据表定义代码放这里*/co(function*() {    /*增删改查等操作放此处*/}).catch(function (error) {    console.log(error);});

Sequelize提供的三种关系

One to One association (1:1关系)

sequelize 提供了hasOne, belongsTo 两个API供我们使用, 我们先定义一下表:

//在同一个博客园,一个用户只有一个博客let User = Database.define("User", {    name: Sequelize.STRING,    code: Sequelize.NUMBER});let Blog = Database.define("Blog", {    name: Sequelize.STRING,    url: Sequelize.STRING});

hasOnebelongsTo 具体的用法

// belongsToBlog.belongsTo(User);                           // 会在blog数据中添加外键userIdBlog.belongsTo(User, {as: "writer"});           // 会在blog数据中添加外键writerIdBlog.belongsTo(User, {foreignKey: "writer"});   // 会在blog数据中添加外键writer// hasOneUser.hasOne(Blog);                              // 会在user数据中添加外键blogIdUser.hasOne(Blog, {as: "myBlog"});              // 会在blog数据中添加外键myBlogIdUser.hasOne(Blog, {foreignKey: "blog"});        // 会在blog数据中添加外键blog

hasOne和belongsTo的区别
上文中每句代码的作用都是一样的, 都是给BlogUser绑定一对一关系, 它们的区别在于, 使用 belongsTo 的时候会在Blog中添加外键userId , 使用hasOne 则是在User中添加外键 blogId.

as的用法
针对Blog.belongsTo(User, {as: "writer"});, 其实as就是在Blog表中将User表的表名变为writer, 之后sequelize根据驼峰命名法 命名外键: writer + id –> writerId, 如果没有设置as, 则是 User + id –> userId

One-To-Many (1:n关系)

针对这个关系, sequelize 提供了hasMany , 先添加一个文章数据表

let Article = Database.define("Article", {    title: Sequelize.STRING,    content: Sequelize.STRING});

hasMany 的具体用法:

// 使用asBlog.hasMany(Article, {as: "articles"});  // 会在article数据中添加外键blogIdArticle.belongsTo(Blog);// 使用foreignKeyBlog.hasMany(Article, {foreignKey: "blog"});  // 会在article数据中添加外键blogArticle.belongsTo(Blog, {foreignKey: "blog"});// 同时使用as和foreignKeyBlog.hasMany(Article, {foreignKey: "blog"});  // 会在article数据中添加外键blogArticle.belongsTo(Blog, {as: "articles", foreignKey: "blog"});  //查询blog时, 可以填充articles字段

Belongs-To-Many(n:m关系)

一篇文章可能出现在多个分类中, 一个分类中可能有多篇文章, 两者间的关系需要有一个关联, 先定义分类数据表以及两者关联的文章分类表:

let Category = Database.define({    name: Sequelize.STRING});let ArticleCategory = Database.define("ArticleCategory");

belongsToMany 的用法

Article.belongsToMany(Category, {through: "ArticleCategory"});Category.belongsToMany(Article, {through: "ArticleCategory"});/*ArticleCategory表包含两个字段: articleId, categoryId*/

Sequelize提供的拓展方法

belongsTo 和 hasOne的拓展方法

Blog.belongsTo(User);   //Sequelize会给Blog表数据扩展getUser, setUser, createUser方法Blog.belongsTo(User, {as: "writer"});   //Sequelize会给User表数据扩展getUser, setUser, createUser方法User.hasOne(Blog);     //Sequelize会给User表数据扩展getBlog, setBlog, createBlog方法

hasMany的拓展方法

Blog.hasMany(Article);//Sequelize会给Blog表数据扩展getArticles, setArticles, addArticle, addArticles, createArticle, removeArticle, removeArticles, hasArticle, hasArticles, countArticles方法

belongsToMany的扩展方法

和hasMany相同

后记

后面还有一些具体的操作要写, 但是由于boss新给了个比较急的任务, 检查公司业务代码中存在的内存泄漏问题, 所以后续的一些等新的任务完成之后再更新.

0 0
原创粉丝点击