mariadb使用C语言编程,C基础 mariadb处理的简单实例

2023-05-16

引言

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

首先安装 MariaDB数据库

sudo apt-get install mariadb-server

sudo apt-get install mariadb-client

sudo apt-get install libmariadb2

sudo apt-get install libmariadb-client-lgpl-dev

sudo apt-get install libreoffice-mysql-connector

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

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

d110599ac943c3cda7f1fbec11ae2bf8.png

后面搭建测试环境 首先 看 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,0,1812,'2016-05-31 14:27:41',0,1,1),(2,1344702709,90964200,30422720614402293,0,1812,'2016-05-31 14:58:26',0,1,1),(3,706409913,90964200,30422720614401465,1,1812,'2016-05-31 14:58:27',0,1,2),(4,706409913,392964857,30422720614401465,1,1812,'2016-05-31 14:58:59',0,2,4),(5,1344702709,392964857,30422720614402293,0,1812,'2016-05-31 14:58:59',0,2,4),(6,706409913,90964200,30422720614401465,1,1812,'2016-05-31 15:04:52',0,1,2),(7,706409913,392964857,30422720614401465,1,1812,'2016-05-31 15:05:54',0,2,4),(8,1344702709,392964857,30422720614402293,0,1812,'2016-05-31 15:05:54',0,2,4),(9,1344702709,90964200,30422720614402293,0,1812,'2016-05-31 15:10:29',0,1,1),(10,706409913,90964200,30422720614401465,1,1812,'2016-05-31 15:10:32',0,1,2),(11,1344702709,392964857,30422720614402293,0,1812,'2016-05-31 15:10:54',0,2,4),(12,3145910262,90964200,29520779366416374,1,1812,'2016-05-31 15:30:00',0,1,1),(13,1372825842,90964200,30173879500803314,1,1812,'2016-05-31 15:30:01',0,1,2),(14,3145910262,392964857,29520779366416374,1,1812,'2016-05-31 15:30:04',0,2,4),(15,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 15:30:04',0,2,4),(16,3145910262,392964857,29520779366416374,1,1812,'2016-05-31 15:34:24',0,2,4),(17,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 15:34:24',0,2,4),(18,706409913,90964200,30422720614401465,1,1812,'2016-05-31 15:40:14',0,1,1),(19,1344702709,90964200,30422720614402293,0,1812,'2016-05-31 15:40:16',0,1,2),(20,3145910262,392964857,29520779366416374,1,1812,'2016-05-31 15:42:19',0,2,4),(21,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 15:42:19',0,2,4),(22,1027763684,90964200,30175730790400484,0,1812,'2016-05-31 16:56:33',1,1,1),(23,1372825842,90964200,30173879500803314,1,1812,'2016-05-31 16:56:50',0,1,2),(24,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 16:57:37',0,2,3),(25,1027763684,392964857,30175730790400484,0,1812,'2016-05-31 16:57:37',1,2,3),(26,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 17:04:33',0,2,3),(27,1027763684,392964857,30175730790400484,0,1812,'2016-05-31 17:04:33',1,2,3),(28,1027763684,90964200,30175730790400484,0,1812,'2016-05-31 17:14:15',1,1,2),(29,1372825842,392964857,30173879500803314,1,1812,'2016-05-31 17:14:50',0,2,3),(30,1027763684,392964857,30175730790400484,0,1812,'2016-05-31 17:14:50',1,2,3),(31,751699770,90964200,30175199027201850,1,1812,'2016-05-31 18:14:59',1,1,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 */;

这个 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';

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

462046e0bd5b9e30cadd72b8d21029cb.png

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

前言

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

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

这里首先通过 shell 脚本处理

touch getmouths.sh

chmod +x getmouths.sh

vi getmouths.sh

具体的脚本 内容 如下

#!/bin/sh

#得到输入的玩家ptid

if [ $# -lt 1 ]

then

echo "uage: $0 [ptid]"

exit -1

fi

ptid=$1

mouth=$(date +%m | sed s'/^0//')

#第一个参数是月份

if [ $# -ge 2 ]

then

mouth=$2

fi

#第二个参数是年

year=$(date +%Y)

if [ $# -ge 3 ]

then

year=$3

fi

#得到查询的随机表名

tbname="\"${year}_${mouth}_%_oss_musicelves\""

#这里得到mysql 中所有合法表名

rm -rf __tmp

touch __tmp

#开始查询数据库了, 需要以root权限启动这个脚本

mysql -e "select distinct table_name from information_schema.columns where table_name like $tbname" | awk 'NR>1' | while read name

do

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

done

done

#统计表里面的数据

sum=$(cat __tmp | awk '{s+=$1} END {print s}')

rm -rf __tmp

# 最后输出统计结果

echo "$year-$mouth sum: $sum"

使用脚本  截图

e49a04bcc9f9aef921d61bea86da1738.png

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

正文

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

先看 测试Demo mariadb_demo.c

#include

#include

#include

/*

* 第一个 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, NULL, 0)) {

fprintf(stderr, "%s\n", mysql_error(con));

mysql_close(con);

exit(EXIT_FAILURE);

}

if (mysql_query(con, "show databases;")) {

fprintf(stderr, "%s\n", mysql_error(con));

mysql_close(con);

exit(EXIT_FAILURE);

}

puts("mariadb is connect and run succesed!");

mysql_close(con);

return 0;

}

具体的编译 命令

su root

gcc -Wall -ggdb2 -I/usr/include/mariadb -o mariadb_demo.out mariadb_demo.c -lmysqlclient

./mariadb_demo.out

运行结果 如下

cc73f31c1723a06e05d0c3fda299e74a.png

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

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

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

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

su root

mysql

drop user csz;

create user 'csz'@'%' identified by '13142222';

grant select on *.* to 'csz'@'%';

# 立即刷新

flush privileges;

后面登录试试

mysql -ucsz -p1314222 -h127.0.0.1

e2356d24da6e1bd1fd7fb153954bb05d.png

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

suroot/etc/init.d/mysql stopmysqld_safe--skip-grant-tables

fa4b787e0b4c267438804b63615e7703.png

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

85c6fe1ad9a4b59b688e7c6e8869a0a1.png

#目标拼接 串内容

select sum(c) from (

select count(*) as c from 2016_6_1_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_2_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_3_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_4_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_5_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_9_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_10_oss_musicelves where specifytype=1 and char_id = 30422720614402293

union all

select count(*) from 2016_6_12_oss_musicelves where specifytype=1 and char_id = 30422720614402293

) as t;

具体看 getmouths.c 文件 内容

#include

#include

#include

#include

#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", argv[0], ptid, mouth, 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, NULL, 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, row[0], 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", ptid, year, 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", ptid, year, mouth, row[0]);

else

puts("select is empty!");

__return_free:

// 释放用过的内存

mysql_free_result(ret);

// 关闭打开的 数据库访问对象

mysql_close(con);

return 0;

}

编译命令

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

最终运行结果是

171d929840131a6f03895036b45053d7.png

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

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

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

后记

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mariadb使用C语言编程,C基础 mariadb处理的简单实例 的相关文章

  • VNCServer卡死处理办法

    通过VNC连接远程Linux服务器 xff0c 一段时间后 xff0c 远程界面卡死 xff0c 不能操作 解决办法 xff1a 重启vncserver服务 通过终端远程ssh到服务器 1 xff09 查看vncserver命令用法 xff
  • Lottie进阶和原理分析

    简介 Lottie是aribnb发布的开源库 xff0c 它可以将AE制作的动画在Android iOS和RN代码中渲染出来 Lottie的功能及其强大 xff0c 只需要设计师使用AE设计动画 xff0c 用bodymovin导出 xff
  • 前端都应该了解的 NodeJs 知识及原理浅析

    node js 初探 Node js 是一个 JS 的服务端运行环境 xff0c 简单的来说 xff0c 它是在 JS 语言规范的基础上 xff0c 封装了一些服务端的运行时对象 xff0c 让我们能够简单实现非常多的业务功能 如果我们只使
  • 网站安全检测被 提示该网站内容被禁止访问

    很多建站公司都在使用Kindeditor开源的图片上传系统 xff0c 该上传系统是可视化的 xff0c 采用的开发语言支持asp aspx php jsp 几乎支持了所有的网站可以使用他们的上传系统 xff0c 对浏览器的兼容以及手机端也
  • 10个经典程序员代码技能,学会一个就能月薪上万!

    今天小编我给大家整理了一份10个程序员常用的代码简写技术 xff0c 看懂一种是入门 xff0c 全懂就是大神 xff0c 你能知道几个呢 xff1f 这篇文章分享之前我还是要推荐下我自己的前端群 xff1a 733581373 xff0c
  • android 9.0 中关于OTA 升级的注意事项

    droid 分区查看 emcc 7 x 8 x 一 要确定有多少个分区 xff1f 详细解析 xff1a major 表示主设备号 minor 表示次设备号 blocks 表示的是block的数目 name 是指的设备名称 例如 xff1a
  • ubuntu设置虚拟显示器且远程连接

    版本 ubuntu 20 04 安装虚拟显示器 sudo apt install xserver xorg core hwe 18 04 sudo apt install xserver xorg video dummy hwe 18 04
  • FFmpeg视频解码流程详解及demo

    本文主要讲解FFmpeg的视频解码具体流程 xff0c API使用 xff0c 以及相关结构体介绍 最后再以一个非常简单的demo演示将一个mp4格式的视频文件解码为原始数据yuv文件 FFmpeg解码流程有2套API接口 xff0c 本文
  • crontab执行jar包时,Could not find or load main class(找不到或者加载不到主类)

    crontab执行jar包时 xff0c Could not find or load main class 找不到或者加载不到主类 在linux服务器上配置crontab时 xff0c 子账户执行不报错 xff0c 但是切到root账户
  • 检测Android模拟器

    package com lisn check emulator lib import java io BufferedInputStream import java io BufferedOutputStream import java i
  • 两年工作经验程序员的迷茫

    每个人都有每个人的经历 xff0c 每个程序员也有每个程序员的经历 上大学时 xff0c 读的是计算机专业 大一时 xff0c 开始学习office软件 xff0c 之后接触第一种计算机语言C语言 特别是C语言课时 xff0c 其实上课有很
  • vue 代码格式解析(初学者必备)

    这里写自定义目录标题 Vue单页面与多页面的区别定义 vue普遍代码格式 xff08 ts页面除外 xff09 vue文件就是一个 xff08 或局部 xff09 组件 xff0c 又或者说是一个对象在导出时 template组件scrip
  • 学习go语言笔记

    1 跨平台 有垃圾回收机制 xff1b 2 支持Unicode 字符集 xff08 符号集 xff09 以及utf 8 编解码 xff08 存储格式 xff09 xff0c Go语言源文件总是用UTF8编码 xff1b 3 默认使用了静态编
  • Linux安装docker

    参考链接 xff1a Install Docker Engine on CentOS Docker Documentation 在 Set up the repository 步骤 xff0c 改为阿里云镜像地址 xff1a sudo yu
  • Rust 学习笔记

    1 rust的 amp 是指针 xff0c c 43 43 的 amp 是别名 xff1b
  • map 自定义结构体当键值

    使用自定义结构体当map的键值 xff0c 需要实现比较函数 如 xff1a bool operator lt const T amp t1 const T amp t2 这里需要注意的是 xff0c 比较函数是固定的 xff0c 不能动态
  • tcpdump 过滤Tcpv6数据包

    tcpdump ip6 proto 6
  • VLAN帧结构

    http blog 51cto com wushank 1132145
  • linux下载并安装rpm包

    公司电脑处于内网环境 xff0c 无法连接外网 xff0c 也就无法使用yum 有时候安装软件真的是伤身呀 xff0c 因为要解决很多依赖 经过过年的摸索 xff0c 慢慢地知道了该如何安装软件了 该教程教你如何在linux上使用rpm包方
  • VMware 只能打开一个.vmx,无法打开第二个

    关闭VMs xff0c 方法 xff1a 编辑 gt 首选项 gt 共享虚拟机 gt 更改设置 gt 禁用共享 xff0c 即可正常打开虚拟机

随机推荐