所有操作的第一个参数都是ERR,第二个参数才是操作返回的结果。
mysql.createConnection
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'zhouhao8789',
port: '3306',
database: 'zhou'
});
connect
// 连接
connection.connect(function (err) {
if (err) {
console.log('[connection connect failed] ' + err);
return;
}
console.log('[connection connect succeed]')
});
query
+SELECT
const selectSql = 'SELECT name FROM mytable where id=1';
connection.query(selectSql, function (err, result) {
if(err) {
console.log('[SELECT ERROR]', err.message);
return;
}
console.log('-------------------SELECT-----------------------');
// node环境下显示返回值带有RowDataPacket
// 用下面的方法可以显示正确的独享
// 实际上可以使用结果对变量赋值
console.log(JSON.parse(JSON.stringify(result)));
console.log('------------------------------------------------------------\n\n');
});
query
+INSERT INTO
// 插入
const addSql = 'INSERT INTO mytable(id, name, sex, birth, birtharrd) VALUES (0,?,?, ?, ?)';
const addSqlParams = ['周2', 'f', '1990-09-09', 'Beijing'];
connection.query(addSql, addSqlParams, function (err, result) {
if(err) {
console.log('[INSERT ERROR]', err.message);
return;
}
console.log('-------------------INSERT-----------------------');
console.log(JSON.parse(JSON.stringify(result)));
console.log('------------------------------------------------------------\n\n');
});
query
+UPDATE
// 修改
const modSql = 'UPDATE mytable SET name = ?, sex = ? WHERE id = ?';
const modSqlParam = ['周杰伦', 'a', 6];
connection.query(modSql, modSqlParam, function (err, result) {
if(err) {
console.log('[UPDATE ERROR]', err.message);
return;
}
console.log('-------------------UPDATE-----------------------');
console.log(JSON.parse(JSON.stringify(result)));
console.log('------------------------------------------------------------\n\n');
});
query
+DELETE
// 删除
const delSql = 'DELETE FROM mytable WHERE id = ?';
const delSqlParam = [1];
connection.query(delSql, delSqlParam, function (err, result) {
if(err) {
console.log('[DELETE ERROR]', err.message);
return;
}
console.log('-------------------DELETE-----------------------');
console.log(JSON.parse(JSON.stringify(result)));
console.log('------------------------------------------------------------\n\n');
});
MySQL中有一个名叫wait_timeout
的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800
(即8小时)。
动重连数据库的代码:
function handleError (err) {
if (err) {
// 如果是连接断开,自动重新连接
if (err.code === 'PROTOCOL_CONNECTION_LOST') {
connect();
} else {
console.error(err.stack || err);
}
}
}
// 连接数据库
function connect () {
db = mysql.createConnection(config);
db.connect(handleError);
db.on('error', handleError);
}
var db;
connect();
使用连接池:
pool.getConnection(function(err, connection) {
// Use the connection
connection.query( 'SELECT something FROM sometable', function(err, rows) {
// And done with the connection.
connection.release();
// Don't use the connection here, it has been returned to the pool.
});
});
另一种形式,导出一个为do
的函数:
var mysql = require('mysql'),
env = {
host: 'localhost',
user: 'root',
password: '2212',
database: 'image_marker'
},
db = mysql.createConnection(env);
db.connect();
exports.do =function(sql, callback) {
db.query(sql, callback);
}
使用连接池:
var pool = mysql.createPool(env);
exports.do =function(sql, callback) {
this.getConnection(function(err, connection) {
connection.query(sql, function() {
callback.apply(connection, arguments);
connection.release();
});
})
}.bind(pool)
上面使用的都是MySQL提供的接口,是比较底层的代码,实际上在数据库的表中,每一行都可以用一个JavaScript对象表示,这就是ORM(Object-Realtional Mapping)技术,把关系数据库的表结构映射到对象上
Sequelize就是Node上的ORM框架,这样,我们读写都是JavaScript对象,Sequelize帮我们把对象编程数据库中的行
中文文档在这里。
使用Sequelize操作的步骤
sequelize.define()
生成一个数据模型ModalfindAll()
方法获取实例save
方法destory()
方法// config.js
var config = {
database: 'test', // 使用哪个数据库
username: 'www', // 用户名
password: 'www', // 口令
host: 'localhost', // 主机名
port: 3306 // 端口号,MySQL默认3306
};
module.exports = config;
const sequelize = new Sequelize(config.database, config.username, config.password, {
host: config.host,
dialect: 'mysql',
pool: {
max: 5,
min: 0,
idle: 30000
}
});
定义模型,告诉Sequelize如何映射到数据库表
默认情况下映射的是第一个参数加s的表,比如下面的例子就是映射的users
的表,如果是与现有的数据库进行映射,则在第三个参数添加说明{ tableName: 'mytable'}
const User = sequelize.define('user', {
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
});
使用find
方法,where
是查询条件,attributes
是输出选项
myTable.find({
attributes: ['name', 'sex'],
where: {
id: 5
}
}).then(res => {
console.log('查询', JSON.parse(JSON.stringify(res)))
}).catch(e => {
console.log(e)
});
使用create
方法
(async () => {
try {
const res = await myTable.create({
name: '闹啥类',
});
console.log(res)
} catch (e) {
console.log('添加失败', e)
}
})();
更新数据时先试用find
找到对应的行,然后直接对属性赋值就可以更新对应的数据
// 更新
myTable.find({
where: {
id: 2
}
}).then(d => {
d.name = '娃哈哈';
return d.save()
}).then(res => {console.log('更新', res)});
删除和更新类似,都是先用find
找到对应的行(即对象),然后使用destroy
方法删除数据
myTable.find({
where: {
id: 3
}
}).then(d => {
return d.destroy()
}).then(res => {console.log('删除', res)});