C基础 mariadb处理的简单实例

C基础 mariadb处理的简单实例,第1张

概述引言MariaDB是一款灰常不错开源数据库.这里直接用它来解决业务问题.业务需求:

引言

MariaDB 是一款灰常不错开源数据库. 这里直接用它来解决业务问题.

业务需求:

现在数据库中表示按照天分表的. 突然我们需要按照月来处理数据.

例如输入一个玩家ID,查找这个玩家这个月内看了一件事几次. 我们先搭建一个环境.

*** 作系统:

linux version 4.4.0-22-generic (buildd@lgw01-41)(gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2) ) #40-Ubuntu SMP Thu May 12 22:03:46 UTC 2016@H_403_27@

首先安装 MariaDB数据库

sudo apt-get install mariadb-serversudo apt-get install mariadb-clIEntsudo apt-get install libmariadb2sudo apt-get install libmariadb-clIEnt-lgpl-devsudo apt-get install libreoffice-mysql-connector@H_403_27@

后面是C访问 MariaDB驱动. 这里扯一点,目前关于MariaDB不懂问题,搜不见直接当成MysqL开始搜.

MariaDB安装成功后默认是开启的,看下面图描述

后面搭建测试环境 首先 看 oss_musicelves.sql

-- MysqL dump 10.10---- Host: localhost  Database: oss_log-- -------------------------------------------------------- Server version  5.5.24-tMysqL-1.4/*!40101 SET @olD_CHaraCTER_SET_CLIENT=@@CHaraCTER_SET_CLIENT */;/*!40101 SET @olD_CHaraCTER_SET_RESulTS=@@CHaraCTER_SET_RESulTS */;/*!40101 SET @olD_ColLATION_CONNECTION=@@ColLATION_CONNECTION */;/*!40101 SET nameS utf8 */;/*!40103 SET @olD_TIME_ZONE=@@TIME_ZONE */;/*!40103 SET TIME_ZONE='+00:00' */;/*!40014 SET @olD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0 */;/*!40014 SET @olD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0 */;/*!40101 SET @olD_sql_mode=@@sql_mode,sql_mode='NO_auto_VALUE_ON_ZERO' */;/*!40111 SET @olD_sql_NOTES=@@sql_NOTES,sql_NOTES=0 */;---- table structure for table `oss_musicelves`--DROP table IF EXISTS `oss_musicelves`;CREATE table `oss_musicelves` ( `record_ID` bigint(20) NOT NulL auto_INCREMENT,`account_ID` bigint(20) NOT NulL,`server_ID` int(11) NOT NulL,`char_ID` bigint(20) NOT NulL,`char_sex` int(11) NOT NulL,`type_ID` int(11) NOT NulL,`timeStamp` datetime NOT NulL DEFAulT '0000-00-00 00:00:00',`ptype` int(11) NOT NulL,`specifytype` int(11) NOT NulL,`childtype` int(11) NOT NulL,PRIMARY KEY (`record_ID`),KEY `IDx_specifytype` (`specifytype`)) ENGINE=InnoDB auto_INCREMENT=32 DEFAulT CHARSET=latin1;---- DumPing data for table `oss_musicelves`--/*!40000 ALTER table `oss_musicelves` disABLE KEYS */;LOCK tableS `oss_musicelves` WRITE;INSERT INTO `oss_musicelves` VALUES (1,411948833,84869352,27899597414400801,1812,'2016-05-31 14:27:41',1,1),(2,1344702709,90964200,30422720614402293,'2016-05-31 14:58:26',(3,706409913,30422720614401465,'2016-05-31 14:58:27',2),(4,392964857,'2016-05-31 14:58:59',2,4),(5,(6,'2016-05-31 15:04:52',(7,'2016-05-31 15:05:54',(8,(9,'2016-05-31 15:10:29',(10,'2016-05-31 15:10:32',(11,'2016-05-31 15:10:54',(12,3145910262,29520779366416374,'2016-05-31 15:30:00',(13,1372825842,30173879500803314,'2016-05-31 15:30:01',(14,'2016-05-31 15:30:04',(15,(16,'2016-05-31 15:34:24',(17,(18,'2016-05-31 15:40:14',(19,'2016-05-31 15:40:16',(20,'2016-05-31 15:42:19',(21,(22,1027763684,30175730790400484,'2016-05-31 16:56:33',(23,'2016-05-31 16:56:50',(24,'2016-05-31 16:57:37',3),(25,(26,'2016-05-31 17:04:33',(27,(28,'2016-05-31 17:14:15',(29,'2016-05-31 17:14:50',(30,(31,751699770,30175199027201850,'2016-05-31 18:14:59',1);UNLOCK tableS;/*!40000 ALTER table `oss_musicelves` ENABLE KEYS */;/*!40103 SET TIME_ZONE=@olD_TIME_ZONE */;/*!40101 SET sql_mode=@olD_sql_mode */;/*!40014 SET FOREIGN_KEY_CHECKS=@olD_FOREIGN_KEY_CHECKS */;/*!40014 SET UNIQUE_CHECKS=@olD_UNIQUE_CHECKS */;/*!40101 SET CHaraCTER_SET_CLIENT=@olD_CHaraCTER_SET_CLIENT */;/*!40101 SET CHaraCTER_SET_RESulTS=@olD_CHaraCTER_SET_RESulTS */;/*!40101 SET ColLATION_CONNECTION=@olD_ColLATION_CONNECTION */;/*!40111 SET sql_NOTES=@olD_sql_NOTES */;@H_403_27@

这个 oss_musicelves.sql 文件主要功能是创建 oss_musicelves数据库,并填充数据.

还有一个 搭建环境 的 脚本 mariadb_test.sql 和上一个sql文件放在同一个目录下

# 创建一个测试数据库create database oss_log;# 进入oss_log 数据库use oss_log;# 创建 oss_musicelves 数据库,并导入数据source oss_musicelves.sql;# 批量创建表和数据create table 2016_6_1_oss_musicelves select * from oss_musicelves;create table 2016_6_2_oss_musicelves select * from oss_musicelves;create table 2016_6_3_oss_musicelves select * from oss_musicelves;create table 2016_6_4_oss_musicelves select * from oss_musicelves;create table 2016_6_5_oss_musicelves select * from oss_musicelves;create table 2016_6_9_oss_musicelves select * from oss_musicelves;create table 2016_6_10_oss_musicelves select * from oss_musicelves;create table 2016_6_12_oss_musicelves select * from oss_musicelves;# 查询表是否创建成功show tables;# 这里处理 拿到的数据select distinct table_name from information_schema.columns where table_name like '2016_6_%_oss_musicelves';@H_403_27@

直接放在 MariaDB控制台中直接刷进去. 搭建的具体环境如下

到这里环境基本搭建好了. MariaDB入门等等,完全可以当做MysqL 学习温故一遍.

前言

上面问题就是 原本 是 select * from oss_musicelves; 就可以解决的问题.

这里 需要 输入年和月 外加一些特殊条件 . select * from %_%_%_oss_musicelves; 解决. 单纯用sql脚本也可以解决.非常复杂.用的不熟.

这里首先通过 shell 脚本处理

touch getmouths.shchmod +x getmouths.shvi getmouths.sh@H_403_27@

 具体的脚本 内容 如下

#!/bin/sh#得到输入的玩家ptIDif [ $# -lt 1 ]then  echo "uage: $0 [ptID]"  exit -1fiptID=$1mouth=$(date +%m | sed s'/^0//')#第一个参数是月份if [ $# -ge 2 ]then  mouth=$2fi#第二个参数是年year=$(date +%Y)if [ $# -ge 3 ]then  year=$3fi#得到查询的随机表名tbname="\"${year}_${mouth}_%_oss_musicelves\""#这里得到MysqL 中所有合法表名rm -rf __tmptouch __tmp#开始查询数据库了,需要以root权限启动这个脚本MysqL -e "select distinct table_name from information_schema.columns where table_name like $tbname" | awk 'NR>1' | while read namedo  MysqL -e "select count(*) from oss_log.$name where specifytype = 1 and char_ID = $ptID" | awk 'NR>1' | while read cut  do    echo "$name : $cut"    echo $cut >> __tmp    break  donedone#统计表里面的数据sum=$(cat __tmp | awk '{s+=$1} END {print s}')rm -rf __tmp# 最后输出统计结果echo "$year-$mouth sum: $sum"@H_403_27@

使用脚本  截图

通过shell可以完成 我们的需求. linux上shell真好用. window的bat不好用.

正文

第一部分 : 让C调用MariaDB跑通

先看 测试Demo mariadb_demo.c

#include <stdio.h>#include <stdlib.h>#include <MysqL.h>/* * 第一个 mariadb程序 */int main(int argc,char *argv[]) {  // 创建数据连接对象  MysqL *con = MysqL_init(NulL);   if (con == NulL) {    fprintf(stderr,"%s\n",MysqL_error(con));    exit(EXIT_FAILURE);   }   if (!MysqL_real_connect(con,"localhost","root","",NulL,0)) {    fprintf(stderr,MysqL_error(con));     MysqL_close(con);     exit(EXIT_FAILURE);   }    if (MysqL_query(con,"show databases;")) {    fprintf(stderr,MysqL_error(con));    MysqL_close(con);    exit(EXIT_FAILURE);   }  puts("mariadb is connect and run succesed!");  MysqL_close(con);    return 0;}@H_403_27@

具体的编译 命令

su rootgcc -Wall -ggdb2 -I/usr/include/mariadb -o mariadb_demo.out mariadb_demo.c -lMysqLclIEnt./mariadb_demo.out @H_403_27@

运行结果 如下 

到这里基本C 调用 MariaDB 基本流程跑通了. 但是很不爽. 只能通过root用户使用.

那我们改变这里不爽. 进入第二部分. 扩展资料  c in mariadb  http://stackoverflow.com/questions/17265471/using-mariadb-in-c

第二部分 : 通过普通用户完成业务需求.

先创建普通用户 csz,密码是 1413222,并并且给其 select 读权限

su rootMysqLdrop user csz;create user 'csz'@'%' IDentifIEd by '13142222';grant select on *.* to 'csz'@'%';# 立即刷新flush privileges;@H_403_27@

后面登录试试

MysqL -ucsz -p1314222 -h127.0.0.1

 

 主要是mariadb默认关闭远程访问. 后面我们开启安全访问模式试试

su root/etc/init.d/MysqL stopMysqLd_safe --skip-grant-tables@H_403_27@

 

后面再开启一个会话 . 重新输入 MysqL -ucsz -p1314222 -h127.0.0.1,解决可以了
 

#目标拼接 串内容select sum(c) from (select count(*) as c from 2016_6_1_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_2_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_3_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_4_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_5_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_9_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_10_oss_musicelves where specifytype=1 and char_ID = 30422720614402293union allselect count(*) from 2016_6_12_oss_musicelves where specifytype=1 and char_ID = 30422720614402293) as t;@H_403_27@

具体看 getmouths.c 文件 内容

#include <stdio.h>#include <stdlib.h>#include <time.h>#include <MysqL.h>#define _INT_BUF (4098)// 得到查询数据表内容#define _STR_sqltableS \  "select distinct table_name from information_schema.columns where table_name like '%d_%d_%%_oss_musicelves'"#define _STR_sqlSELECT \  "select count(*) as c from %s where specifytype=1 and char_ID = %lld"// 基础的mariadb 错误关闭函数static inline voID _err_mariadb(MysqL *con) {  fprintf(stderr,"_err_mariadb error: %s\n",MysqL_error(con));  MysqL_close(con);  exit(EXIT_FAILURE);}/* * 处理 oss_musicelves 一个月的所有表. */int main(int argc,char* argv[]) {  long long ptID;  time_t rt = time(NulL);  struct tm *pt = localtime(&rt);  int year = pt->tm_year + 1900;  int mouth = pt->tm_mon + 1;    // 先简单检测输入  if(argc <= 1) {    fprintf(stderr,"%s [ptID] [mouth] [year]\n",argv[0]);    exit(EXIT_FAILURE);  }    // 先得到 ptID 数据  ptID = atoll(argv[1]);    // 得到当前月份  if(argc >= 3)    mouth = atoi(argv[2]);  // 得到当前年份  if(argc >= 4)    year = atoi(argv[3]);  // 简单检测结果是否合法  if(ptID < 0 || mouth <=0 || mouth>12 || year<1900) {    fprintf(stderr,"%s %lld %d %d is error!\n",argv[0],ptID,mouth,year);    exit(EXIT_FAILURE);  }   // 输出结果  printf("%s %lld %d %d start run!\n",year);  // 开始用MysqL 访问我们需要访问的数据结果了  MysqL *con = MysqL_init(NulL);  if(con == NulL) {   fprintf(stderr,"MysqL_init error: %s\n",MysqL_error(con));   exit(EXIT_FAILURE);   }   if(!MysqL_real_connect(con,"127.0.0.1","csz","1314222","oss_log",0))    _err_mariadb(con);    char sqls[_INT_BUF];  int sqlen = 0;  sprintf(sqls,_STR_sqltableS,year,mouth);  if(MysqL_query(con,sqls))    _err_mariadb(con);    // 开始得到结果  MysqL_RES *ret = MysqL_store_result(con);  if(NulL == ret)    _err_mariadb(con);  MysqL_ROW row;  int i = 0,nr = 0;  while(!!(row = MysqL_fetch_row(ret))) {      if(i == 0) {      sqlen = sprintf(sqls,"select sum(c) from (\n" _STR_sqlSELECT,row[0],ptID);      i = 1;      continue;    }        // 后面正常拼接    nr = sprintf(sqls + sqlen,"\nunion all\n" _STR_sqlSELECT,ptID);    if((sqlen += nr) >= _INT_BUF) {      fprintf(stderr,"sprintf while %d too length.\n",sqlen);      goto __return_free;    }  }  if(i == 0)   {    printf("sum %lld %d/%d: 0\n",mouth);    goto __return_free;  }    // 这里处理有的数据  nr = sprintf(sqls + sqlen,"\n) as t;");    if((sqlen += nr) >= _INT_BUF) {    fprintf(stderr,"sprintf end %d too length.\n",sqlen);    goto __return_free;  }  // 内存用完了就直接释放  MysqL_free_result(ret);  ret = NulL;    printf("sql : \n\t%s\n",sqls);  // 开始输出统计结果  if(MysqL_query(con,sqls))    _err_mariadb(con);  if((ret = MysqL_store_result(con))==NulL)    _err_mariadb(con);  //得到结果直接返回  if(!!(row=MysqL_fetch_row(ret)))    printf("sum %lld %d/%d: %s\n",row[0]);  else    puts("select is empty!");    __return_free:  // 释放用过的内存  MysqL_free_result(ret);  // 关闭打开的 数据库访问对象   MysqL_close(con);  return 0;}@H_403_27@

编译命令

gcc -Wall -ggdb2 -I/usr/include/mariadb -o getmouths.out getmouths.c -lMysqLclIEnt

最终运行结果是

如果想详细了解关于mariadb c驱动的API使用,可以参照老外写的很好理解.

 MysqLc demo http://zetcode.com/db/MysqLc/

到这里就结束了,关于C 访问数据库能力也基本打通了.

后记

错误是难免,欢迎学习进步~~~   未来什么都不确定,可以确定是没有未来,只有现在还在装逼 . 

以上这篇C基础 mariadb处理的简单实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

总结

以上是内存溢出为你收集整理的C基础 mariadb处理的简单实例全部内容,希望文章能够帮你解决C基础 mariadb处理的简单实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1246797.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存