티스토리 뷰
안녕하세요. 09LABS입니다.
저번 포스팅에서는 간단하게 SQLite3 API를 이용하여 C언어와 연동하는 방법에 대해 알아봤습니다.
이번 포스팅에서는 데이터베이스에 존재하는 테이블 유무를 알아내는 방법에 대해 알아보겠습니다.
데이터베이스는 간단하게 설명을 하면 크게 데이터베이스 - 테이블 - Column / Row 로 나눌 수 있습니다.
SQLite3, MariaDB, MongoDB등 데이터베이스는 여러가지가 있지만 본인이 사용하기 편한 것을 사용하면 되며,
저는 주로 임베디드 시스템에 사용하기 때문에 비교적 가벼운 SQLite3를 선택했습니다.
자 그럼 본론으로 들어가서 데이터 베이스에 존재하는 테이블을 확인하는 방법에 대해 알아보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
#include <sqlite3.h>
void function_query(void *NotUsed, int argc, char **argv, char **azColName) {
if(argv[0] != NULL)
printf("callback = %d\n", atoi(argv[0]));
return 0;
}
int main(void){
int rc = 0;
char query[500] = {0}; // 쿼리 문자열 초기화
int x = 0; // Callback 리턴 변수
char *zErrMsg;
sqlite3 *db; // 데이터베이스 객체
rc = sqlite3_open("test.db", &db); // 데이터베이스 Open
if(!rc)
printf("open successfully!\n");
sprintf(query, "SELECT COUNT(*) FROM sqlite_master where name=\"table_name\";");
sqlite3_exec(db, query, function_query, 0, &zErrMsg);
sqlite3_close(db);
return 0;
}
|
cs |
먼저 소스코드는 위와 같습니다.
저번 포스팅에서 크게 달라진 점은 '쿼리'가 추가되었고, '쿼리'를 실행하고 실행한 결과를 받을 함수 'function_query'가 추가되었습니다.
자 그럼 쿼리에 대해 알아볼까요?
SQL (Structured Query Language) 은 관계형 데이터베이스에서 사용하는 표준 질의 언어를 의미합니다.
사용방법은 다른 프로그래밍 언어(C, C++, Java 등...) 보다 단순하며 모든 DBMS에서 사용 가능합니다.
특히 대소문자를 구분하지 않는다는 점에서 매우 편리하면서도 조금 햇깔리실 수 있습니다.
여기서 쿼리는 데이터베이스에 질문을 해서 정보를 얻는 것을 의미하며, 이러한 질문을 쿼리문 (SELECT, CREATE, INSERT 등)을
사용하여 실행할 수 있습니다.
1
2
|
sprintf(query, "SELECT COUNT(*) FROM sqlite_master where name=\"table_name\";");
sqlite3_exec(db, query, function_query, 0, &zErrMsg);
|
cs |
위의 문장을 살펴보면 실행할 쿼리문을 query 문자열에 복사하여 sqlite3_exec 함수로 실행합니다.
쿼리문을 실행한 결과는 function_query 함수로 전달되게 됩니다.
1
2
3
4
5
|
void function_query(void *NotUsed, int argc, char **argv, char **azColName) {
if(argv[0] != NULL)
printf("callback = %d\n", atoi(argv[0]));
return 0;
}
|
cs |
자 function_query 함수를 보면 뭔가 굉장히 많은 변수들이 있습니다. 이 변수들에 대해서는 나중에 언급할 예정입니다.
우선 살펴보아야 할 부분은 argv 인데요, argv는 실행한 결과를 받아오는 변수라고 볼 수 있습니다.
만약에 실행한 결과가 아무 결과를 나타내지 않는다면 NULL을 반환하게 됩니다. 만약에 NULL을
atoi로 변환하여 integer로 리턴을 받으려고 한다면 Segmentation Fault가 발생하게 될 것입니다.
따라서 저는 미리 if(argv[0] != NULL) 문장을 추가하여 NULL이 아닐 경우에만 변환을 하여 출력하도록 하였습니다.
그럼 실행결과를 확인해보도록 하겠습니다.
우선 SQLite3 데이터베이스에 table_name이라는 테이블을 하나 생성하여 확인할 수 있습니다.
test.db가 정상적으로 open되었고, function_query문이 실행되어 table_name이 한 개 있다는 것을 확인할 수 있습니다.
'코딩하자 > C언어' 카테고리의 다른 글
[SQLite3] 01. C API 연동하기 및 기초 코드 (0) | 2019.08.01 |
---|
- Total
- Today
- Yesterday
- fusion360
- 하드웨어
- IOT
- 쏘카
- 리눅스
- 3d프린터
- 자작
- SQLITE3
- Arduino
- Hypercube
- 코딩테스트
- 라즈베리파이
- 오픈소스
- C언어
- 설계
- 해커랭크
- ESP-IDF
- esp32
- 퓨전360
- 아두이노
- 3D Printer
- 프로젝트
- 3D 프린터
- 오픈소스 하드웨어
- 프린터
- ESP
- C++
- Fusion 360
- DIY
- 3D
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |