LINUX 入门 5.1

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,创建用户可以,使用完扔了

成功了然后双击就连上了

mysql 复制代码
show databases;

点黄色小闪电第三个图标

mysql 复制代码
use mysql;
show tables;
select * from user;

create user 'test'@'%' identified by '123456'; #不行,用admin登录,只有select权限,没有create权限

为admin加操作权限,在xshell里用root登录用root为admin加权限

mysql 复制代码
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连接

    mysql 复制代码
    DROP DATABASE KING_DB;
    CREATE DATABASE KING_DB;
    
    SHOW DATABASES;
    USE KING_DB; #进入数据库服务器

    用大小,表前加TBL_或者TB_

    先主键,选中再闪电,只执行那一段,否则执行所有

    mysql 复制代码
    CREATE TABLE TBL_USER( # 创建user
    U_ID INT PRIMARY KEY AUTO_INCREMENT,
    U_NAME VARCHAR(32),
    U_GENDER VARCHAR(8)
    );
    
    show tables; #显示table

    如果做后台,首先想到数据库建模,再想其它

4 数据库编程连接与插入数据

mysql 复制代码
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里写的

c 复制代码
#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

c 复制代码
#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里加了

c 复制代码
    // 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

    mysql 复制代码
    //安全模式关了
    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调用

    mysql 复制代码
    #存储过程 类似封装成函数 开始结束分隔符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. 代码

    先插再看,再删再看

    c 复制代码
    #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	
相关推荐
KingRumn1 天前
Linux信号之标准信号与实时信号
linux·算法
QT 小鲜肉1 天前
【Linux命令大全】001.文件管理之git命令(实操篇)
linux·服务器·笔记·git·elasticsearch
程序员码歌1 天前
短思考第263天,每天复盘10分钟,胜过盲目努力一整年
android·前端·后端
sishen41991 天前
嵌入式Linux没有学习方向怎么办,嵌入式Linux怎么学
linux
安卓兼职framework应用工程师1 天前
Android 10.0 按键智能机按键连续响两次的异常处理
android·audio·audioservice·按键音·按键声音
逆风水手1 天前
Ansible自动化运维入门指南
linux·运维·自动化·ansible
studyForMokey1 天前
【Android 项目】个人学习demo随笔
android
吃喝不愁霸王餐APP开发者1 天前
利用责任链模式解耦多平台(美团/饿了么)霸王餐接口的适配逻辑
android·责任链模式
百***78751 天前
Step-Audio-2 轻量化接入全流程详解
android·java·gpt·php·llama
旖旎夜光1 天前
Linux(3)(下)
linux·学习