利用 Sequelize 来操作数据库

栏目: 数据库 · 发布时间: 5年前

内容简介:利用传说中的ORM技术,把关系数据库的表结构映射到对象上,简化数据库操作。Published: 2019-3-01Sequelize 是一个基于 Prom 的 ORM for Node,面向熟悉 JavaScript 和使用 Node.js 进行后端开发的开发人员。在本篇文章中,将探讨 Sequelize 的一些常见用例以及 利用 Sequelize-cli 完成相关的环境配置。

利用传说中的ORM技术,把关系数据库的表结构映射到对象上,简化数据库操作。

Published: 2019-3-01

Sequelize 是一个基于 Prom 的 ORM for Node,面向熟悉 JavaScript 和使用 Node.js 进行后端开发的开发人员。在本篇文章中,将探讨 Sequelize 的一些常见用例以及 利用 Sequelize-cli 完成相关的环境配置。

  1. Sequelize 极简入门教程;
  2. Sequelize-cli 完成 dev,test,prod 环境的配置,以及数据库创建;
  3. Sequelize-cli 完成表结构的设计、迁移与数据填充;
  4. Sequelize 结合 Sequelize-cli 完成数据库的增、删、改、查;
  5. 总结。

Sequelize 极简入门教程

本章代码, here

ORM:Object-Relational Mapping,就是允许将关系数据库映射到对象上,使得这些对象具有一些属性和操作数据库的方法,避免编写 SQL 语句。

Sequelize:Sequelize 是一款基于 Nodejs 功能强大的异步ORM框架,同时支持 PostgreSQL,MySQL,SQLite 等多种数据库,很适合作为Nodejs后端数据库的存储接口。

本节简单利用 Sequelize 向数据库中插入一条数据,方便后续理解 Sequelize-cli。

安装

可以利用 npmyarn 完成安装

// Using NPM
$ npm install --save sequelize

# And one of the following:
$ npm install --save pg pg-hstore
$ npm install --save mysql2
$ npm install --save sqlite3
$ npm install --save tedious // MSSQL

// Using Yarn
$ yarn add sequelize

# And one of the following:
$ yarn add pg pg-hstore
$ yarn add mysql2
$ yarn add sqlite3
$ yarn add tedious // MSSQL
复制代码

本文依赖 mysql ,所以

$ npm install --save sequelize
$ npm install --save mysql2
复制代码

建立与数据库连接

Sequelize 提供了两种连接数据库的方式

const Sequelize = require('sequelize');
// 数据库相关参数
const sequelize = new Sequelize('database', 'username', 'password', {
    // 所在ip
    host: 'localhost',
    // 所用端口
    port: '端口',
    // 所用数据库类型
    dialect: 'mysql'|'sqlite'|'postgres'|'mssql',
    // 请参考 Querying - 查询 操作符 章节
    operatorsAliases: false,
    // 设置连接池,因此如果您从单个进程连接到数据库,理想情况下应该只为每个数据库创建一个实例
    pool: {
        max: 5,
        min: 0,
    	acquire: 30000,
    	idle: 10000
  	},
    // 执行过程会log一些SQL的logging,设为false不显示
  	logging: false,

  	// SQLite only
  	storage: 'path/to/database.sqlite'
});

// 利用 uri 简易连接数据库
const sequelize = new Sequelize('postgres://user:pass@example.com:5432/dbname');
复制代码

本文所用数据库为 mysql,结合 sequelize.authenticate 来对连接进行测试,构建 index.js

const Sequelize = require('sequelize');

const sequelize = new Sequelize('users_dev', 'username', 'password', {
    host: 'localhost',
    port: 3306,
    dialect: 'mysql',
    operatorsAliases: false,
    // logging: false,

    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    },
});

sequelize
    .authenticate()
    .then(() => {
        console.log('Connection has been established successfully.');
        process.exit();
    })
    .catch(err => {
        console.error('Unable to connect to the database:', err);
    });
复制代码

利用 node index.js 运行该脚本,成功的会打印出 Connection has been established successfully.

