Sequelize简单好上手的node.js ORM框架[MarkDown Note]
Posted 一步一步似爪牙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sequelize简单好上手的node.js ORM框架[MarkDown Note]相关的知识,希望对你有一定的参考价值。
前言
轻量应用开发,node.js足够
前些天,在学习开发微信小程序的时候,感觉到了腾讯的人性化,微信公众平台竟然免费提供了一个开发环境与一个生产环境,提供腾讯云的服务,不过只支持php与node.js的开发语言。在此情况下,我毅然决然的入手了node.js来支持我的小程序后台开发。
今天我先简单给大家介绍一门 ORM(object relation mapping) 对象关系映射型的node.js框架--Sequelize
1.安装
Sequelize支持通过npm与yarn进行安装
Sequelize安装很简单,可以通过npm与yarn进行安装,也支持使用淘宝镜像cnpm进行安装。
// 使用 NPM(使用cnpm类似)
$ npm install --save sequelize
# 下面的数据库支持的包任选一种安装:
$ npm install --save pg pg-hstore
$ npm install --save mysql2 //mysql
$ npm install --save sqlite3 //sqlite
$ 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
2.创建连接
初始化创建连接及连接池
安装好sequelize之后,我们可以新建一个js文件定义为db.js
导入sequelize包,并通过实例化Sequelize创建连接,我们使用的是mysql数据库,具体代码如下:
const Sequelize = require('sequelize');
const sequelize = new Sequelize('temp_work', 'root', 'root', {
host: 'localhost',
dialect: 'mysql',
operatorsAliases: false,
//定义连接池
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
});
根据官方的文档,创建连接,传参中具有下列选项(以下为本人翻译):
const sequelize = new Sequelize('database', 'username', 'password', {
// 定义sql的方言
// 目前支持: 'mysql', 'sqlite', 'postgres', 'mssql'
dialect: 'mysql',
// 客户主机; 默认: localhost
host: 'my.server.tld',
// 客户端 端口; 默认: 方言默认的
port: 12345,
// 客户协议 默认tcp;
// postgres only, useful for Heroku
protocol: null,
// 设置关闭日志; 默认: console.log
logging: false,
// 你可以把任何方言协议放在方言库下面
// - 默认是空的
// - 当前支持: 'mysql', 'postgres', 'mssql'
dialectOptions: {
socketPath: '/Applications/MAMP/tmp/mysql/mysql.sock',
supportBigNumbers: true,
bigNumberStrings: true
},
// sqlite的存储引擎
// - 默认 ':内存:'
storage: 'path/to/database.sqlite',
// 取消插入未定义的数据为null
// - 默认: false
omitNull: true,
// 是否使用本地包的一个flag标志
// 在 'pg'的情况下 -- 设置这个为true将支持 SSL
// - default: false
native: true,
// 特殊选项 options, 当 sequelize.define被调用的时候使用.
// 例如:
// define: { timestamps: false }
// 类似于:
// sequelize.define(name, attributes, { timestamps: false })
// 所以给每一个模型定义时间戳不是必须的
define: {
underscored: false
freezeTableName: false,
charset: 'utf8',
dialectOptions: {
collate: 'utf8_general_ci'
},
timestamps: true
},
// 与同步sync相同: 你可以定义始终强制同步models模型
sync: { force: true },
// 连接池配置用于与数据库创建连接池
pool: {
max: 5,
idle: 30000,
acquire: 60000,
},
// 每一笔事务transaction的隔离登记
// 默认为方言所默认的
isolationLevel: Transaction.ISOLATION_LEVELS.REPEATABLE_READ
})
3、测试连接
可以调用.authenticate()方法像下面的代码一行测试连接
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
4、定义一个模型
使用sequelize.define('name', {attributes}, {options})来定义一个模型
//创建一个User对象,关联user表
//定义user表中的两个字段:String类型的firstName与String类型的lastName
const User = sequelize.define('user', {
firstName: {
type: Sequelize.STRING
},
lastName: {
type: Sequelize.STRING
}
});
注意事项:默认情况下,sequelize会主动创建createdAt与updatedAt两个时间戳字段。
sequelize支持的数据类型(拆自官方文档):
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 only.
Sequelize.REAL(11) // REAL(11) PostgreSQL only.
Sequelize.REAL(11, 12) // REAL(11,12) PostgreSQL only.
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 for mysql / sqlite, TIMESTAMP WITH TIME ZONE for postgres
Sequelize.DATE(6) // DATETIME(6) for mysql 5.6.4+. Fractional seconds support with up to 6 digits of precision
Sequelize.DATEONLY // DATE without time.
Sequelize.BOOLEAN // TINYINT(1)
Sequelize.ENUM('value 1', 'value 2') // An ENUM with allowed values 'value 1' and 'value 2'
Sequelize.ARRAY(Sequelize.TEXT) // Defines an array. PostgreSQL only.
Sequelize.ARRAY(Sequelize.ENUM) // Defines an array of ENUM. PostgreSQL only.
Sequelize.JSON // JSON column. PostgreSQL, SQLite and MySQL only.
Sequelize.JSONB // JSONB column. PostgreSQL only.
Sequelize.BLOB // BLOB (bytea for PostgreSQL)
Sequelize.BLOB('tiny') // TINYBLOB (bytea for PostgreSQL. Other options are medium and long)
Sequelize.UUID // UUID datatype for PostgreSQL and SQLite, CHAR(36) BINARY for MySQL (use defaultValue: Sequelize.UUIDV1 or Sequelize.UUIDV4 to make sequelize generate the ids automatically)
Sequelize.RANGE(Sequelize.INTEGER) // Defines int4range range. PostgreSQL only.
Sequelize.RANGE(Sequelize.BIGINT) // Defined int8range range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DATE) // Defines tstzrange range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DATEONLY) // Defines daterange range. PostgreSQL only.
Sequelize.RANGE(Sequelize.DECIMAL) // Defines numrange range. PostgreSQL only.
Sequelize.ARRAY(Sequelize.RANGE(Sequelize.DATE)) // Defines array of tstzrange ranges. PostgreSQL only.
Sequelize.GEOMETRY // Spatial column. PostgreSQL (with PostGIS) or MySQL only.
Sequelize.GEOMETRY('POINT') // Spatial column with geometry type. PostgreSQL (with PostGIS) or MySQL only.
Sequelize.GEOMETRY('POINT', 4326) // Spatial column with geometry type and SRID. PostgreSQL (with PostGIS) or MySQL only.
除了上面提到的类型,integer, bigint, float 与 double 也支持unsigned与zerofill特性。它们能以任意顺序组合。需要注意的是PostgreSQL不支持
Sequelize.INTEGER.UNSIGNED // INTEGER UNSIGNED
Sequelize.INTEGER(11).UNSIGNED // INTEGER(11) UNSIGNED
Sequelize.INTEGER(11).ZEROFILL // INTEGER(11) ZEROFILL
Sequelize.INTEGER(11).ZEROFILL.UNSIGNED // INTEGER(11) UNSIGNED ZEROFILL
Sequelize.INTEGER(11).UNSIGNED.ZEROFILL // INTEGER(11) UNSIGNED ZEROFILL
5、执行查询操作
//查询users表中的所有值
User.findAll().then(users => {
console.log(users)
})
// 通过已知id查询数据
User.findById(123).then(user => {
})
// 通过字段搜索一条记录
User.findOne({ where: {firstName: 'hahaha'} }).then(user => {
})
//更新lastName为hahaha的那一条记录的firstName为gege
User.update({firstName:'gege'},{where:{lastName:'hahaha'}}).then(user =>{
})
//删除lastName为hahaha的数据
User.destroy({where:{lastName:'hahaha'}});
//根据条件查询,如果没查到,就插入一条
User
.findOrCreate({where: {username: 'sdepold'}, defaults: {job: 'Technical Lead javascript'}})
.spread((user, created) => {
console.log(user.get({
plain: true
}))
console.log(created)
})
//插入一条数据
User.create({ username: 'fnord', job: 'omnomnom' })
.then(() => User.findOrCreate({where: {username: 'fnord'}, defaults: {job: 'something else'}}))
.spread((user, created) => {
console.log(user.get({
plain: true
}))
console.log(created)
})
//求出年龄的和
User.sum('age').then(sum => {
})
//找出最大值,max()中第二个参数可以传入条件{op:""}
User.max('age').then(max => {
// this will return 40
})
//查询总记录条数
User.count().then(c => {
})
…………<后续细说>
结:
看过这些demo之后,可以看出来sequelize其实很容易,很好轻松上手,如果喜欢,可以现在上手试试吧。
以上是关于Sequelize简单好上手的node.js ORM框架[MarkDown Note]的主要内容,如果未能解决你的问题,请参考以下文章