LINUX 入门 5.1

ops/2024/11/9 5:45:57/

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--> 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 数据删除与存储过程调用

  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 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	
    

http://www.ppmy.cn/ops/37608.html

相关文章

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

Python项目开发实战:万年历小程序(案例教程)

一、项目概述 万年历小程序是一个基于Python语言开发的实用工具,它可以帮助用户快速查询任意日期的公历、农历、节气、节日等信息。本项目旨在通过实战的方式,深入了解Python语言在GUI(图形用户界面)编程、日期处理以及数据检索等方面的应用。 二、需求分析 1.用户交互:程…

基于Springboot+Vue的Java项目-旅游网站系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

K8S快速入门

K8S快速入门 在学习k8s的过程&#xff0c;虽然官网给出的示例教程很简单&#xff0c;但是由于网络和环境的差异&#xff0c;导致实际操作的时候踩了很多坑&#xff0c;下面记录一下自己的操作步骤&#xff0c;方便需要的人参考&#xff0c;也方便以后的自己。 参考官网的资料…

香港理工大学内地事务总监陆海天教授确认出席“边缘智能2024 - AI开发者峰会”并发表主题演讲

隨著AI技術的日新月異&#xff0c;我們正步入一個邊緣計算智能化與分布式AI相互融合的新紀元。這一變革不僅推動了分布式智能創新應用的飛速發展&#xff0c;還使得邊緣智能——這一結合邊緣計算和智能技術的新興領域&#xff0c;逐漸成為引領AI發展的重要力量。通過其分布式和…

欧鹏RHCE 第五次作业

unit5.DNS域名解析服务的部署及优化方案 1. (问答题) 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org ip地址&#xff1a; 172.25.254.100 配置好软件仓库 b&#xff09;服务器2&#xff1a; 主机名&…

工单管理系统解决方案(2024Word原件)

工单管理系统解决方案 1、工单创建&#xff1a;根据告警信息创建工单。 2、工单管理&#xff1a;列表形式展示所有工单信息及进度状态。 3、工单处理&#xff1a;对接收的工单进行处理反馈。 4、工单催办&#xff1a;根据工单时效自动发送工单催办消息通知。 5、工单归档&#…

Mybatis 源码分析

《黑马架构师_源码系列-主流框架&中间件》-- MyBatis &#xff08;讲师&#xff1a;子慕&#xff09; * 手写持久层框架-仿写mybatis * Mybatis架构设计&主要组件 * Mybatis如何完成的初始化? * Mybatis如何完成的sql解析及执行? * Mybatis如何设置的参数? * Mybat…