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_timetimestamps: true,// delete_timeparanoid: 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')                // TINYTEXTSequelize.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" });
生成的关联表

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

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 的字段名
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/96442.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL-数据类型

MySQL-数据类型 数值类型bittinyintfloatdecimal 字符串和文本类型charvarcharblobtext 日期和时间类型enum-枚举类型set-集合类型 数值类型 数据类型说明bit(M)位类型。M指定位数&#xff0c;默认值为1&#xff0c;范围1-64.tinyint [unsigned]带符号范围:-128 - 127&#xf…

解决 filezilla 连接服务器失败问题

问题描述&#xff1a; 开始一直用的 XFTP 后来&#xff0c;它变成收费软件了&#xff0c;所以使用filezilla 代替 XFTP 之前用的还好好的&#xff0c;今天突然就报错了&#xff1a;按要求输入相关字段&#xff0c;连接 连接失败&#xff01;&#xff01;&#xff01;o(╥﹏╥…

el-table 单击某一行,该行的前面的多选框显示已勾选

目 录 官网&#xff1a; 1. 单页面 2. table是组件 案例&#xff1a; 官网&#xff1a; 1. 单页面 通过单击获取当前行的数据&#xff0c;然后传给选中显示勾选的方法。 <template><el-tableref"multipleTable":data"tableData"tooltip-eff…

postgresql并行查询(高级特性)

######################## 并行查询 postgresql和Oracle一样支持并行查询的,比如select、update、delete大事无开启并行功能后,能够利用多核cpu,从而充分发挥硬件性能,提升大事物的处理效率。 pg在9.6的版本之前是不支持的并行查询的,从9.6开始支持并行查询,但是功能非常…

Windows docker desktop 基于HyperV的镜像文件迁移到D盘

Docker desktop的HyperV镜像文件&#xff0c;默认是在C盘下 C:\ProgramData\DockerDesktop\vm-data\DockerDesktop.vhdx如果部署的软件较多&#xff0c;文件较大&#xff0c;或者产生日志&#xff0c;甚至数据等&#xff0c;这将会使此文件越来越大&#xff0c;容易导致C盘空间…

QT 设置应用程序图标

1.下载xx.ico图标&#xff1a;ico网址 2.在线PNG转换ICO&#xff1a;png在线转换ico 3.添加图标资源 1&#xff09;新建文件路径 2&#xff09;添加图片资源 3&#xff09;在 .pro文件里面添加图片 4&#xff09;将xx.ico放到工程目录&#xff0c;编译完可以看到xx.exe的图标…

Go几种读取配置文件的方式

比较有名的方案有 使用viper管理配置[1] 支持多种配置文件格式&#xff0c;包括 JSON,TOML,YAML,HECL,envfile&#xff0c;甚至还包括Java properties 支持为配置项设置默认值 可以通过命令行参数覆盖指定的配置项 支持参数别名 viper[2]按照这个优先级&#xff08;从高到低&am…

学生宿舍水电费自动缴费系统/基于javaweb的水电缴费系统

摘 要 “互联网”的战略实施后&#xff0c;很多行业的信息化水平都有了很大的提升。但是目前很多学校日常工作仍是通过人工管理的方式进行&#xff0c;需要在各个岗位投入大量的人力进行很多重复性工作&#xff0c;这样就浪费了许多的人力物力&#xff0c;工作效率较低&#x…

Vue框架--Vue中el和data的两种写法

data与el的2种写法 1.el有2种写法 (1).new Vue时候配置el属性。 (2).先创建Vue实例&#xff0c;随后再通过vm.$mount(#root)指定el的值。 2.data有2种写法 (1).对象式 (2).函数式 如何选择&#xff1a;目前哪种写法都可以&#xff0c;以后学习到组件时&#xff…

前端面试中Vue的有经典面试题二

7. Vue中给data中的对象属性添加一个新的属性时会发生什么&#xff0c;如何解决&#xff1f; 示例&#xff1a; 点击button会发现&#xff0c; obj.b 已经成功添加&#xff0c;但是视图并未刷新&#xff1a; 原因在于在Vue实例创建时&#xff0c; obj.b 并未声明&#xff0c;因…

IIR滤波器

IIR滤波器原理 IIR的特点是&#xff1a;非线性相位、消耗资源少。 IIR滤波器的系统函数与差分方程如下所示&#xff1a; 由差分方程可知IIR滤波器存在反馈&#xff0c;因此在FPGA设计时要考虑到有限字长效应带来的影响。差分方程中包括两个部分&#xff1a;输入信号x(n)的M节…

Swift 中的动态成员查找

文章目录 前言基础介绍基础示例1. 定义一个动态成员访问类&#xff1a;2. 访问嵌套动态成员&#xff1a; 使用 KeyPath 的编译时安全性KeyPath 用法示例KeyPath 进阶使用示例1. 动态访问属性&#xff1a;2. 结合可选属性和 KeyPath&#xff1a;3. 动态 KeyPath 和字典&#xff…