koa使用Sequelize:定义数据结构

这篇具有很好参考价值的文章主要介绍了koa使用Sequelize:定义数据结构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

创建连接
const { Sequelize } = require('sequelize');

// 第一个参数:连接的数据库名
// 第二个参数:数据库的用户名
// 第三个参数:数据库的密码
const mysql = new Sequelize('mytest', 'root', 'root', {
    dialect: 'mysql',       // 这里可以改成任意一种关系型数据库
    host: 'localhost',      // 数据库服务器
    timezone: '+08:00',     // 这里是东八区,默认为0时区
    pool: {                 // 使用连接池
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000,
    },
});
测试连接
// 测试连接是否成功
(async () => {
    try {
        await mysql.authenticate();
        console.log('Connection has been established successfully.');
    } catch (error) {
        console.error('Unable to connect to the database:', error);
    }
})();   // 多一个括号表示调用方法
完整db定义类
const AppConfig = {
  environment: "dev",
  database: {
    database: "notes_app", // 库名
    username: "notes_app", // 用户名
    password: "notes_app", // 密码
    options: {
      // 配置
      host: "localhost",
      dialect: "mysql",
      define: {
        // create_time && update_time
        timestamps: true,
        // delete_time
        paranoid: true,
        createdAt: "created_at",
        updatedAt: "updated_at",
        deletedAt: "deleted_at",
        // 把驼峰命名转换为下划线
        underscored: true,
        scopes: {
          bh: {
            attributes: {
              exclude: ["updated_at", "deleted_at", "created_at"]
            }
          },
          iv: {
            attributes: {
              exclude: ["updated_at", "deleted_at"]
            }
          }
        }
      },
      pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
      },
      timezone: "+08:00" // 东八时区
    }
  },
  security: {
    secretKey: "secretKey",
    // 过期时间 1小时
    expiresIn: 60 * 60
  }
};

module.exports = AppConfig;
const { Sequelize } = require("sequelize");

const AppConfig = require("../config/config");

class DbManager {
  constructor() {
    this.config = AppConfig.database;
    this.sequelize = null;
    this.isConnected = false;
  }

  async isConnection() {
    const { database, username, password, options } = this.config;
    this.sequelize = new Sequelize(database, username, password, options);

    try {
      await this.sequelize.authenticate();
      // console.log("successfully");
      this.isInitOk = true;
      return true;
    } catch (error) {
      console.error("Unable to connect to the database:", error);
      return false;
    }
  }

  start() {
    const isConnected = this.isConnection();
    this.isConnected = isConnected;
    if (isConnected) {
      // console.log("连接ok");
      return true;
    }
  }

  stop() {
    if (this.sequelize !== null) {
      this.sequelize.close();
      console.log("连接close");
    }
  }

  getSequelize() {
    return this.sequelize;
  }

  getIsConnected() {
    return this.isConnected;
  }
}

const dbManager = new DbManager();
dbManager.start();

const sequelize = dbManager.getSequelize();
// console.log(sequelize);
sequelize.sync({ force: false }); // 初始化模型

module.exports = {
  dbManager,
  sequelize
};
常用DataTypes定义
Sequelize.STRING                      // VARCHAR(255)
Sequelize.STRING(1234)                // VARCHAR(1234)
Sequelize.STRING.BINARY               // VARCHAR BINARY
Sequelize.TEXT                        // TEXT
Sequelize.TEXT('tiny')                // TINYTEXT

Sequelize.INTEGER                     // INTEGER
Sequelize.BIGINT                      // BIGINT
Sequelize.BIGINT(11)                  // BIGINT(11)

Sequelize.FLOAT                       // FLOAT
Sequelize.FLOAT(11)                   // FLOAT(11)
Sequelize.FLOAT(11, 12)               // FLOAT(11,12)

Sequelize.REAL                        // REAL         仅限于PostgreSQL.
Sequelize.REAL(11)                    // REAL(11)     仅限于PostgreSQL.
Sequelize.REAL(11, 12)                // REAL(11,12)  仅限于PostgreSQL.

Sequelize.DOUBLE                      // DOUBLE
Sequelize.DOUBLE(11)                  // DOUBLE(11)
Sequelize.DOUBLE(11, 12)              // DOUBLE(11,12)

Sequelize.DECIMAL                     // DECIMAL
Sequelize.DECIMAL(10, 2)              // DECIMAL(10,2)

Sequelize.DATE                        // DATETIME 针对 mysql / sqlite, TIMESTAMP WITH TIME ZONE 针对 postgres
Sequelize.DATE(6)                     // DATETIME(6) 针对 mysql 5.6.4+. 小数秒支持多达6位精度
Sequelize.DATEONLY                    // DATE 不带时间.
Sequelize.BOOLEAN                     // TINYINT(1)

