SQLite - C/C++ 초급자를 위한 가이드
안녕하세요, 꿈나무 프로그래머 여러분! 오늘 우리는 C/C++를 사용하여 SQLite의 세계로 흥미로운 여정을 떠납니다. 코드를 한 줄도 적어보지 않았다면 걱정하지 마세요 - 우리는 매우 기본적인 것부터 시작하여 차근차근 올라갈 것입니다. 이 튜토리얼이 끝나면 여러분이 이룰 수 있는 것에 놀라게 될 것입니다!
SQLite란?
코드에 들어가기 전에 SQLite가 무엇인지 이해해 보겠습니다. 디지털 노트북을 상상해 보세요. 여기서 여러 가지 정보를 체계적으로 저장할 수 있습니다. SQLite는 바로 그런东西입니다 - 서버 프로세스가 필요하지 않은 경량형, 파일 기반 데이터베이스입니다. 마치 여러분의 주머니 속에 있는 작은 데이터베이스似的입니다!
C/C++ 인터페이스 API
C/C++를 사용하여 SQLite와 상호작용하려면 API(응용 프로그램 인터페이스)를 사용해야 합니다. 이 API는 우리의 C/C++ 프로그램이 SQLite와 소통할 수 있게 해주는 특별한 도구라고 생각해 보세요. 다음은 우리가 사용할 주요 API입니다:
API 함수 | 설명 |
---|---|
sqlite3_open() | SQLite 데이터베이스에 연결을 여는 함수 |
sqlite3_exec() | SQL 문을 실행하는 함수 |
sqlite3_close() | 데이터베이스 연결을 닫는 함수 |
sqlite3_errmsg() | 오류 메시지를 반환하는 함수 |
이제 이름이 무서워 보일 수 있지만, 걱정 마세요. 우리는 많은 예제와 함께 하나씩 탐구해 나갈 것입니다!
데이터베이스 연결
먼저 데이터베이스에 연결해 보겠습니다. 이는 디지털 노트북을 열어 쓰기 시작하는 것과 같습니다.
#include <stdio.h>
#include <sqlite3.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "데이터베이스 열 수 없음: %s\n", sqlite3_errmsg(db));
return(0);
} else {
fprintf(stderr, "데이터베이스 성공적으로 열림\n");
}
sqlite3_close(db);
return 0;
}
이를 구분해 보면:
- 필요한 헤더 파일을 포함합니다:
stdio.h
는 입력/출력을 위한 것이고,sqlite3.h
는 SQLite 함수를 위한 것입니다. -
main()
함수에서sqlite3
포인터를 선언하여 데이터베이스 연결을 나타냅니다. -
sqlite3_open()
을 사용하여 "test.db"라는 데이터베이스를 엽니다 (또는 새로 만듭니다). - 연결이 성공적이었는지 확인합니다. 아니면 오류 메시지를 출력합니다.
- 마지막으로 데이터베이스 연결을 닫습니다.
테이블 생성
이제 노트북을 열었으니, 정보를 저장할 페이지를 만들어 보겠습니다. 데이터베이스 용어로는 이를 테이블이라고 합니다.
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
rc = sqlite3_open("test.db", &db);
if (rc) {
fprintf(stderr, "데이터베이스 열 수 없음: %s\n", sqlite3_errmsg(db));
return(0);
}
char *sql = "CREATE TABLE STUDENTS("
"ID INT PRIMARY KEY NOT NULL,"
"NAME TEXT NOT NULL,"
"AGE INT NOT NULL,"
"GRADE CHAR(1) );";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "테이블 성공적으로 생성\n");
}
sqlite3_close(db);
return 0;
}
이 예제에서:
- 데이터베이스를 여는 방법은과거와 동일합니다.
- SQL 문을 정의하여 STUDENTS라는 테이블을 생성합니다. 이 테이블에는 ID, NAME, AGE, GRADE라는 컬럼이 있습니다.
-
sqlite3_exec()
를 사용하여 SQL 문을 실행합니다. - 실행이 성공적이었는지 확인하고 적절한 메시지를 출력합니다.
INSERT 연산
테이블이 준비되었으니, 이제 데이터를 추가해 보겠습니다.
char *sql = "INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (1, 'Alice', 20, 'A' ); "
"INSERT INTO STUDENTS (ID,NAME,AGE,GRADE) "
"VALUES (2, 'Bob', 21, 'B' ); ";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 추가\n");
}
여기서 우리는 STUDENTS 테이블에 두 개의 레코드를 추가하고 있습니다. SQL 문은 INSERT INTO 구문을 사용하여 새로운 행을 추가합니다.
SELECT 연산
이제 추가한 데이터를 검색해 보겠습니다. 데이터베이스의 진정한 마법은 여기에서 빛을 발합니다!
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
for(int i = 0; i < argc; i++) {
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
// main() 함수 내에서
char *sql = "SELECT * from STUDENTS";
rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "작업 성공적으로 완료\n");
}
이 예제는 콜백 함수를 소개합니다. 우리가 SELECT를 수행할 때, SQLite는 결과集中的 각 행에 대해 이 콜백 함수를 호출합니다. 마치 노트북의 각 항목을 읽어주는 비서似的입니다!
UPDATE 연산
데이터를 잘못 입력했고 변경해야 한다면? 그때 UPDATE를 사용합니다.
char *sql = "UPDATE STUDENTS set GRADE = 'A' where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 업데이트\n");
}
이 SQL 문은 Bob의 학점을 A로 변경합니다. Bob, 잘 했어!
DELETE 연산
때로는 데이터를 제거해야 할 필요가 있습니다. 레코드를 제거하는 방법을 보겠습니다.
char *sql = "DELETE from STUDENTS where ID=2";
rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL 오류: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
} else {
fprintf(stdout, "레코드 성공적으로 제거\n");
}
이 명령은 Bob의 레코드를 테이블에서 제거합니다. Bob, 안녕!
이제 우리는 C/C++를 사용하여 SQLite의 기본적인 작업을 다룰 줄 배웠습니다! 기억하시라, 프로그래밍은 새로운 언어를 배우는 것과 같습니다 - 연습이 필요합니다. 즉시 이해가 되지 않는다면 실망하지 마세요. 계속 실험하고, 곧 프로처럼 데이터베이스 애플리케이션을 작성하게 될 것입니다!
Credits: Image by storyset