SQLite replace string

다음과 같이 하면 된다고 함.

UPDATE table SET field = replace( field, 'C:\afolder\', 'C:\anewfolder\' ) WHERE field LIKE 'C:\afolder\%';

해보니 잘 됨. 매우 만족.

SQLite replace part of a string 참조.

Tags: ,

SQLite 테이블이 존재하는지 확인

SQLite에서 테이블이 존재하는지 확인하는 법.

SELECT name FROM sqlite_master WHERE type='table' AND name='table_name';

테이블이 존재하면 테이블명이 리턴되고, 없으면 널 스트링이 리턴된다.

How do I check in SQLite whether a table exists? 참조.

Tags:

Sqlite 데이터 삽입 구문만 덤프

Sqlite 데이타베이스의 데이터 삽입 구문만 저장을 하고 싶어서 찾아보았음.
다음과 같이 만들었음.

sqlite3 db_name .dump | grep "^INSERT INTO \|^BEGIN\|^COMMIT" > sql_file

grep 명령을 사용하는 것이기 때문에 윈도우즈용 grep이나 cygwin 등이 필요하지만 이게 편함.

How do I dump the data of some SQLite3 tables? 참조.

Tags:

SQLite 깨짐

SQLite database 파일이 깨질 수 있다고 한다.

뜨아~! 다시 검토가 필요하닷!

1. 데이터베이스의 무결성을 깨뜨리는 원인

1) sqlite3 database library 결함.
2) sqlite3 api 를 잘못 사용하고 있는 경우 (혹은 예외처리를 제대로 안해주었을 경우)
3) threadsafe 옵션을 생략한 채, multi-thread 환경에서 sqlite3 database library를 사용하는 경우
4) 구식 IDE 디스크를 사용하는 경우, fsync, FlushFileBuffers와 같은 함수 호출시
해당 함수들의 역활이 올바르게 완료되지 못할 수 있으며, 이는 곧 데이터베이스가 깨지는 원인이 될 수 있음.
5) 운영체제에서 POSIX advisory locks 을 올바르게 지원하지 못하는 경우
※ 특히, NFS(윈도우는 공유폴더) 환경에서는 locking 문제가 고질적으로 발생하기 때문에,
가능하면 sqlite3 database를 NFS 환경에서 사용하지 말아야 함.
6) 하드웨어 오류가 발생한 경우 (특히, 디스크 볼륨 자체가 깨진 경우)

2. 무결성 체크 방법

PRAGMA quick_check
PRAGMA integrity_check

3. 복구 방법

sqlite3 mydatabase .dump > Mybackup.sql
sqlite3 OLD.DB .dump | sqlite3 NEW.DB

100% 복구는 안된다고 함…

[SQLite3] The database disk image is malformed (SQLITE_CORRUPT) 참조.

Tags:

C++ Builder에서 SQLite 사용

오호.. 드뎌 C++ Builder에 입문하였다!

첫번째 프로젝트로 SQLite를 사용해서 데이터를 특정 규칙에 따라 바꾸어주는 프로그램을 만들었다.

옷,, UI는 정말 몇 줄 없다.

첨에 SQLite3.h가 include가 안되어서 찾아보았다. SQLite 버전에 따라 동작이 달랐다. 버전을 올려 주었더니 기냥 되었다.
어쨌던 success..
굿이다.

SQLite 테스트… 참조.

Tags: ,

Virtual Listview와 DB 연결

가상 리스트뷰를 사용하여 DB와 바로 연결하려 했으나 문제에 직면하였다.
리스트뷰를 아래로 스크롤 하면 DB 쿼리 시간이 엄청 느려지는 것이었다.
다음과 같은 쿼리문을 사용하였다.

SELECT * FROM stuList WHERE studt DESC LIMIT 20 OFFSET 10,000 ;

OFFSET 값이 커질수록 쿼리에 소요되는 시간이 느려진 것이 원인이었다.
그래서 찾아보니 LIMIT, OFFSET을 윈도우 스크롤을 위해서 사용해서는 안된다고 한다.

sqlite – ScrollingCursor 참조.

게시판과 같은 경우라면 쿼리 결과를 페이지 단위로 보여주기 위해서 다음과 같은 쿼리문을 권장하고 있다.

To page down:
SELECT * FROM bbs WHERE id < :firstId ORDER BY id DESC LIMIT 20; 

