• koa使用Sequelize:定义数据结构


    创建连接
    1. const { Sequelize } = require('sequelize');
    2. // 第一个参数:连接的数据库名
    3. // 第二个参数:数据库的用户名
    4. // 第三个参数:数据库的密码
    5. const mysql = new Sequelize('mytest', 'root', 'root', {
    6. dialect: 'mysql', // 这里可以改成任意一种关系型数据库
    7. host: 'localhost', // 数据库服务器
    8. timezone: '+08:00', // 这里是东八区,默认为0时区
    9. pool: { // 使用连接池
    10. max: 5,
    11. min: 0,
    12. acquire: 30000,
    13. idle: 10000,
    14. },
    15. });
    测试连接
    1. // 测试连接是否成功
    2. (async () => {
    3. try {
    4. await mysql.authenticate();
    5. console.log('Connection has been established successfully.');
    6. } catch (error) {
    7. console.error('Unable to connect to the database:', error);
    8. }
    9. })(); // 多一个括号表示调用方法
    完整db定义类
    1. const AppConfig = {
    2. environment: "dev",
    3. database: {
    4. database: "notes_app", // 库名
    5. username: "notes_app", // 用户名
    6. password: "notes_app", // 密码
    7. options: {
    8. // 配置
    9. host: "localhost",
    10. dialect: "mysql",
    11. define: {
    12. // create_time && update_time
    13. timestamps: true,
    14. // delete_time
    15. paranoid: true,
    16. createdAt: "created_at",
    17. updatedAt: "updated_at",
    18. deletedAt: "deleted_at",
    19. // 把驼峰命名转换为下划线
    20. underscored: true,
    21. scopes: {
    22. bh: {
    23. attributes: {
    24. exclude: ["updated_at", "deleted_at", "created_at"]
    25. }
    26. },
    27. iv: {
    28. attributes: {
    29. exclude: ["updated_at", "deleted_at"]
    30. }
    31. }
    32. }
    33. },
    34. pool: {
    35. max: 5,
    36. min: 0,
    37. acquire: 30000,
    38. idle: 10000
    39. },
    40. timezone: "+08:00" // 东八时区
    41. }
    42. },
    43. security: {
    44. secretKey: "secretKey",
    45. // 过期时间 1小时
    46. expiresIn: 60 * 60
    47. }
    48. };
    49. module.exports = AppConfig;

    1. const { Sequelize } = require("sequelize");
    2. const AppConfig = require("../config/config");
    3. class DbManager {
    4. constructor() {
    5. this.config = AppConfig.database;
    6. this.sequelize = null;
    7. this.isConnected = false;
    8. }
    9. async isConnection() {
    10. const { database, username, password, options } = this.config;
    11. this.sequelize = new Sequelize(database, username, password, options);
    12. try {
    13. await this.sequelize.authenticate();
    14. // console.log("successfully");
    15. this.isInitOk = true;
    16. return true;
    17. } catch (error) {
    18. console.error("Unable to connect to the database:", error);
    19. return false;
    20. }
    21. }
    22. start() {
    23. const isConnected = this.isConnection();
    24. this.isConnected = isConnected;
    25. if (isConnected) {
    26. // console.log("连接ok");
    27. return true;
    28. }
    29. }
    30. stop() {
    31. if (this.sequelize !== null) {
    32. this.sequelize.close();
    33. console.log("连接close");
    34. }
    35. }
    36. getSequelize() {
    37. return this.sequelize;
    38. }
    39. getIsConnected() {
    40. return this.isConnected;
    41. }
    42. }
    43. const dbManager = new DbManager();
    44. dbManager.start();
    45. const sequelize = dbManager.getSequelize();
    46. // console.log(sequelize);
    47. sequelize.sync({ force: false }); // 初始化模型
    48. module.exports = {
    49. dbManager,
    50. sequelize
    51. };
    常用DataTypes定义
    1. Sequelize.STRING // VARCHAR(255)
    2. Sequelize.STRING(1234) // VARCHAR(1234)
    3. Sequelize.STRING.BINARY // VARCHAR BINARY
    4. Sequelize.TEXT // TEXT
    5. Sequelize.TEXT('tiny') // TINYTEXT
    6. Sequelize.INTEGER // INTEGER
    7. Sequelize.BIGINT // BIGINT
    8. Sequelize.BIGINT(11) // BIGINT(11)
    9. Sequelize.FLOAT // FLOAT
    10. Sequelize.FLOAT(11) // FLOAT(11)
    11. Sequelize.FLOAT(11, 12) // FLOAT(11,12)
    12. Sequelize.REAL // REAL 仅限于PostgreSQL.
    13. Sequelize.REAL(11) // REAL(11) 仅限于PostgreSQL.
    14. Sequelize.REAL(11, 12) // REAL(11,12) 仅限于PostgreSQL.
    15. Sequelize.DOUBLE // DOUBLE
    16. Sequelize.DOUBLE(11) // DOUBLE(11)
    17. Sequelize.DOUBLE(11, 12) // DOUBLE(11,12)
    18. Sequelize.DECIMAL // DECIMAL
    19. Sequelize.DECIMAL(10, 2) // DECIMAL(10,2)
    20. Sequelize.DATE // DATETIME 针对 mysql / sqlite, TIMESTAMP WITH TIME ZONE 针对 postgres
    21. Sequelize.DATE(6) // DATETIME(6) 针对 mysql 5.6.4+. 小数秒支持多达6位精度
    22. Sequelize.DATEONLY // DATE 不带时间.
    23. Sequelize.BOOLEAN // TINYINT(1)
    24. Sequelize.ENUM('value 1', 'value 2') // 一个允许具有 “value 1” 和 “value 2” 的 ENUM
    25. Sequelize.ARRAY(Sequelize.TEXT) // 定义一个数组。 仅限于 PostgreSQL。
    26. Sequelize.ARRAY(Sequelize.ENUM) // 定义一个 ENUM 数组. 仅限于 PostgreSQL。
    添加model
    1. const { Model, DataTypes } = require("sequelize");
    2. const { sequelize } = require("../util/db");
    3. class Cate extends Model {}
    4. Cate.init(
    5. {
    6. id: {
    7. type: DataTypes.INTEGER,
    8. primaryKey: true, // 主键
    9. autoIncrement: true // 自增
    10. },
    11. uid: {
    12. type: DataTypes.UUID,
    13. defaultValue: DataTypes.UUIDV4,
    14. unique: true // 唯一
    15. },
    16. name: DataTypes.STRING,
    17. icon: DataTypes.STRING,
    18. desc: DataTypes.TEXT,
    19. parentUid: DataTypes.UUID
    20. },
    21. {
    22. sequelize,
    23. tableName: "cate" // 指定生成的表名
    24. }
    25. );
    26. module.exports = {
    27. Cate
    28. };
    为model添加初始
    1. Cate.sync({ force: false })
    2. .then(async () => {
    3. await Cate.create({
    4. name: "所有笔记",
    5. icon: "",
    6. desc: "所有笔记",
    7. parentUid: ""
    8. });
    9. await Cate.create({
    10. name: "标签",
    11. icon: "",
    12. desc: "标签",
    13. parentUid: ""
    14. });
    15. await Cate.create({
    16. name: "回收站",
    17. icon: "",
    18. desc: "回收站",
    19. parentUid: ""
    20. });
    21. })
    22. .catch(err => {
    23. console.log("err= ", err);
    24. }); // 初始化模型

    模型关联
    一对一
    文章
    1. class Article extends Model {}
    2. Article.init(
    3. {
    4. id: {
    5. type: DataTypes.INTEGER,
    6. primaryKey: true, // 主键
    7. autoIncrement: true // 自增
    8. },
    9. uid: {
    10. type: DataTypes.UUID,
    11. primaryKey: true, // 主键
    12. defaultValue: DataTypes.UUIDV4
    13. },
    14. title: DataTypes.STRING,
    15. deleteUid: DataTypes.UUID,
    16. collectUid: DataTypes.UUID,
    17. publishStatus: {
    18. type: DataTypes.INTEGER,
    19. // (0草稿、1公开、2私有)
    20. defaultValue: 0
    21. }
    22. },
    23. {
    24. sequelize,
    25. tableName: "article" // 指定生成的表名
    26. }
    27. );
    文章内容
    1. class ArticleContent extends Model {}
    2. ArticleContent.init(
    3. {
    4. id: {
    5. type: DataTypes.INTEGER,
    6. primaryKey: true, // 主键
    7. autoIncrement: true // 自增
    8. },
    9. uid: {
    10. type: DataTypes.UUID,
    11. primaryKey: true, // 主键
    12. defaultValue: DataTypes.UUIDV4
    13. },
    14. content: DataTypes.TEXT
    15. },
    16. {
    17. sequelize,
    18. timestamps: false,
    19. tableName: "article_content" // 指定生成的表名
    20. }
    21. );

    关联关系定义
    1. // 关联意味着 AB 之间存在一对一的关系,外键在目标模型(B)中定义.
    2. ArticleContent.hasOne(Article, {
    3. foreignKey: "article_content_uid",
    4. sourceKey: "uid"
    5. });
    6. // A.belongsTo(B)关联意味着 AB 之间存在一对一的关系,外键在源模型中定义(A).
    7. Article.belongsTo(ArticleContent, {
    8. foreignKey: "article_content_uid",
    9. sourceKey: "uid"
    10. });
    多对多
    分类
    1. class Cate extends Model {}
    2. Cate.init(
    3. {
    4. id: {
    5. type: DataTypes.INTEGER,
    6. primaryKey: true, // 主键
    7. autoIncrement: true // 自增
    8. },
    9. uid: {
    10. type: DataTypes.UUID,
    11. primaryKey: true, // 主键
    12. defaultValue: DataTypes.UUIDV4
    13. },
    14. name: DataTypes.STRING,
    15. icon: DataTypes.STRING,
    16. desc: DataTypes.TEXT,
    17. parentUid: DataTypes.UUID
    18. },
    19. {
    20. sequelize,
    21. tableName: "cate" // 指定生成的表名
    22. }
    23. );
    文章分类关联表定义
    1. class ArticleCates extends Model {}
    2. ArticleCates.init(
    3. {
    4. id: {
    5. type: DataTypes.INTEGER,
    6. primaryKey: true, // 主键
    7. allowNull: false,
    8. autoIncrement: true // 自增
    9. },
    10. uid: {
    11. type: DataTypes.UUID,
    12. primaryKey: true, // 主键
    13. defaultValue: DataTypes.UUIDV4
    14. }
    15. },
    16. {
    17. sequelize,
    18. timestamps: false,
    19. tableName: "articale_cates" // 指定生成的表名
    20. }
    21. );

    关联关系定义(采用两个一对多的方式)
    1. Article.hasMany(ArticleCates, {
    2. foreignKey: "article_uid",
    3. sourceKey: "uid"
    4. });
    5. Cate.hasMany(ArticleCates, {
    6. foreignKey: "cate_uid",
    7. sourceKey: "uid"
    8. });
    9. ArticleCates.belongsTo(Article, { foreignKey: "article_uid" });
    10. ArticleCates.belongsTo(Cate, { foreignKey: "cate_uid" });
    生成的关联表

    如果采用多对多方式关联,始终都关联不上uid,可以用id关联。

    1. Article.belongsToMany(Cate, {
    2. through: ArticleCates,
    3. foreignKey: "article_uid", // ArticleCates 表中表示文章 uid 的字段名
    4. sourceKey: "uid",
    5. otherKey: "cate_uid" // ArticleCates 表中表示分类 uid 的字段名
    6. });
    7. Cate.belongsToMany(Article, {
    8. through: ArticleCates,
    9. foreignKey: "cate_uid", // ArticleCates 表中表示分类 uid 的字段名
    10. sourceKey: "uid",
    11. otherKey: "article_uid" // ArticleCates 表中表示文章 uid 的字段名
    12. });
  • 相关阅读:
    2022年最新Python大数据之Python基础【六】函数与变量
    Python 字典类型拓展(包括 MappingProxyType 只读字典, defaultdict 缺省字典和 ChainMap)
    纳米金颗粒修饰核酸产品|碳纳米管载核酸-DNA/RNA材料|解析说明
    【JAVA】异常
    Spring Boot_1【配置环境&&项目结构&&Spring Security相关】
    nginx静态网站部署
    Python获取jsonp数据
    飞致云及其旗下1Panel项目进入2023年第三季度最具成长性开源初创榜单
    感受帅酷一刻 | Kvaser CAN总线助力瑞典CAKE越野电动摩托车研发、测试与维护
    中国现代农业谋定发展-国稻种芯-万祥军:面临哪些制约因素?
  • 原文地址:https://blog.csdn.net/h1530687053/article/details/132605509