LINUX 入门 5.1

发布于:2024-05-09 ⋅ 阅读:(27) ⋅ 点赞:(0)

LINUX 入门 5.1

day8 20240503

课程链接地址

第5章 数据库mysql项目实战

mysql基础

  1. 第四节:

    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)

  2. 第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 数据库建模与建库建表

  1. 数据库建模:把数据用表格形式存储

    在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--> sql
    if(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 存起来store
    MYSQL_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);


    // fetch
    MYSQL_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 0
    if(mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))){
        printf("mysql_real_query: %s\n", mysql_error(&mysql));
    };
#endif
    
    mysql_close(&mysql);
    return 0;
}

可以不在xshell里,直接在vscode里操作!!

6 数据删除与存储过程调用

  1. 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;
    
  2. 代码

    先插再看,再删再看

    #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 1
        if(mysql_real_query(&mysql, SQL_INSERT_TBL_USER, strlen(SQL_INSERT_TBL_USER))){
            printf("mysql_real_query: %s\n", mysql_error(&mysql));
        };
    #endif
        king_mysql_select(&mysql); //添加以后查询
    
        // mysql->delete
        printf("case : mysql--->delete\n");
    #if 1
        if(mysql_real_query(&mysql, SQL_DELETE_TBL_USER, strlen(SQL_DELETE_TBL_USER))){
            printf("mysql_real_query: %s\n", mysql_error(&mysql));
        };
    #endif
        king_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