个人blog-1: 拾忆生活
个人blog-2: 极简-拾忆生活
欢迎大家来踩,同步更新
MySQL Node.js驱动程序
1.Node.js程序访问MySQL数据库
添加依赖包:
1.npm i mysql2
2.npm i sequelize
ORM、ODM区别:
ODM对象数据模型、ORM对象关系模型
ODM / ORM 能将网站中的数据表示为 JavaScript 对象,然后将它们映射到底层数据库
1.ODM 通常慢一些,因为在对象和数据库格式之间存在一层用于映射的翻译代码
2.ORM 可以继续用 JavaScript 对象的思维而不用转向数据库语义的思维。 在(同一个或不同网站)使用不同数据库时尤为明显
Sequelize是一款基于Nodejs功能强大的异步ORM框架
mysql> select * from pets;
+----+--------+------------+
| id | name | birth |
+----+--------+------------+
| 1 | Gaffey | 2007-07-07 |
| 2 | Odie | 2008-08-08 |
+----+--------+------------+
2 rows in set (0.00 sec)
每一行可以用一个JavaScript对象
第一行:JSON表示
{
"id": 1,
"name": "Gaffey",
"birth": "2007-07-07"
}
用Sequelize查询pets表:(复杂)
Pet.findAll()
.then(function (pets) {
for (let pet in pets) {
console.log(`${pet.id}: ${pet.name}`);
}
})
.catch(function (err) {
// error
});
注:
then()和catch()分别异步响应成功和失败
在koa的async异步函数中直接写await访问数据库
ES7的await来调用任何一个Promise对象:(简单)
(async () => {
var pets = await Pet.findAll();
})();
实例:
hnode-MySQL/
|
+- .vscode/
| |
| +- launch.json <-- VSCode 配置文件
|
+- package.json <-- 项目描述文件
|
+- node_modules/ <-- npm安装的所有依赖包
|
+- init.txt <-- 初始化SQL命令
|
+- config.js <-- MySQL配置文件
|
+- app.js <-- 使用koa的js
config.js
//数据库连接配置文件
var config = {
database: 'node_test',
username: 'root',
password: '123456',
host: 'localhost',
port: 3307
};
//暴露接口
module.exports = config;
app.js
const Sequelize = require('sequelize');
//config.js的自定义依赖包
const config = require('./config');
console.log('init sequelize...');
//创建一个sequelize对象实例:
//单个进程连接到数据库,则应仅创建一个Sequelize实例
var sequelize = new Sequelize(config.database, config.username, config.password, {
host: config.host,
//连接数据库语言
dialect: 'mysql',
pool: {
//连接池中的最大、小连接数
max: 5,
min: 0,
//连接释放之前可以空闲的最长时间(以毫秒为单位)
idle: 30000
}
});
//测试连接是否正常
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.');
})
.catch(err => {
console.error('Unable to connect to the database:', err);
});
//Model模型Pet,告诉Sequelize如何映射数据库表
//第一个参数传入默认的表名pets
//第二个参数指定(列名:数据类型),如果是主键,指定true
//第三个参数是额外的配置,传入{ timestamps: false }
//是为了关闭Sequelize的自动添加timestamp的功能。
//sequelize 连接表的时候,会默认给你传进去的表名加上s,
//所以需要手动配置参数 freezeTableName: true
var Pet = sequelize.define('pets',
{
id: {type: Sequelize.STRING(50),primaryKey: true},
name: Sequelize.STRING(100),
gender: Sequelize.BOOLEAN,
birth: Sequelize.STRING(10),
createdAt: Sequelize.BIGINT,
updatedAt: Sequelize.BIGINT,
version: Sequelize.BIGINT
},
{
timestamps: false
});
//日期对象
var now = Date.now();
//往数据库添加数据(Promise方式)
//then()和catch()分别异步响应成功和失败
Pet.create({
id: 'g-' + now,
name: 'cat',
gender: false,
birth: '2020-01-01',
createdAt: now,
updatedAt: now,
version: 0
}).then(function (p) {
console.log('created.' + JSON.stringify(p));
}).catch(function (err) {