第10章 使用数据库存储网站数据

学习目标

  • 使用 mysql 包操作 MySQL 数据库
  • 使用数据库的动态网站
  • 基于数据库的网站(增删改查)

使用 mysql 包

安装

  1. npm install mysql

Hello World

  1. var mysql = require('mysql');
  2. var connection = mysql.createConnection({
  3. host : 'localhost',
  4. user : 'me',
  5. password : 'secret',
  6. database : 'my_db'
  7. });
  8. connection.connect();
  9. connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  10. if (error) throw error;
  11. console.log('The solution is: ', results[0].solution);
  12. });
  13. connection.end();

增删改查

查询

基本查询:

  1. connection.query('SELECT * FROM `books` WHERE `author` = "David"', function (error, results, fields) {
  2. // error will be an Error if one occurred during the query
  3. // results will contain the results of the query
  4. // fields will contain information about the returned results fields (if any)
  5. });

条件查询:

  1. connection.query('SELECT * FROM `books` WHERE `author` = ?', ['David'], function (error, results, fields) {
  2. // error will be an Error if one occurred during the query
  3. // results will contain the results of the query
  4. // fields will contain information about the returned results fields (if any)
  5. });

添加

  1. var post = {id: 1, title: 'Hello MySQL'};
  2. var query = connection.query('INSERT INTO posts SET ?', post, function (error, results, fields) {
  3. if (error) throw error;
  4. // Neat!
  5. });
  6. console.log(query.sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'

删除

  1. connection.query('DELETE FROM posts WHERE title = "wrong"', function (error, results, fields) {
  2. if (error) throw error;
  3. console.log('deleted ' + results.affectedRows + ' rows');
  4. })

修改

  1. connection.query('UPDATE users SET foo = ?, bar = ?, baz = ? WHERE id = ?', ['a', 'b', 'c', userId], function (error, results, fields) {
  2. if (error) throw error;
  3. // ...
  4. })

连接池

connection-pool.png

  1. var mysql = require('mysql');
  2. var pool = mysql.createPool({
  3. host : 'example.org',
  4. user : 'bob',
  5. password : 'secret',
  6. database : 'my_db',
  7. connectionLimit: 10 // 默认是 10 个
  8. });
  9. pool.getConnection(function(err, connection) {
  10. // Use the connection
  11. connection.query('SELECT something FROM sometable', function (error, results, fields) {
  12. // 释放回连接池
  13. connection.release();
  14. // 处理错误
  15. if (error) throw error;
  16. // ...
  17. });
  18. });

封装 dbHelper.js

  1. const mysql = require('mysql')
  2. const pool = mysql.createPool({
  3. host: 'localhost',
  4. user: 'root',
  5. password: '123456',
  6. database: 'test',
  7. connectionLimit: 10 // 默认是 10 个
  8. })
  9. exports.query = (...args) => {
  10. // 从数组中弹出最后一个元素 callback 回调函数
  11. const callback = args.pop()
  12. pool.getConnection((err, connection) => {
  13. if (err) {
  14. return callback(err)
  15. }
  16. connection.query(...args, function (...results) { // ...results => [err, results, fields]
  17. // 释放回连接池
  18. connection.release()
  19. // 把 ...results => [err, results, fields] 展开调用 callback 继续往外抛
  20. callback(...results)
  21. })
  22. })
  23. }

结合数据库的网站