亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C基礎 mariadb處理的簡單實例

2020-01-26 14:33:32
字體:
來源:轉載
供稿:網友

引言

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-serversudo apt-get install mariadb-clientsudo apt-get install libmariadb2sudo apt-get install libmariadb-client-lgpl-devsudo apt-get install libreoffice-mysql-connector

后面是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,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控制臺中直接刷進去. 搭建的具體環境如下

到這里環境基本搭建好了. MariaDB入門等等, 完全可以當做mysql 學習溫故一遍.

前言

上面問題就是 原本 是 select * from oss_musicelves; 就可以解決的問題.

這里 需要 輸入年和月 外加一些特殊條件 . select * from %_%_%_oss_musicelves; 解決. 單純用sql腳本也可以解決.非常復雜.用的不熟.

這里首先通過 shell 腳本處理

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

 具體的腳本 內容 如下

#!/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"

使用腳本  截圖

通過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, 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 rootgcc -Wall -ggdb2 -I/usr/include/mariadb -o mariadb_demo.out mariadb_demo.c -lmysqlclient./mariadb_demo.out 

運行結果 如下 

到這里基本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;

后面登錄試試

mysql -ucsz -p1314222 -h127.0.0.1

 

 主要是mariadb默認關閉遠程訪問. 后面我們開啟安全訪問模式試試

su root/etc/init.d/mysql stopmysqld_safe --skip-grant-tables

 

后面再開啟一個會話 . 重新輸入 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;

具體看 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"http:// 基礎的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

最終運行結果是

如果想詳細了解關于mariadb c驅動的api使用, 可以參照老外寫的很好理解.

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

到這里就結束了, 關于C 訪問數據庫能力也基本打通了.

后記

錯誤是難免, 歡迎學習進步~~~   未來什么都不確定, 可以確定是沒有未來, 只有現在還在裝逼 . 

以上這篇C基礎 mariadb處理的簡單實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲毛片在线看| 亚洲图片在区色| …久久精品99久久香蕉国产| 欧美成人免费在线视频| 国产主播欧美精品| 欧美一区深夜视频| 欧美电影在线免费观看网站| 亚洲视频在线观看视频| 久久精品视频一| 色爱精品视频一区| 国产第一区电影| 久久精品一本久久99精品| 欧美视频二区36p| 亚洲精品国产精品自产a区红杏吧| 国产精品丝袜一区二区三区| 日韩在线视频国产| 91av在线播放视频| 精品国产一区二区在线| 国产一区二区三区久久精品| 欧美日韩在线看| 黄色成人av在线| 欧美亚洲另类制服自拍| 人人做人人澡人人爽欧美| 色综合视频一区中文字幕| 欧美亚州一区二区三区| 色婷婷av一区二区三区久久| 国产精品视频公开费视频| 亚洲精品国偷自产在线99热| 日韩电视剧在线观看免费网站| 538国产精品一区二区在线| 一区二区亚洲欧洲国产日韩| 高清一区二区三区日本久| 日韩中文字幕国产精品| 91九色国产社区在线观看| 亚洲韩国青草视频| 日韩欧亚中文在线| 亚洲jizzjizz日本少妇| 最近2019年好看中文字幕视频| 欧美剧在线观看| 久久999免费视频| 精品高清美女精品国产区| 尤物九九久久国产精品的特点| 久久在精品线影院精品国产| 国产成人一区二区三区小说| 91久久久精品| 九九久久久久久久久激情| 国产亚洲欧洲高清一区| 九九九热精品免费视频观看网站| 国产精品日韩精品| 亚洲精品成人久久久| 日韩成人久久久| 日韩精品中文字幕视频在线| 亚洲美女av在线播放| 国产精品欧美在线| 人妖精品videosex性欧美| 91免费视频网站| 中文字幕精品在线视频| 97免费在线视频| 国产亚洲精品久久久久动| 日韩av电影在线网| 国产91网红主播在线观看| 欧美成人国产va精品日本一级| 97精品久久久中文字幕免费| 91久久国产精品91久久性色| 日韩专区中文字幕| 日本欧美一级片| 91av在线免费观看视频| 91网站免费看| 亚洲第一国产精品| 日韩精品久久久久久福利| 中文精品99久久国产香蕉| 91香蕉嫩草影院入口| 国产精欧美一区二区三区| 亚洲www在线| 亚洲第一天堂无码专区| 伊人av综合网| 国产成人精品999| 欧美一区二区三区免费观看| 国外成人免费在线播放| 91精品国产91久久久久久久久| 午夜精品一区二区三区av| 欧美成人午夜激情| 日韩美女视频免费在线观看| 欧美丰满少妇xxxxx| 日韩中文在线视频| 狠狠爱在线视频一区| 欧美性xxxx18| 国产精品视频精品视频| 亚洲国产精品人人爽夜夜爽| 亚洲天堂av在线播放| 日产精品久久久一区二区福利| 亚洲色图五月天| 欧美日韩国内自拍| 日本精品视频在线观看| 欧美一级成年大片在线观看| 91精品国产乱码久久久久久久久| 亚洲毛茸茸少妇高潮呻吟| 欧美精品国产精品日韩精品| 91在线免费视频| 欧美激情精品久久久久久黑人| 亚洲人成77777在线观看网| 日韩亚洲精品视频| 国产v综合v亚洲欧美久久| 欧洲s码亚洲m码精品一区| 欧美激情视频一区二区三区不卡| 91po在线观看91精品国产性色| 粗暴蹂躏中文一区二区三区| 欧美激情精品久久久久久久变态| 精品国产一区二区三区四区在线观看| 538国产精品一区二区免费视频| 最近2019年好看中文字幕视频| 精品久久久久久久久中文字幕| 在线视频免费一区二区| 欧美另类69精品久久久久9999| 欧美有码在线视频| 亚洲老司机av| 久久91精品国产| 91麻豆桃色免费看| 国产精品福利在线观看网址| 欧美日韩在线视频首页| 国产精品国产三级国产aⅴ9色| 久久99久国产精品黄毛片入口| 日韩在线视频导航| 精品女厕一区二区三区| 91在线观看免费高清完整版在线观看| 91av在线看| 日韩在线小视频| 国产激情久久久| 中文在线不卡视频| 不卡在线观看电视剧完整版| 久久免费视频这里只有精品| 国产热re99久久6国产精品| 久久精品视频亚洲| 色综合伊人色综合网| 亚洲欧美激情另类校园| 久久国产精彩视频| 91黑丝在线观看| 成人淫片在线看| 懂色av中文一区二区三区天美| 久久精品国产亚洲精品| 欧美性生交大片免费| 色综合视频一区中文字幕| 精品国偷自产在线视频| 亚洲理论电影网| 神马久久久久久| 亚洲欧美日韩天堂| 欧美日韩美女在线观看| 日韩在线国产精品| 欧美亚洲另类在线| 午夜精品久久久久久久99热| 在线日韩中文字幕| 欧美午夜精品在线| 欧美在线日韩在线| 亚洲欧美国产精品久久久久久久| 国产日韩精品在线播放| 神马久久久久久| 91日本在线视频| 中文字幕在线看视频国产欧美在线看完整| 国产日产久久高清欧美一区| 姬川优奈aav一区二区| 久久视频国产精品免费视频在线| 日韩网站免费观看高清| 亚洲国产一区二区三区四区| 中文字幕亚洲综合|