본문 바로가기

TIL (Today I Learned)/Database

[Database] C api MySQL

728x90

C api Mysql

DB 경로 export 진행

  • include 경로와 library경로를 반드시 지정 / lmysqlclient 추가적으로 입력

    export LD_LIBRARY_PATH=:/home/khnoh/mysql/db_lib

    gcc main.c -o main -I/home/khnoh/mysql/include -L/home/khnoh/mysql/db_lib -lmysqlclient

자세한설명 보기

1. Display all Tables

image

MYSQL *conn;                // Database와의 연결을 관리하는 구조체이다. 대부분의 C API 함수에서 쓰인다.
char query_buffer[2048];
...
sprintf(querry_buffer, "%s", "Show tables;");
if(mysql_query(conn, query_buffer){
    printf("query failed : %s\n", querry_buffer);
    exit(1);
}

2. Select * from table

image

...
void print_select_all(){

    sprintf(query_buffer, "%s %s", "select * from", table_name);
    if(mysql_query(conn, query_buffer)){
        printf("query failed : %s\n", query_buffer);
        exit(1);
    }
    result = mysql_use_result(conn);                // 한 번에 한 개의 ROW를 서버로부터 가져 온다
    while((row = mysql_fetch_row(result)) != NULL){ // result에 있는 ROW들에서 한 개의 ROW를 얻어온다.
        for(i=0; i<mysql_num_fields(result); i++){
            if(i==0){
                while(field = mysql_fetch_field(result))
                {
                    printf("%-25s", field->name);
                }
                printf("\n");
            }
            printf("%-25s", row[i]);
        }
    }
    printf("\n");
}
...
  • 서버로부터 결과 값을 얻어오는 방법
    • "* MYSQL_RES* mysql_store_result(MYSQL* mysql)"
      • 한꺼번에 모두 서버로부터 얻어옴
    • "* MYSQL_RES* mysql_use_result(MYSQL* mysql)"
      • 한번에 한 개의 ROW를 얻어옴

3. Create(Insert)

image

  • 유사하게 sprintf를 이용해서 INSERT INTO 테이블명 (칼럼1, 칼럼2, ...) VALUES (값1, 값2, ...)
  • mysql_query(conn, query_buffer)를 이용

4. Read(Select)

image

  • table_name을 사용자로부터 입력받아 해당 테이블을 출력하는 API

4. Update(Update)

image

  • sprintf를 이용해서 UPDATE 테이블명 SET 칼럼1 = '값1' ... WHERE 칼럼 = 값
  • mysql_query(conn, query_buffer)를 이용

5. Delete(Delete)

image

  • sprintf를 이용해서 DELETE FROM 테이블명 WHERE 칼럼1 = '값1'
  • mysql_query(conn, query_buffer)를 이용

코드

#include<stdio.h>
#include<stdlib.h>
#include<mysql.h>
#include<errno.h>

    MYSQL *conn;
    MYSQL_RES *result;
    MYSQL_ROW row;

    char query_buffer[2048];

    int n=0;
    int i;
    char table_name[100];
    MYSQL_FIELD *field;
    char insert_columns[200];
    char insert_values[200];

void input_info(){
    printf("Enter table name : ");
    scanf("%[^\n]s", &table_name);
    getchar();
    printf("Enter Columns : ");
    scanf("%[^\n]s", &insert_columns);
    getchar();
    printf("Enter Values : ");
    scanf("%[^\n]s", &insert_values);
    getchar();
}

void query_affet(){
    if(mysql_query(conn, query_buffer)){
        printf("query failed : %s\n", query_buffer);
        exit(1);
        }
    printf("Query OK, 1 row affected\n");
}

void print_menu(){
    printf("==================\n");
    printf("1. Display All Tables\n");
    printf("2. SELECT All FROM Tables\n");
    printf("3. INSERT\n");
    printf("4. UPDATE\n");
    printf("5. DELETE\n");
    printf("6. EXIT\n");
    printf("==================\n");
    printf("Enter number : ");
}

void print_select_all(){

    sprintf(query_buffer, "%s %s", "select * from", table_name);
    if(mysql_query(conn, query_buffer)){
        printf("query faild : %s\n", query_buffer);
        exit(1);
    }
    result = mysql_use_result(conn);
    while((row = mysql_fetch_row(result)) != NULL){
        for(i=0; i<mysql_num_fields(result); i++){
            if(i==0){
                while(field = mysql_fetch_field(result))
                {
                    printf("%-25s", field->name);
                }
                printf("\n");
            }
            printf("%-25s", row[i]);
        }
    }
    printf("\n");
}

void main(int argc, char **argv){
    conn = mysql_init(NULL);

    if(!mysql_real_connect(conn, "127.0.0.1", "root", "PASSWORD", NULL, 0, NULL, 0)){
        printf("Cannot connect");
        exit(1);
    }
    else {
        if (mysql_select_db(conn, "khnoh")){
            printf("cannot use database");
            exit(1);
        }
    }
    while(n!=6){
        print_menu();
        scanf("%d", &n);
        getchar();
        if(n==1){
            sprintf(query_buffer, "%s", "show tables;");    // 1. SHOW TABLES;
            if(mysql_query(conn, query_buffer)){
                printf("query faild : %s\n", query_buffer);
                exit(1);
            }

            result = mysql_use_result(conn);
            while((row = mysql_fetch_row(result)) != NULL)
                printf("%s \n", row[0]);
        }
        if(n==2){                                         // 2. SELECT * FROM TABLE
            printf("Enter table name : ");
            scanf("%s", &table_name);
            print_select_all();
        }if(n==3){                                        // 3. Insert into
            input_info();
            sprintf(query_buffer, "%s %s %s %s %s %s%s", "INSERT INTO ", table_name, " (",insert_columns ,") VALUES(",insert_values ,")");
            query_affet();
            print_select_all();
        }
       if(n==4){                                         // 4. Update
            input_info();
            sprintf(query_buffer, "%s %s %s %s %s %s", "UPDATE ", table_name, " SET ",insert_columns ,"WHERE ",insert_values);
            query_affet();
            print_select_all();
        }
       if(n==5){                                         // 5. Delete
            input_info();
            sprintf(query_buffer, "%s %s %s %s %s %s", "DELETE FROM ", table_name, " WHERE ",insert_columns ," = ",insert_values);
            query_affet();
            print_select_all();
        }
    }
    mysql_free_result(result);
    mysql_close(conn);
}

'TIL (Today I Learned) > Database' 카테고리의 다른 글

[MySql] 없어진 기록 찾기  (0) 2021.12.18
[MySQL] MySQL CRUD C로 구현하기  (0) 2021.08.25
[Database] SQL의 종류  (0) 2021.08.25
[Database] Index 생성  (0) 2021.08.25
[Database] MySQL 설치하기 (MacOS)  (0) 2021.08.25