三、操作mysql
一、安装、启动
1、安装部分,就不说了
2、连接mysql数据库服务器:在命令行窗口输入mysql -u root -p(没有密码时,也可以直接mysql -uroot),然后输入root口令后,就连接到了MySQL服务器。因为没有指定--host参数,所以我们连接到的是localhost,也就是本机的MySQL服务器。
3、基本命令:
(1)show databases;
(2)use databases;
(3)create database testname;
(4)show tables;
(5)select * from testname;
(6)source /Users/macname/projectname/testsql.sql; //执行一个sql脚本
二、mysql库:
1、目前使用最广泛的MySQL Node.js驱动程序是开源的mysql
2、如果直接使用mysql包提供的接口,我们编写的代码就比较底层,例如,查询代码:
connection.query('SELECT * FROM users WHERE id = ?', ['123'], function(err, rows) {
if (err) {
// error
} else {
for (let row in rows) {
processRow(row);
}
}
});
3、最新的ORM技术:Object-Relational Mapping,把关系数据库的表结构映射到对象上
三、Sequelize库:Node的ORM框架,http://docs.sequelizejs.com/
1、通过Sequelize,我们读写的都是JavaScript对象,Sequelize帮我们把对象变成数据库中的行。如:
Pet.findAll()
.then(function (pets) {
for (let pet in pets) {
console.log(`${pet.id}: ${pet.name}`);
}
}).catch(function (err) {
// error
});
2、我们选择Sequelize的另一个原因:只要API返回Promise,就可以用await调用,写代码就非常简单!
const Sequelize = require('sequelize');
const config = require('./config');
//创建sequelize对象
var sequelize = new Sequelize(config.database, config.username, config.password, {
host: config.host,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 30000
}
});
//创建pet模型
var Pet = sequelize.define('pet', {
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
});
(1)使用Promise方式创建对象:
var now = Date.now();
Pet.create({
id: 'g-' + now,
name: 'Gaffey',
gender: false,
birth: '2007-07-07',
createdAt: now,
updatedAt: now,
version: 0
}).then(function (p) {
console.log('created.' + JSON.stringify(p));
}).catch(function (err) {
console.log('failed: ' + err);
});
(2)使用await方式创建对象:
var now = Date.now();
(async () => {
var dog = await Pet.create({
id: 'd-' + now,
name: 'Odie',
gender: false,
birth: '2008-08-08',
createdAt: now,
updatedAt: now,
version: 0
});
console.log('created: ' + JSON.stringify(dog));
})();
3、我们把sequelize.define()返回的Pet称为Model,它表示一个数据模型,这就是下一部分的主题
四、Model:这部分容易理解,代码部分见:https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001472286125147031e735933574ae099842afd31be80d1000
1、显然,一个项目中,model会有很多。我们希望把各个model放到不同的模块中分开维护,而不是杂糅到一起。
2、模版应该遵循统一套规范:
(1)统一主键,名称必须是id,类型必须是STRING(50);
(2)主键可以自己指定,也可以由框架自动生成(如果为null或undefined);
(3)所有字段默认为NOT NULL,除非显式指定;
(4)统一timestamp机制,每个Model必须有createdAt、updatedAt和version,分别记录创建时间、修改时间和版本号。其中,createdAt和updatedAt以BIGINT存储时间戳,最大的好处是无需处理时区,排序方便。version每次修改时自增。
3、所以,在业务代码中,我们不要直接使用Sequelize的API,而是通过db.js间接地定义Model,规范model结构。