To page up:
SELECT * FROM bbs WHERE id > :lastId ORDER BY id LIMIT 20;

게시판이라 최근 id가 먼저 나오는 것(한 페이지에 가장 윗열에 lastId, 가장 아래에 firstId가 존재)과 두번째 쿼리 결과는 정렬순서가 뒤집어진 것에 주의.
좋은 쿼리문인것 같다. 단 검색 조건에 따라서 적절한 인덱스가 존재한다는 가정이 선행되어야 하며, WHERE 절에 사용된 컬럼이 UNIQUE이어야만 가능할 것이다.

이 문제는 SQLite에만 해당되는 것이 아니며 모든 DB에 해당되는 것 같다. MySQL도 OFFSET이 커지면 느려진다고 한다. 그럴수 밖에 없지 않겠는가. 모든 쿼리 결과를 미리 가지고 있는 것이 아니니…

임시 테이블을 사용한다는 의견도 있다. 뭐 대략 같은 개념이다. 하지만 임시 테이블을 만드는 시간이 소요되겠넹~

offset 값이 커질수록 점점 느려지는 문제가 생기네요…T.T
수십만건 이상 되는 자료에 대한 자료 목록의 표현 방식에 대한 논의 참조.

결론적으로 DB와 가상 리스트뷰의 직접 연결은 불가능하고, 중간에 벡터를 두고 가상 리스트뷰와 벡터를 연결해야 할 것 같다.

또 며칠이 기냥 지나간다. 휭~

———-
2009-03-13

다시 생각해보니 쿼리 결과 id 벡터만을 가지고 있고, 스크롤할 때(가상 리스트뷰의 이벤트시) 해당 열의 id에 해당되는 데이타를 쿼리해오는 방식이 좋을 것 같다. 실시간으로 보여지기만 한다면…

Tags:

SQLite – join 할때 주의

두  테이블을 조인하였는데 쿼리 속도가 왕느려서 찾아보았다.

SQLite에서는 루프 조인을 사용하며 FROM 절의 왼쪽에 있는 테이블이 바깥쪽 루프, 오른쪽에 있는 테이블이 안쪽 루프가 되는 것 같다.

The SQLite Query Optimizer Overview – 5.0 Joins 참조.

stu, pat 두 테이블을 조인할 때 속도가 느렸던 이유는 FROM pat,stu 라고 하였을 때, pat 테이블을 스캔하면서 stu 테이블에서 patId로 stu를 검색할때 stu 테이블의 patId 컬럼에 인덱스가 없어서 stu 테이블 전체를  훑으느라고 그런것인가부다.

FROM stu,pat으로 바꾸니 빨라졌다.

생각해보니 전자의 경우에 거의 (pat 테이블의 열의 수)배 만큼 느려진다. 테스트해본 DB에서 pat 테이블의 열의 수가 약 1,000개 였으니 약 1,000배가 느려진 것이다. 오호!

SQLite에서 조인할 때에는 foreign key 컬럼이 있는 테이블을 FROM 절의 왼쪽에 놓는다고 생각해야겠다.
SQLite만 이런것인가. 어쨌든 잘  생각하면서 조인해야겠당.

Tags:

SQLite lib 파일 만들기

SQLite dll 파일을 다운 받으면 같이 포함되어 있는 def 파일로부터 다음과 같이 만들면 된다고 함.

lib /machine:i386 /def:sqlite3.def

sqlite3.h 헤더 파일은 소스 파일을 받아서 압축풀어서 사용하면 된다고 함.

[sqlite] Lib and H files 참조

Tags:

Escape single quote in SQLite

INSERT INTO table1 VALUES('It's a happy day!');

위와 같은 문장은 오류이다. SQLite에서는 아래와 같이 써야 한다.

INSERT INTO table1 VALUES('It''s a happy day!');

A single quote within the string can be encoded by putting two single quotes in a row

SQLite Query Language: expression 참조

이를 편리하게 사용하게 해주는 함수가 있다.

SQLite C Interface: Formatted String Printing Function 참조

Tags:

SQLite database dump

다음과 같이 하니 되었음.

echo .dump | sqlite3 ex1 > ex1.sql

Converting An Entire Database To An ASCII Text File 참조

———-
2009-11-17

sqlite3 ex1 .dump > ex1.sql

Tags: