[SQLite3] 02. SQLite Database 테이블 유무 확인하기
안녕하세요. 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이 한 개 있다는 것을 확인할 수 있습니다.