LINUX 入门 5.1
day8 20240503
课程链接地址
第5章 数据库mysql项目实战
mysql基础
-
第四节:
mysql_init(&mysql) == NULL
失败mysql_real_connect(&mysql, KING_DB_SERVER_IP, KING_DB_USERNAME, KING_DB_PASSWORD, KING_DB_DEFAULTDB, KING_DB_SERVER_PORT, NULL, 0)
空是失败mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))
空是成功mysql_close(&mysql)
-
第5节
1 mysql安装、远程连接、常见问题
数据库在项目开发必须
见SQL教程.pdf
sudo apt-get install mysql-server-5.7 (5.6不行)
mysql -u root -p 以root登入
5.5及以前用的myISAM,以后用的innodb对事务支持更好
use mysql; 分号结束 进数据库
show tables;
组织结构:客户端client-节点服务器node server- 数据库db server, 网络连接
mysql-workbench不用安装,移到目录下——最好不要中文字符,双击mysqlworkbench.exe这个!!!!
报错1
建立连接——输虚拟机IP+ store in vault输入密码,报错不行10061
xshell里
ls /etc/mysql
cd /etc/mysql
sudo vim my.cnf 不对
服务器工作了,不然不会返回error,也不是client问题不然不是server发出的error
我的和老师不一样,我里面什么配置信息都没有
请按ubuntu16.04下安装和删除mysql5.7.docx文档配置
回环地址:机器内部访问可以,外部不行访问不了
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
改bind-address = 127.0.0.1为0.0.0.0 这是个默认的任意地址
sudo /etc/init.d/mysql restart
2 数据库用户授权与登录
报错2
报错变成了not allowed to connect to mysqsl with user root服务器限制root远程登陆,本地root可以
如何让root可以远程登录
mysql -u root -p
密码 x
创建用户命令:create user 'admin'@'%' identified by '123456'; %代表任何都可以
不要乱改root,创建用户可以,使用完扔了
成功了然后双击就连上了
show databases;
点黄色小闪电第三个图标
use mysql;
show tables;
select * from user;create user 'test'@'%' identified by '123456'; #不行,用admin登录,只有select权限,没有create权限
为admin加操作权限,在xshell里用root登录用root为admin加权限
mysql -u root -p
grant select on mysql.* to 'admin'@'%'; #给admin select操作的权限
grant all privileges on *.* to 'admin'@'%'; # *.* 代表所有数据库.所有表可以所有操作!but最好别给这么大的权限
flush privileges; #再看就create还是没有这个权限,其他操作可以
3 数据库建模与建库建表
-
数据库建模:把数据用表格形式存储
在workbench里面双击admin连接
DROP DATABASE KING_DB; CREATE DATABASE KING_DB;SHOW DATABASES; USE KING_DB; #进入数据库服务器
用大小,表前加TBL_或者TB_
先主键,选中再闪电,只执行那一段,否则执行所有
CREATE TABLE TBL_USER( # 创建user U_ID INT PRIMARY KEY AUTO_INCREMENT, U_NAME VARCHAR(32), U_GENDER VARCHAR(8) );show tables; #显示table
如果做后台,首先想到数据库建模,再想其它
4 数据库编程连接与插入数据
show databases; #已经有kingdb了
use KING_DB;
show tables;SELECT * FROM TBL_USER;
INSERT TBL_USER(U_NAME, U_GENDER) VALUES('KING', 'MAN');
通过node server和mysql对database dbserver操作,需要node server有mysql 客户端开发工具
sudo apt-get install libmysqlclient-dev0
下面通过代码实现mysql操作,不通过workbench,vscode里写的
#include<mysql.h>
#include<stdio.h>
#include<string.h>#define KING_DB_SERVER_IP "192.168.243.128"
#define KING_DB_SERVER_PORT 3306
#define KING_DB_PASSWORD "123456"
#define KING_DB_USERNAME "admin"
#define KING_DB_DEFAULTDB "KING_DB"// #define SQL_INSERT_TBL_USER "INSERT TBL_USER(U_NAME, U_GENDER) VALUES('Lee', 'man');"
#define SQL_INSERT_TBL_USER "INSERT TBL_USER(U_NAME, U_GENDER) VALUES('qiuxiang', 'woman');"// C R U D增删改查 create update read delete
int main(){// 1 初始化MYSQL mysql;if(mysql_init(&mysql) == NULL){printf("mysql_init: %s\n", mysql_error(&mysql));return -1;};// 2 node server和db server连接if (!mysql_real_connect(&mysql, KING_DB_SERVER_IP, KING_DB_USERNAME, KING_DB_PASSWORD,\KING_DB_DEFAULTDB, KING_DB_SERVER_PORT, NULL, 0)){printf("mysql_real_connect: %s\n", mysql_error(&mysql));};// mysql->insert 0成功 if(mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))){printf("mysql_real_query: %s\n", mysql_error(&mysql));};mysql_close(&mysql);return 0;
}
linux里一般返回0成功,mysql_real_query 等执行操作0 成功,mysql_real_connect 0失败
-I xxxxxx引入头文件在的位置, -lxxxxxx引入编译用的库 客户端mysql
gcc -o mysql mysql.c -I /usr/include/mysql/ -lmysqlclient
./mysql
此时只选中workbench里的select * from TBL_USER;
看到lee man这一行加进去了
5 数据库查询
上一章是从node server写到db server 这章是从db server读数据
4步: 执行;存储;判断多少行;抓取数据fetch
#define SQL_SELECT_TBL_USER "SELECT * FROM TBL_USER;"int king_mysql_select(MYSQL *handle){// mysql_real_query--> sqlif(mysql_real_query(handle, SQL_SELECT_TBL_USER, strlen(SQL_SELECT_TBL_USER))){printf("mysql_real_query: %s\n", mysql_error(handle));return -1;};// 把管道里的data 存起来storeMYSQL_RES *res = mysql_store_result(handle);if(res ==NULL){printf("mysql_store_result: %s\n", mysql_error(handle));return -2;}// rows行/fields列 判断数据集合里int rows = mysql_num_rows(res);printf("row: %d\n", rows);int fields = mysql_num_fields(res);printf("fields: %d\n", fields);// fetchMYSQL_ROW row; //抓取数据,打印每行每列while(row= mysql_fetch_row(res)){for(int i = 0; i < fields; i ++){printf("%s\t", row[i]);}printf("\n");}mysql_free_result(res); //最后要释放,不释放会咋样return 0;}
main里加了
// mysql->insert 0成功 king_mysql_select(&mysql);
// 编译器编译忽略,执行才直接
#if 0if(mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))){printf("mysql_real_query: %s\n", mysql_error(&mysql));};
#endifmysql_close(&mysql);return 0;
}
可以不在xshell里,直接在vscode里操作!!
6 数据删除与存储过程调用
-
workbench
delete FROM TBL_USER WHERE U_NAME = "KING";
单独选中以后报错: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.
因为可能多条数据同时删除,不是安全模式,按主键删除模式,5.6版以后按where U_ID来删 而不是where u_name
//安全模式关了 set SQL_SAFE_UPDATES = 0; # 大写,小写都行 delete FROM TBL_USER WHERE U_NAME = "KING"; set sql_safe_updates= 1;
然后再看 select * from TBL_USER; king全被删了
但是这样调三次mysql_query 不建议,所以封装打包
存储过程:就是把删除封装成函数,然后call调用
#存储过程 类似封装成函数 开始结束分隔符delimiter都行,不一定@ DELIMITER @@ CREATE PROCEDURE PROC_DELETE_USER(in UNAME VARCHAR(32)) BEGIN set SQL_SAFE_UPDATES = 0; # 大写,小写都行 delete FROM TBL_USER WHERE U_NAME = UNAME; set sql_safe_updates= 1; END@@CALL PROC_DELETE_USER('Lee'); select * from TBL_USER;
-
代码
先插再看,再删再看
#define SQL_INSERT_TBL_USER "INSERT TBL_USER(U_NAME, U_GENDER) VALUES('King', 'man');"#define SQL_DELETE_TBL_USER "CALL PROC_DELETE_USER('King')"main函数这里改// mysql->insert 0成功 // 编译器编译忽略,执行才直接printf("case : mysql--->insert\n"); #if 1if(mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))){printf("mysql_real_query: %s\n", mysql_error(&mysql));}; #endifking_mysql_select(&mysql); //添加以后查询// mysql->deleteprintf("case : mysql--->delete\n"); #if 1if(mysql_real_query(&mysql, SQL_DELETE_TBL_USER, strlen(SQL_DELETE_TBL_USER))){printf("mysql_real_query: %s\n", mysql_error(&mysql));}; #endifking_mysql_select(&mysql); //删除以后查询
编译
gcc -o mysql mysql.c -I /usr/include/mysql/ -lmysqlclient ./mysql
输出
row: 6 fields: 3 8 qiuxiang woman 9 qiuxiang woman 11 qiuxiang woman 12 qiuxiang woman 13 qiuxiang woman 14 King man row: 5 fields: 3 8 qiuxiang woman 9 qiuxiang woman 11 qiuxiang woman 12 qiuxiang woman 13 qiuxiang woman