Sequelize.ENUM('value 1', 'value 2')  // 一个允许具有 “value 1” 和 “value 2” 的 ENUM
Sequelize.ARRAY(Sequelize.TEXT)       // 定义一个数组。 仅限于 PostgreSQL。
Sequelize.ARRAY(Sequelize.ENUM)       // 定义一个 ENUM 数组. 仅限于 PostgreSQL。
添加model
const { Model, DataTypes } = require("sequelize");
const { sequelize } = require("../util/db");

class Cate extends Model {}

Cate.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 主键
      autoIncrement: true // 自增
    },
    uid: {
      type: DataTypes.UUID,
      defaultValue: DataTypes.UUIDV4,
      unique: true // 唯一
    },
    name: DataTypes.STRING,
    icon: DataTypes.STRING,
    desc: DataTypes.TEXT,
    parentUid: DataTypes.UUID
  },
  {
    sequelize,
    tableName: "cate" // 指定生成的表名
  }
);

module.exports = {
  Cate
};
为model添加初始
Cate.sync({ force: false })
  .then(async () => {
    await Cate.create({
      name: "所有笔记",
      icon: "<IconFolder />",
      desc: "所有笔记",
      parentUid: ""
    });

    await Cate.create({
      name: "标签",
      icon: "<IconTags />",
      desc: "标签",
      parentUid: ""
    });

    await Cate.create({
      name: "回收站",
      icon: "<IconDelete />",
      desc: "回收站",
      parentUid: ""
    });
  })
  .catch(err => {
    console.log("err= ", err);
  }); // 初始化模型
模型关联
一对一
文章
class Article extends Model {}

Article.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 主键
      autoIncrement: true // 自增
    },
    uid: {
      type: DataTypes.UUID,
      primaryKey: true, // 主键
      defaultValue: DataTypes.UUIDV4
    },
    title: DataTypes.STRING,
    deleteUid: DataTypes.UUID,
    collectUid: DataTypes.UUID,
    publishStatus: {
      type: DataTypes.INTEGER,
      // (0草稿、1公开、2私有)
      defaultValue: 0
    }
  },
  {
    sequelize,
    tableName: "article" // 指定生成的表名
  }
);
文章内容
class ArticleContent extends Model {}

ArticleContent.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 主键
      autoIncrement: true // 自增
    },
    uid: {
      type: DataTypes.UUID,
      primaryKey: true, // 主键
      defaultValue: DataTypes.UUIDV4
    },
    content: DataTypes.TEXT
  },
  {
    sequelize,
    timestamps: false,
    tableName: "article_content" // 指定生成的表名
  }
);
关联关系定义
// 关联意味着 A 和 B 之间存在一对一的关系,外键在目标模型(B)中定义.
ArticleContent.hasOne(Article, {
  foreignKey: "article_content_uid",
  sourceKey: "uid"
});

// A.belongsTo(B)关联意味着 A 和 B 之间存在一对一的关系,外键在源模型中定义(A).
Article.belongsTo(ArticleContent, {
  foreignKey: "article_content_uid",
  sourceKey: "uid"
});
多对多
分类
class Cate extends Model {}
Cate.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 主键
      autoIncrement: true // 自增
    },
    uid: {
      type: DataTypes.UUID,
      primaryKey: true, // 主键
      defaultValue: DataTypes.UUIDV4
    },
    name: DataTypes.STRING,
    icon: DataTypes.STRING,
    desc: DataTypes.TEXT,
    parentUid: DataTypes.UUID
  },
  {
    sequelize,
    tableName: "cate" // 指定生成的表名
  }
);
文章分类关联表定义
class ArticleCates extends Model {}

ArticleCates.init(
  {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true, // 主键
      allowNull: false,
      autoIncrement: true // 自增
    },
    uid: {
      type: DataTypes.UUID,
      primaryKey: true, // 主键
      defaultValue: DataTypes.UUIDV4
    }
  },
  {
    sequelize,
    timestamps: false,
    tableName: "articale_cates" // 指定生成的表名
  }
);
关联关系定义(采用两个一对多的方式)
Article.hasMany(ArticleCates, {
  foreignKey: "article_uid",
  sourceKey: "uid"
});

Cate.hasMany(ArticleCates, {
  foreignKey: "cate_uid",
  sourceKey: "uid"
});

ArticleCates.belongsTo(Article, { foreignKey: "article_uid" });
ArticleCates.belongsTo(Cate, { foreignKey: "cate_uid" });
生成的关联表

koa使用Sequelize:定义数据结构,前端,数据结构,node.js

如果采用多对多方式关联,始终都关联不上uid,可以用id关联。文章来源地址https://www.toymoban.com/news/detail-698469.html