定义 Model,并插入数据

Model 主要是用来完成与表之间的映射,主要利用 sequelize.define('name', {attributes}, {options}) 完成 Model 的定义。我们定义一个 User 模型对应 user 表。

const User = sequelize.define('user', {
    // 即使表的结构也是Model的属性
    firstName: {
        type: Sequelize.STRING
    },
    lastName: {
        type: Sequelize.STRING
    }
});
复制代码

利用已经定义好的Model,可以完成对 user 表的插入数据操作

// force: true will drop the table if it already exists
User.sync({
    force: true
}).then(() => {
    // Table created
    return User.create({
        firstName: 'John',
        lastName: 'Hancock'
    });
}).then(() => {
    process.exit()
})
复制代码

以上完成 Sequelize 的极简介绍,主要想介绍一个映射的流向,方便后续理解,官网实例更加详细。

Sequelize-cli 完成 dev,test,prod 环境的配置,以及数据库创建

本章代码, here

与 Sequelize 相伴的有 Sequelize-cli 工具,Sequelize-cli 为我们提供了一系列好用的终端指令,来完成以下工作

  • 配置不同的环境的数据库连接,例如dev、test、prod等;
  • 自动管理表对应的 Model;
  • 利用 migrations 完成数据库的表结构的迁移;
  • 利用 seeders 完成数据库的表内容的初始化。

首先安装 Sequelize-cli

npm i sequelize-cli -D
复制代码

在 package.json 中添加

"scripts": {
    "init": "node_modules/.bin/sequelize init",
    ...
}
复制代码

运行 npm run init 命令,之后会发现,在目录下多了 config、models、migrations、seeders四个文件夹

├── config # 项目配置目录 | ├── config.json # 数据库连接的配置 ├── models # 数据库 model | ├── index.js # 数据库连接的样板代码 ├── migrations # 数据迁移的目录 ├── seeders # 数据填充的目录

本节只考虑配置相关的,也就是config文件夹下的内容,主要包含 config.json

