Node 连接 MySql


MySql 安装

在使用 node 连接 mysql前,准备好 mysql 环境

进入 MySql 官网 下载 MySql Server

另外前端工具可以使用官方提供的 MySql Workbench,似乎没中文版

  1. 打开 MySql 压缩包,免安装,进入 bin 目录
  2. 在使用 mysql 之前,需要启动服务,这里直接注册为服务
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 初始化安装
    > mysqld --initialize --user=root --console (仔细看log,记录下生成的临时密码)
    > mysql -u root -p (Can not connect to MySQL server on localhost (10061))
    > mysqld --install
    > net start mysql (启动服务)
    > mysql -u root -p
    > Enter password:******* (输入临时密码)
    > (登录成功)
    > set password=password("newPassword"); (对于8.0以前有效)
    // 对于 8.0 以后
    > ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
    SELECT plugin FROM mysql.user WHERE User = 'root';

Node 连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
port: '3306',
charset: 'UTF8_GENERAL_CI',
timezone: 'local',
connectTimeout: 3000 * 30,
supportBigNumbers: true, // 数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)
user: 'root',
password: 'Password1!',
database: 'sample',
});
connection.connect();
connection.query('SELECT * from websites', function (error, results, fields) {
if (error) throw error;
console.log('The websites array is: ', results);
});

错误记录

  1. ERROR 1130: Host ’xx.xx.x.x′ is not allowed to connect to this MySQL
    server [这是没有权限连接指定 IP 的主机]

-> 解决办法:

1
2
3
4
5
6
(1) 授权 myuser使用mypassword从任何主机连接到mysql服务器
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
(2) 允许用户myuser从ip为192.168.x.x 主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.x.x' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.10.xx.xx' IDENTIFIED BY '123456' WITH GRANT OPTION;

MySql Noted(持续更新)

  1. 取消外键约束
1
2
3
4
5
6
7
8
9
10
11
Mysql中如果表和表之间建立的外键约束,则无法删除表及修改表结构。
解决方法是在Mysql中取消外键约束:
SET FOREIGN_KEY_CHECKS=0;
然后将原来表的数据导出到sql语句,重新创建此表后,再把数据使用sql导入,
然后再设置外键约束:
SET FOREIGN_KEY_CHECKS=1;
  1. MySql 5.7+ 版本使用 Group By 出现错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"code": "ER_WRONG_FIELD_WITH_GROUP",
"errno": 1055,
"sqlState": "42000",
"sqlMessage": "Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'wxmall.order.orderId' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with 'sql_mode=only_full_group_by'"
**-**
only_full_group_by :使用这个就是使用和oracle一样的group 规则, select的列都要在group中,或者本身是聚合列(SUM,AVG,MAX,MIN) 才行,其实这个配置目前感觉和distinct差不多的,所以去掉就好
-- 解决方案:
(1)添加聚合函数;
(2)修改全局配置
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
  1. MySql 使用 DELETE 操作表出现错误:
1
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect. 0.000 sec

原因是在safe mode下,要强制安全点,update只能跟where了,
要取消这个限制,可以:

1
2
3
SET SQL_SAFE_UPDATES=0; // 取消安全模式
SET SQL_SAFE_UPDATES=1; // 恢复安全模式


.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
drop database sample;
CREATE DATABASE sample;
use sample;
SET NAMES utf8;
SET FOREIGN_KEY_CHECKS = 0; /* 取消外键约束 */
DROP TABLE IF EXISTS `websites`;
CREATE TABLE `websites` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL DEFAULT '' COMMENT '名称',
`url` varchar(250) NOT NULL DEFAULT '',
`country` char(10) NOT NULL DEFAULT '' COMMENT '国家',
PRIMARY KEY (`id`)
) AUTO_INCREMENT = 6 DEFAULT CHARSET=utf8;
BEGIN;
INSERT INTO `websites` VALUES
('1', 'Google', 'https://www.google.cm/', 'USA'),
('2', '淘宝', 'https://www.taobao.com/', 'CN'),
('3', '菜鸟教程', 'http://www.runoob.com/', 'CN'),
('4', '微博', 'http://weibo.com/', 'CN'),
('5', 'Facebook', 'https://www.facebook.com/', 'USA');
COMMIT;
SET FOREIGN_KEY_CHECKS = 1; /* 重新建立外键约束 */