Article.belongsToMany(Cate, {
  through: ArticleCates,
  foreignKey: "article_uid", // ArticleCates 表中表示文章 uid 的字段名
  sourceKey: "uid",
  otherKey: "cate_uid" // ArticleCates 表中表示分类 uid 的字段名
});
Cate.belongsToMany(Article, {
  through: ArticleCates,
  foreignKey: "cate_uid", // ArticleCates 表中表示分类 uid 的字段名
  sourceKey: "uid",
  otherKey: "article_uid" // ArticleCates 表中表示文章 uid 的字段名
});

到了这里,关于koa使用Sequelize:定义数据结构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3 - 如何将 reactive() 创建的响应式数据 “轻松“ 恢复成初始数据值,重置 reactive() 定义的数据使其恢复成初始定义的数据结构(使用一个函数轻松解决,并且不丢失响应式)

    典型的场景就是我有一个表单,用户输入了一些内容后,点击提交后程序需要 “重置表单” 把上次填过的内容重置掉。 本文实现了 一个函数重置 reactive 创建的数据,恢复 “最开始时的数据结构和默认值,” 你可以直接复制本文提供的函数,有三种方案可选。 直接调用函

    2024年02月11日
    浏览(41)
  • 结构体和数据结构--从基本数据类型到抽象数据类型、结构体的定义

            在冯-诺依曼体系结构中,程序代码和数据都是以二进制存储的,因此对计算机系统和硬件本身而言,数据类型的概念其实是不存在的。         在高级语言中,为了有效的组织数据,规范数据的使用,提高程序的可读性,方便用户使用,引入了整型、实型等基本数

    2024年02月11日
    浏览(38)
  • python 定义数据结构

    class LogEvent:     bus_seq = None     line_number = None     event_received_time = None     app_name = None     source_module_name = None     source = None     filename = None     message = None     serial_id = None     thread_id = None log_event=LogEvent() print(dir(log_event)) log_event.bus_seq=\\\'1111\\\' print(log_event.bus_seq) [root@mas

    2024年02月07日
    浏览(23)
  • 【C语言】【数据结构】自定义类型:结构体

    这是一篇对结构体的详细介绍,这篇文章对结构体声明、结构体的自引用、结构体的初始化、结构体的内存分布和对齐规则、库函数offsetof、以及进行内存对齐的原因、如何修改默认对齐数、结构体传参进行介绍和说明。                  ✨  猪巴戒 :个人主页✨      

    2024年02月05日
    浏览(25)
  • 【数据结构】图的定义、存储

    对王道数据结构选择题做错和不清楚的题的简单纠错 一个有n个顶点和n条边的无向图一定是 有环的 一个无向图有n个顶点和n-1条边,可以使它连通单没有环,若再加一条边,则会形成环 若图中顶点数为n,则它的生成树有n-1条边,去掉一条边变成非连通图;加上一条边变成一

    2024年02月08日
    浏览(37)
  • 数据结构|基础知识定义

    1.值传递、地址传递、值返回、地址返回 1 值传递 :普通变量作为函数参数传递是单向的值传递,只是将实参的值复制一份给形参变量,形参的改变不会影响实参的值,因为所在内存空间不同 如果传递的是地址,被调函数使用指针接收,如果在被调函数中,没有更改指针指向

    2024年02月08日
    浏览(33)
  • 数据结构--单链表的定义

    单链表的定义(如何用代码实现) 优点:不要求大片连续空间,改变容量方便 缺点:不可随机存取,要耗费一定空间存放指针 为了方便 我们经常使用 typedef t y p e d e f 数据类型 别名 color{purple}typedef 数据类型 别名 t y p e d e f 数据类型 别名 代码一: 代码二: 代码一与代码二是

    2024年02月11日
    浏览(43)
  • 【数据结构】顺序表的定义

    🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:数据结构 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 在数据结构的世界里,顺序表是一种常见且基础的线性数据结构。它以其简洁、直观的特性,广

    2024年04月08日
    浏览(40)
  • 【数据结构】图的定义,存储,遍历

    🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Dream It Possible】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🍔前言 🎁图的定义   🏳️‍🌈有向完全图 🏳️‍🌈无向完全图 🎁存储结构 🏳️‍🌈邻接矩阵  🎈代码

    2024年02月06日
    浏览(66)
  • 数据结构 | 树的定义及实现

    目录 一、树的术语及定义 二、树的实现 2.1 列表之列表 2.2 节点与引用 节点: 节点是树的基础部分。它可以有自己的名字,我们称作“键”。节点也可以带有附加信息,我们称作“有效载荷”。有效载荷信息对于很多树算法来说不是重点,但它常常在使用树的应用中很重要

    2024年02月14日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包