{
    "development": {
        "username": "root",
        "password": null,
        "database": "database_development",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "test": {
        "username": "root",
        "password": null,
        "database": "database_test",
        "host": "127.0.0.1",
        "dialect": "mysql"
    },
    "production": {
        "username": "root",
        "password": null,
        "database": "database_production",
        "host": "127.0.0.1",
        "dialect": "mysql"
    }
}
复制代码

主要包含了 development、test、production,三个环境下的数据库信息。

之前我也是利用 config.json 来管理的,但是之后通过阅读 基于 hapi 的 Node.js 小程序后端开发实践指南 ,发现利用 .env 文件来管理是一种更为优雅的方法。

安装 env2 插件,在当前目录下创建 .env 文件用于配置开发环境以及生产环境的基础信息。

npm i -D env2
复制代码

.env 内容,注字符串变量不需要''。

DB_USERNAME = username
DB_PASSWORD = password
DB_NAME = dataname
DB_NAME_PROD = prodDataname
DB_HOST = *.*.*.*
DB_PORT = *
复制代码

如果 git 非私密的,需要配置 .gitignore 的相关信息,在config文件下,创建config.js

require('env2')('./.env');

const {
    env
} = process;

module.exports = {
    "development": {
        "username": env.DB_USERNAME,
        "password": env.DB_PASSWORD,
        "database": env.DB_NAME,
        "host": env.DB_HOST,
        "port": env.DB_PORT,
        "dialect": "mysql",
        "operatorsAliases": false,
    },
    "production": {
        "username": env.DB_USERNAME,
        "password": env.DB_PASSWORD,
        "database": env.DB_NAME_PROD,
        "host": env.DB_HOST,
        "port": env.DB_PORT,
        "dialect": "mysql",
        "operatorsAliases": false,
    }
}
复制代码

同时修改models文件夹下的index.js

// .json => .js
const config = require(__dirname + '/../config/config.js')[env];
复制代码

以上利用env2完成对开发环境,生产环境的config配置,添加 create 以及 create:prod 两条指令

"scripts": {
    "init": "node_modules/.bin/sequelize init",
    "create": "node_modules/.bin/sequelize db:create",
    "create:prod": "node_modules/.bin/sequelize db:create --env production",
    ...
}
复制代码

可创建开发环境、生产环境的的数据库。

Sequelize-cli 完成表结构的设计、迁移与数据填充

本章代码, here

表结构的设计、迁移都与 Migrations 相关

就像使用Git / SVN管理源代码中的更改一样,可以使用 Migration 来初始化数据库、或跟踪数据库更改,也就是说通过配置 Migration 文件可以将现有数据库迁移至另一个状态,并且保存记录。

"scripts": {
	...
	"migration": "node_modules/.bin/sequelize migration:create --name create-examples-table",
	"migration:prod": "node_modules/.bin/sequelize migration:create --name create-examples-table --env production"
	...
}
复制代码

首先在开发环境下进行测试,执行 npm run migration 指令,之后会在 migrations 文件夹内创建一个20190301054713-create-examples-table.js 文件,内容为

'use strict';

module.exports = {
  up: (queryInterface, DataTypes) => {
    /*
      Example:
      return queryInterface.createTable('users', { id: DataTypes.INTEGER });
    */
  },

  down: (queryInterface, DataTypes) => {
    /*
      Example:
      return queryInterface.dropTable('users');
    */
  }
};
复制代码

模块暴漏出一个对象,包含着 updown 两个方法, up 用于定义表结构正向改变, down 则用于定义表结构的回退,对应其中的 return ,正向 createTable ,反向则是 dropTable

两个参数的定义:

  • queryInterface:用于定义Sequelize与所属数据库通信的接口,包含一些API,例如 createTable 用于创建表, dropTable 则用于撤销, addColumn 用于追加字段, removeColumn 则用于移除;

  • DataTypes:用于定义接口数据的类型。

queryInterface.createTable(...) 整体功能与 sequelize.define(...) 类似。简单设计如下表

'use strict';

module.exports = {
    up: (queryInterface, DataTypes) => {
        return queryInterface.createTable('users', {
            id: {
                type: DataTypes.INTEGER,
                autoIncrement: true,
                primaryKey: true,
            },
            name: {
                type: DataTypes.STRING,
                allowNull: false,
            },
            created_at: DataTypes.DATE,
            updated_at: DataTypes.DATE,
        });
    },

    down: (queryInterface) => {
        return queryInterface.dropTable('users');
    }
};
复制代码

添加如下指令

"scripts": {
	...
	"migrate": "node_modules/.bin/sequelize db:migrate",
    "migrate:prod": "node_modules/.bin/sequelize db:migrate --env production",
	...
}
复制代码

运行 npm run migrate ,会将 migrations 目录下的迁移行为定义,按时间戳的顺序,逐个地执行迁移描述,最终完成数据库表结构的自动化创建。会发现数据库examples_dev内创建了一张 SequelizeMeta 的表以及 users 的表:

queryInterface.createTable

相应的也有 node_modules/.bin/sequelize db:migrate:undo 来撤销相应的迁移,这里就不展开介绍了。

数据填充

主要利用 seeders 来在初始化数据表中中初始化一些基础数据,使用方式与数据库表结构迁移相似,添加如下指令。

"scripts": {
	...
	"seeder": "node_modules/.bin/sequelize seed:create --name init-users",
    "seeder:prod": "node_modules/.bin/sequelize seed:create --name init-users --env production",
	...
}
复制代码

运行 npm run seed 指令,则与数据迁移相同的是,seeders 文件夹下多了一个 ***init-users.js 文件,结构也和数据迁移类似。

'use strict';

module.exports = {
    up: (queryInterface, Sequelize) => {
        /*
          Example:
          return queryInterface.bulkInsert('People', [{
            name: 'John Doe',
            isBetaMember: false
          }], {});
        */
    },

    down: (queryInterface, Sequelize) => {
        /*
          Example:
          return queryInterface.bulkDelete('People', null, {});
        */
    }
};
复制代码

参数也相同,只不过一个是创建表,一个是创建数据,所利用的API不同而已,例如。

'use strict';

module.exports = {
    up: (queryInterface, Sequelize) => {
        return queryInterface.bulkInsert('users', [{
            name: 'John Doe',
            created_at: new Date(),
            updated_at: new Date()
        }], {});
    },

    down: (queryInterface, Sequelize) => {
        return queryInterface.bulkDelete('users', null, {});
    }
};
复制代码

添加指令

"scripts": {
    ...
    "seed": "node_modules/.bin/sequelize db:seed:all",
    "seed:prod": "node_modules/.bin/sequelize db:seed:all --env production",
    ...
}
复制代码

也可以用 node_modules/.bin/sequelize db:seed --seed xxxxxxxxx-init-users.js 来指定添充数据。

Sequelize 结合 Sequelize-cli 完成数据库的增、删、改、查

本章代码, here

在第一节中,简单介绍了 User.create(...) 插入了一条数据,本节中介绍结合 Sequelize-cli 完成对数据库的增、删、改、查。

在 Models 文件夹下创建对应的模型文件 users.js,内容与第一节 sequelize.define(...) 类似

module.exports = (sequelize, DataTypes) => sequelize.define(
    'users', {
        id: {
            type: DataTypes.INTEGER,
            autoIncrement: true,
            primaryKey: true,
        },
        name: {
            type: DataTypes.STRING,
            allowNull: false,
        }
    }, {
        tableName: 'users',
        // 以下两个属性是针对createAt、updateAt这两个默认属性的,timestamps是不使用,而underscored
        // 则是将createAt转化为create_at
        // timestamps: false,
        underscored: true,
    }
)
复制代码

模型结构,与数据迁移相同,在 index.js 文件内引入模型

const { users } = require("./models");
复制代码

可以利用该 Model 完成对表 users 的操作,主要以下几个

  • 查: findAllfindByPkfindCreateFindfindOrCreate .....

    const { users } = require("./models");
    
    (async () => {
        // 搜索多个实例
        const user = await users.findAll()
    	// 条件搜索name = 'John Doe'
        // const user = await users.findByPk(1)
    
        console.log(user)
    
        process.exit();
    })()
    复制代码
  • 增: createbulkCreate ....

    const { users } = require("./models");
    
    (async () => {
        await users.create({
            name: 'Yang'
        })
    
        process.exit();
    })()
    复制代码
  • 删: destroydrop 删表 .....

    const { users } = require("./models");
    
    (async () => {
        await users.destroy({
            where: {
                name: 'Yang'
            }
        })
    
        process.exit();
    })()
    复制代码
  • 改: upsertupdate .....

    const { users } = require("./models");
    
    (async () => {
        await users.update({
            name: 'Yange'
        }, {
            where: {
                name: 'John Doe'
            }
        })
    /*    
        await users.upsert({
            name: 'Sccc'
        }, {
            where: {
                name: 'Yange'
            }
        })
    */
        process.exit();
    })()
    复制代码

总结

这篇主要是用来总结之前一直看到的零散知识,也是用来配置存底,防止自己忘了。之前用的 mongoose 到 Sequelize,感觉自己一直在切换工具,却又没有很好地入门了解。之后应该是会选择一个点深入了解下吧,对自己很是失望。

参考

http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-upsert

https://juejin.im/book/5b63fdba6fb9a04fde5ae6d0/section/5b6c048e6fb9a04fdc36afc1


以上所述就是小编给大家介绍的《利用 Sequelize 来操作数据库》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大型网站系统与Java中间件开发实践

大型网站系统与Java中间件开发实践

曾宪杰 / 电子工业出版社 / 2014-4-24 / 65.00

本书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;接着讲述构建 Java 中间件的相关知识;之后的几章都是根据笔者的经验来介绍支撑大型网站架构的 Java 中间件系统的设计和实践。希望读者通过本书可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型......一起来看看 《大型网站系统与Java中间件开发实践》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具