SQL
sqlite
aucd29
2013. 9. 26. 21:21
http://www.redef.pe.kr/302
SQLite에 대해 스터디를 하면서 정리한 내용입니다. 앞으로 계속해서 스터디한 내용을 추가해 넣겠습니다. 교재는 Inside SQLite입니다.
1. Overview
특징
- 환경 설정이 필요 없다
=> 사용하기전에 별다른 절차가 필요없다. 그리고 소스코드를 컴파일해서 라이브러리를 사용할 수도 있다.
- 끼워 넣기 좋다.
=> 어플리케이션에 이식하기 좋다.
- 어플리케이션 인터페이스
=> C 어플리케이션에서 데이터베이스를 다루기위한 환경을 제공한다.
- 트랜잭션 제공
- 쓰레드 안정적
- 가볍다
- 사용자에 맞게 변경이 용이하다.
- 크로스 플랫폼 지원
1.1. 샘플 어플리케이션들
1.1.1. 간단한 SQLite 어플리케이션
[소스]
#include <stdio.h>
#include "../sqlite/inc/sqlite3.h"
int main(void)
{
sqlite3* db = 0;
sqlite3_stmt* stmt = 0;
int retcode;
//mydb라는이름의데이터베이스를연다.
retcode = sqlite3_open("MyDB", &db);
if(retcode != SQLITE_OK)
{
sqlite3_close(db);
fprintf(stderr, "Could not open Mydb\n");
return retcode;
}
retcode = sqlite3_prepare(db, "select SID from Students order by SID", -1, &stmt, 0);
if(retcode != SQLITE_OK)
{
sqlite3_close(db);
fprintf(stderr, "Could not execuete SELECT\n");
return retcode;
}
while(sqlite3_step(stmt) == SQLITE_ROW)
{
int i = sqlite3_column_int(stmt, 0);
printf("SID = %d\n", i);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return SQLITE_OK;
}
이제 MyDB를 만들어 보자
Sqlite3 MyDB “create table students (SID integer)”
Sqlite3 MyDB “insert into students values(200)”
Sqlite3 MyDB “insert into students values(100)”
Sqlite3 MyDB “insert into students values(300)”
이제 실행을 시키면 아래와 같은 결과가 나온다.
SID = 100
SID = 200
SID = 300
1.1.1.1. sqlite3_open
SQLite 라이브러를 통해서 데이터베이스 파일을 열고 새롭게 연결한다. 데이터베이스 파일이 존재하지 않으면 새로 만든다.
이 함수는 연결 핸들을 반환한다. 이 핸들은 연결된 데이터베이스를 동작시키기 위한 용도로 이용된다. 그리고 이 연결의 상태를 나타낸다.
1.1.1.2. sqlite3_prepare
SQL 상태를 수집하는 함수이다. 일반적으로 prepared statement를 제공한다.
상태 핸들을 리턴한다. 이 핸들은 준비되어 있는 상태에 대한 조정을 위해 사용되곤한다.
1.1.1.3. sqlite3_step
이 함수는 새로운 row나 더 이상 row가 없는 상태까지 실행된다.
SQLITE_ROW, SQLITE_DONE을 반환한다. 반환할 row가 없는 상태(UPDATE, INSEERT, DELETE, CREATE)에서는 SQLITE_DONE을 반환한다. Step 함수에서 SELECT에 대한 결과는 커서의 위치를 이동한다. Step 함수의 모든 실행은 rowset에서 다음 row로 커서를 이동한다. 커서는 오직 앞으로만 이동이 가능하다.
1.1.1.4. sqlite3-column_int
Step 함수에서 SQLITE_ROW를 반환하면 sqlite3_column_* 함수들을 실행해서 각 컬럼의 값을 받을 수 있다.
1.1.1.5. sqlite3_finalize
Prepared statement를 소멸한다.
1.1.1.6. sqlite3_close
데이터베이스 연결을 종료한다.
1.1.2. 직접 SQL 실행하기
[소스]
static int callback(void *NotUsed, int argc, char **argv, char **colName)
{
//현재row의각컬럼을반복한다.
int i;
for(i = 0; i < argc; i++)
{
printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "NULL");
}
return 0;
}
int main(int argc, char **argv)
{
sqlite3* db = 0;
char* zErrMsg = 0;
int rc;
if(argc != 3)
{
fprintf(stderr, "Usage: %s DATABASE-FILE SQL-SATEMENT\n", argv[0]);
return -1;
}
rc = sqlite3_open(argv[1], &db);
if(rc != SQLITE_OK)
{
fprintf(stderr, "Can't open database : %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -2;
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error : %s\n", zErrMsg);
}
sqlite3_close(db);
return rc;
}
컴파일해서 실행해보자.
App2 MyDB “insert int Students values(100)”
위와 같이 실행을 한 후에
App2 MyDB “select * from Students”
해보면 결과값이 보일 것임
데이터베이스 파일이 없으면 새로 만듬
SQLite에 대해 스터디를 하면서 정리한 내용입니다. 앞으로 계속해서 스터디한 내용을 추가해 넣겠습니다. 교재는 Inside SQLite입니다.
1. Overview
특징
- 환경 설정이 필요 없다
=> 사용하기전에 별다른 절차가 필요없다. 그리고 소스코드를 컴파일해서 라이브러리를 사용할 수도 있다.
- 끼워 넣기 좋다.
=> 어플리케이션에 이식하기 좋다.
- 어플리케이션 인터페이스
=> C 어플리케이션에서 데이터베이스를 다루기위한 환경을 제공한다.
- 트랜잭션 제공
- 쓰레드 안정적
- 가볍다
- 사용자에 맞게 변경이 용이하다.
- 크로스 플랫폼 지원
1.1. 샘플 어플리케이션들
1.1.1. 간단한 SQLite 어플리케이션
[소스]
#include <stdio.h>
#include "../sqlite/inc/sqlite3.h"
int main(void)
{
sqlite3* db = 0;
sqlite3_stmt* stmt = 0;
int retcode;
//mydb라는이름의데이터베이스를연다.
retcode = sqlite3_open("MyDB", &db);
if(retcode != SQLITE_OK)
{
sqlite3_close(db);
fprintf(stderr, "Could not open Mydb\n");
return retcode;
}
retcode = sqlite3_prepare(db, "select SID from Students order by SID", -1, &stmt, 0);
if(retcode != SQLITE_OK)
{
sqlite3_close(db);
fprintf(stderr, "Could not execuete SELECT\n");
return retcode;
}
while(sqlite3_step(stmt) == SQLITE_ROW)
{
int i = sqlite3_column_int(stmt, 0);
printf("SID = %d\n", i);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return SQLITE_OK;
}
이제 MyDB를 만들어 보자
Sqlite3 MyDB “create table students (SID integer)”
Sqlite3 MyDB “insert into students values(200)”
Sqlite3 MyDB “insert into students values(100)”
Sqlite3 MyDB “insert into students values(300)”
이제 실행을 시키면 아래와 같은 결과가 나온다.
SID = 100
SID = 200
SID = 300
1.1.1.1. sqlite3_open
SQLite 라이브러를 통해서 데이터베이스 파일을 열고 새롭게 연결한다. 데이터베이스 파일이 존재하지 않으면 새로 만든다.
이 함수는 연결 핸들을 반환한다. 이 핸들은 연결된 데이터베이스를 동작시키기 위한 용도로 이용된다. 그리고 이 연결의 상태를 나타낸다.
1.1.1.2. sqlite3_prepare
SQL 상태를 수집하는 함수이다. 일반적으로 prepared statement를 제공한다.
상태 핸들을 리턴한다. 이 핸들은 준비되어 있는 상태에 대한 조정을 위해 사용되곤한다.
1.1.1.3. sqlite3_step
이 함수는 새로운 row나 더 이상 row가 없는 상태까지 실행된다.
SQLITE_ROW, SQLITE_DONE을 반환한다. 반환할 row가 없는 상태(UPDATE, INSEERT, DELETE, CREATE)에서는 SQLITE_DONE을 반환한다. Step 함수에서 SELECT에 대한 결과는 커서의 위치를 이동한다. Step 함수의 모든 실행은 rowset에서 다음 row로 커서를 이동한다. 커서는 오직 앞으로만 이동이 가능하다.
1.1.1.4. sqlite3-column_int
Step 함수에서 SQLITE_ROW를 반환하면 sqlite3_column_* 함수들을 실행해서 각 컬럼의 값을 받을 수 있다.
1.1.1.5. sqlite3_finalize
Prepared statement를 소멸한다.
1.1.1.6. sqlite3_close
데이터베이스 연결을 종료한다.
1.1.2. 직접 SQL 실행하기
[소스]
static int callback(void *NotUsed, int argc, char **argv, char **colName)
{
//현재row의각컬럼을반복한다.
int i;
for(i = 0; i < argc; i++)
{
printf("%s = %s\n", colName[i], argv[i] ? argv[i] : "NULL");
}
return 0;
}
int main(int argc, char **argv)
{
sqlite3* db = 0;
char* zErrMsg = 0;
int rc;
if(argc != 3)
{
fprintf(stderr, "Usage: %s DATABASE-FILE SQL-SATEMENT\n", argv[0]);
return -1;
}
rc = sqlite3_open(argv[1], &db);
if(rc != SQLITE_OK)
{
fprintf(stderr, "Can't open database : %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return -2;
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if(rc != SQLITE_OK)
{
fprintf(stderr, "SQL error : %s\n", zErrMsg);
}
sqlite3_close(db);
return rc;
}
컴파일해서 실행해보자.
App2 MyDB “insert int Students values(100)”
위와 같이 실행을 한 후에
App2 MyDB “select * from Students”
해보면 결과값이 보일 것임
데이터베이스 파일이 없으면 새로 만듬