使用Sequelize模块操作数据库之基础篇

本文介绍了Sequelize ORM框架的基本概念及使用方法,包括安装、数据库连接、模型定义及同步等内容。Sequelize简化了关系型数据库的操作,支持多种数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sequelize是一个orm框架,什么是orm呢?即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

sequelize目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server等数据库。

安装

Sequelize 的使用可以通过 npm

npm i Sequelize 

在安装了sequelize模块之后,还需要所选数据库安装驱动程序。

创建sequelize实例

要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数来完成:

const { Sequelize } = require('sequelize');
// 分别传递参数 (sqlite数据库)
const sequelize = new Sequelize({
     dialect: 'sqlite',
     storage: 'path/to/database.sqlite'
 });

// 分别传递参数 (其它数据库)
const sequelize = new Sequelize('database', 'username', 'password', {
     host: 'localhost',
     dialect: /* 选择 'mysql' | 'mariadb' | 'postgres' | 'mssql' 其一 */
     ,logging: console.log,
 });

在导入sequelize模块的时候,require 中的参数是表示 sequelize 模块,在导入sequelize模块之后,返回的是一个对象,通过{}结构对象,而 { Sequelize }则表示将对象中的 Sequelize 结构出来,Sequelize 是不可改变的。

以上两种方法都是用来sequelize实例,他们的区别是:第一种方式是创建sqlite数据库的实例,另外一种是创建除了sqlite数据库之外的实例。

在创建过程中,Sequelize 的构造函数中不止上述那些参数,上述参数只是必须参数。

创建模型

在创建完 Sequelize 实例之后,我们需要对表进行创建。而模型是什么呢?模型是 Sequelize 的本质. 模型是代表数据库中表的抽象。

模型的创建有两种方式,一种是通过调用define()方法,还有一种是init()方法。接下来我们去了解一下这两种创建方式

使用sequelize.define

这种方式的具体语法格式是:sequelize.define(modelName, attributes, options)。这种方法需要三个参数,分别表示模型名称、定义列、模型的配置项。其中后两项是比较重要的参数,也是另外一种方式的参数。

modelName,表示模型的名称,如果没有给模型定义表名,则将使用模型名代替表名,且表名默认复数化。如果不想让表名复数化,可以使用 freezeTableName配置模型,具体见下关于 option 的内容。也可以使用 tableName 设置主动设置表名,具体见下关于 option 的内容

attributes,表示对表中字段的定义,它是一个对象。定义字段的属性有很多,接下来我们通过建立一个模型了解一下:

const { DataTypes } = require('sequelize');

const Test = sequelize.define('tesst', {
    //type表示列的类型,DataTypes是sequelize模块中自带的属性,表示数据类型
    //allowNull表示这个列是否能为空,false表示不能为空,默认值为true
    //defaultValue表示列的默认值
    firstName: {
        type: DataTypes.STRING,
        allowNull: false,
        defaultValue: "这个是默认值"
    },
    //unique可以是布尔值或字符串。如果为布尔值则表示这个列是唯一键
    //如果是compositeIndex表示为
    lastName: {
        type: DataTypes.STRING,
        allowNull: true,
        unique: true
    },
    //primaryKey表示是否为主键,值为true时表示为主键
    third: {
        type: DataTypes.INTEGER,
        primaryKey: true
    },
    //field:不使用对象名作为列名,而使用field的属性值
    //comment:这个是列的注释
    fourth: {
        type: DataTypes.INTEGER,
        field: "four_th",
        comment: '这是带有注释的列'
    },
});

options,用于对模型的配置。常用的配置项:

  1. reezeTableName :为true时,且当模型名就是表名时,表名不复数化
  2. tableName: 设置表名
  3. timestamps: 在默认情况下,创建模型时会自动给模型添加 createdAt 和 updatedAt 字段,分别表示创建表的时间戳、修改表的时间戳。默认值为true。
  4. createdAt:默认为true,如果值为字符串则表示使用createdAt,且给模型添加的是字符串的值
  5. updatedAt:同上

在创建模型时,在模型同步时会自动给表添加一个 id 字段,且字段被设为自增长。

在模型创建完成之后,可以通过sequelize实例访问模型,如:sequelize.models.Test。也可以通过Test访问模型。

在定义列时,我们使用 DataTypes给字段添加数据类型,那么我们列举一些常用的数据类型:

字符串类型
DataTypes.STRING             // VARCHAR(255)
DataTypes.STRING(1234)       // VARCHAR(1234)
DataTypes.STRING.BINARY      // VARCHAR BINARY
DataTypes.TEXT               // TEXT
DataTypes.TEXT('tiny')       // TINYTEXT
DataTypes.CITEXT             // CITEXT          仅 PostgreSQL 和 SQLite.
布尔值和数字类型
DataTypes.BOOLEAN            // TINYINT(1)


DataTypes.INTEGER            // INTEGER
DataTypes.BIGINT             // BIGINT
DataTypes.BIGINT(11)         // BIGINT(11)

DataTypes.FLOAT              // FLOAT
DataTypes.FLOAT(11)          // FLOAT(11)
DataTypes.FLOAT(11, 10)      // FLOAT(11,10)

DataTypes.REAL               // REAL            仅 PostgreSQL.
DataTypes.REAL(11)           // REAL(11)        仅 PostgreSQL.
DataTypes.REAL(11, 12)       // REAL(11,12)     仅 PostgreSQL.

DataTypes.DOUBLE             // DOUBLE
DataTypes.DOUBLE(11)         // DOUBLE(11)
DataTypes.DOUBLE(11, 10)     // DOUBLE(11,10)

DataTypes.DECIMAL            // DECIMAL
DataTypes.DECIMAL(10, 2)     // DECIMAL(10,2)
日期
DataTypes.DATE       // DATETIME 适用于 mysql / sqlite, 带时区的TIMESTAMP 适用于 postgres
DataTypes.DATE(6)    // DATETIME(6) 适用于 mysql 5.6.4+. 支持6位精度的小数秒
DataTypes.DATEONLY   // 不带时间的 DATE

使用init()

这种方式是通过扩展Model来新建模型的,这种方式和第一种方式基本一样,除了模型名的定义和其他的一点小差别之外。使用方法将下列详情:

const { DataTypes, Model } = require('sequelize');

class Test2 extends Model {}

Test2.init({
//列的定义
}, {
    // 这是其他模型参数
    sequelize, // 我们需要传递连接实例
    modelName: 'Test2' // 我们需要选择模型名称
});

模型同步

模型在创建完成之后,必须进行同步操作,用于与数据库中表进行对应。有三个同步的方式:

  1. User.sync() - 如果表不存在,则创建该表(如果已经存在,则不执行任何操作)
  2. User.sync({ force: true }) - 将创建表,如果表已经存在,则将其首先删除
  3. User.sync({ alter: true }) - 这将检查数据库中表的当前状态(它具有哪些列,它们的数据类型等),然后在表中进行必要的更改以使其与模型匹配。

在进行模型同步时,可以同步单个模型,也可以一次将所有模型同步。它们的区别是调用sync()方法的对象不同,一个是单个的模型,一个是sequelize实例

删除表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值