SQLite 라이브러리의 Tcl 인터페이스
SQLite 라이브러리의 Tcl 인터페이스 (The Tcl interface to the SQLite library)
SQLite 라이브러리는 Tcl 또는 Tcl/Tk 스크립트에서 아주 쉽게 사용하도록 설계됐어요. 이 문서는 SQLite의 Tcl 프로그래밍 인터페이스에 대한 개요를 제공하며, 빌드 방법과 개별 메서드들을 설명해요. SQLite는 원래 Tcl 확장으로 시작했고, SQLite의 주요 테스트 스위트가 Tcl로 작성되어 이 문서가 설명하는 Tcl 확장을 사용해요.
출처: 문서
본문
1. 도입
SQLite 라이브러리는 Tcl 또는 Tcl/Tk 스크립트에서 아주 쉽게 사용하도록 설계됐어요. SQLite는 Tcl 확장으로 시작했으며, SQLite의 주요 테스트 스위트는 Tcl로 작성돼 있고 이 문서가 설명하는 SQLite용 Tcl 확장을 사용해요. SQLite는 어떤 프로그래밍 언어와도 함께 쓸 수 있지만, Tcl과의 연결은 깊어요.
이 문서는 SQLite의 Tcl 프로그래밍 인터페이스에 대한 개요를 제공해요. Tcl에서 JSON을 처리하는 구체적인 팁은 이 문서를 참고하세요.
2. SQLite Tcl 확장 빌드 및 설치
SQLite 3.48.0 (2025-01-14) 버전부터, SQLite Tcl 확장을 빌드하는 선호 방법은 표준 SQLite 소스 트리를 사용하고 makefile을 "tclextension-install" 대상으로 실행하는 거예요. 여러 Tcl 버전이 설치되어 있다면, unix에서 --with-tclsh=PATH 명령줄 옵션을 사용해 SQLite 확장을 설치할 특정 Tcl 설치를 지정할 수 있어요. 예를 들어 $HOME/tcl에 사용자 지정 Tcl 9.0 설치가 있다면 다음과 같이 실행해 그 설치용 SQLite를 설치할 수 있어요:
./configure --with-tclsh=$HOME/tcl/bin/tclsh9.0
make tclextension-install
Windows에서는 TCLDIR 환경 변수를 사용해 Tcl 설치의 최상위 디렉터리를 지정해요. %HOME%/tcl에 사용자 지정 Tcl 설치가 있다면 명령은 다음과 같을 거예요:
nmake /f Makefile.msc TCLDIR=%HOME%\tcl tclextension-install
두 경우 모두 유용할 수 있는 추가 makefile 대상이 있어요:
- tclextension → SQLite 확장을 빌드하지만 파일을 설치 디렉터리로 옮기지 않아요.
- tclextension-list → ./configure에 지정된 또는 TCLDIR에 지정된 Tcl 인터프리터에서 사용 가능한 모든 SQLite 확장을 보여줘요.
- tclextension-uninstall → SQLite 확장을 제거해요.
- tclextension-verify → 설치된 SQLite 확장이 명령이 실행되는 소스 트리와 동일한 버전의 SQLite를 사용하는지 확인해요.
위 기법으로 Tcl 인터프리터에 SQLite 확장을 설치한 후, 어떤 tclsh나 wish에서든 다음 명령을 실행해 시작할 수 있어요:
package require sqlite3
2.1. 빌드 과정이 작동하는 방식
Tcl용 SQLite 어댑터는 src/tclsqlite.c라는 소스 코드 파일로 구현돼요. 이 파일 하나가 SQLite를 구현하는 어말감(amalgamation, "sqlite3.c")에 추가되어 "tclsqlite3.c"라는 새 소스 파일을 만들어요. tclsqlite3.c를 공유 라이브러리로 컴파일해 SQLite를 구현하는 런타임 로드 가능한 Tcl 확장으로 만들어요. "tclextension-install" make 대상이 그 작업을 하고, 적절한 pkgIndex.tcl 스크립트를 구성한 다음 공유 라이브러리와 pkgIndex.tcl 스크립트를 모두 적절한 설치 디렉터리로 옮겨요.
tclsqlite3.c를 빌드하는 makefile 대상이 있어요:
make tclsqlite3.c
tclsqlite3.c 파일을 공유 라이브러리로 컴파일할 필요는 없어요. tclsqlite3.c 라이브러리는 Tcl 라이브러리도 정적으로 링크하는 애플리케이션에 정적으로 링크되어 독립 실행형 실행 파일을 만들 수 있어요. SQLite 테스트에 사용되는 "testfixture" 실행 파일이 이렇게 동작해요.
2.2. 추가 빌드 문서
SQLite 소스의 src/tcl-extension-testing.md 문서를 보면 SQLite Tcl 확장이 테스트되는 방식에 대한 단계별 지침이 있어요. 그 문서는 SQLite용 Tcl 확장 빌드에 문제가 있을 때 추가 힌트를 제공할 수도 있어요.
3. SQLite 라이브러리의 Tcl 인터페이스
SQLite용 Tcl 확장은 sqlite3이라는 단일 새 Tcl 명령으로 구성돼요. 명령이 하나뿐이므로 인터페이스는 별도의 네임스페이스에 두지 않아요.
sqlite3 명령은 주로 다음과 같이 데이터베이스를 열거나 만들 때 사용해요:
sqlite3 dbcmd ?database-name? ?options?
정보만 얻으려면 sqlite3 명령에 정확히 하나의 인자, "-version", "-sourceid", "-has-codec" 중 하나를 주면, 다른 효과 없이 지정된 데이터 항목을 반환해요.
다른 인자를 사용하면 sqlite3 명령은 두 번째 비옵션 인자가 지정한 이름의 데이터베이스를 열고, 그런 인자가 없으면 ""이라는 이름을 열어요. 열기가 성공하면 첫 번째 인자가 이름인 새 Tcl 명령이 생성되고 ""이 반환돼요. (이 접근 방식은 Tk에서 위젯이 생성되는 방식과 유사해요.) 열기가 실패하면 Tcl 명령을 만들지 않고 오류가 발생하며 오류 메시지 문자열이 반환돼요.
데이터베이스가 아직 존재하지 않으면 기본 동작은 자동으로 생성되는 거예요 (단, "-create false" 옵션을 사용해 변경할 수 있어요).
데이터베이스 이름은 보통 데이터베이스가 저장되는 디스크 파일의 이름이에요. 데이터베이스 이름이 특수 이름 ":memory:"이면 메모리에 새 데이터베이스가 만들어져요. 데이터베이스 이름이 빈 문자열이면, 데이터베이스 연결이 닫힐 때 자동으로 삭제되는 빈 파일에 데이터베이스가 만들어져요. sqlite3 명령에 "-uri yes" 옵션을 주면 URI 파일 이름을 사용할 수 있어요.
sqlite3 명령이 이해하는 옵션은 다음과 같아요:
-
-create BOOLEAN — true면 아직 없을 때 새 데이터베이스를 만들어요. false면 기존에 존재하지 않는 데이터베이스 파일을 열려 하면 오류가 발생해요. 기본 동작은 "true"예요.
-
-nomutex BOOLEAN — true면 데이터베이스 연결의 모든 뮤텍스가 비활성화돼요. 이는 단일 스레드 애플리케이션에서 약간의 성능 향상을 제공해요.
-
-readonly BOOLEAN — true면 데이터베이스 파일을 읽기 전용으로 열어요. false면 파일시스템 권한이 허용하면 읽기·쓰기 모두로, 운영체제가 파일시스템 쓰기 권한을 거부하면 읽기 전용으로 열어요. 기본 설정은 "false"예요. 이전에 데이터베이스를 가졌던 프로세스가 깨끗하게 종료되지 않고 hot journal을 남겼다면, 연 후 데이터베이스를 복구하려면 쓰기 권한이 필요하므로 데이터베이스를 읽기 전용으로 열 수 없어요.
-
-uri BOOLEAN — true면 파일 이름 인자를 URI 파일 이름으로 해석해요. false면 인자는 리터럴 파일 이름이에요. 기본값은 "false"예요.
-
-vfs VFSNAME — 인자가 이름인 대체 VFS를 사용해요.
-
-fullmutex BOOLEAN — true면 여러 스레드가 데이터베이스를 안전하게 사용하려 시도할 수 있어요. false면 그런 시도는 안전하지 않아요. 기본값은 확장이 어떻게 빌드됐느냐에 따라 달라요.
-
-nofollow BOOLEAN — true이고 데이터베이스 이름이 심볼릭 링크를 가리키면, 실제 데이터베이스 파일을 열도록 링크를 따라가지 않아요. false면 심볼릭 링크를 따라가요. 기본값은 "false"예요.
SQLite 데이터베이스가 열리면 dbcmd의 메서드로 제어할 수 있어요. 현재 41개의 메서드가 정의되어 있어요.
- authorizer, backup, bind_fallback, busy, cache, changes, close, collate, collation_needed, commit_hook, complete, config, copy, deserialize
- enable_load_extension, errorcode, eval, exists, format, function, incrblob, interrupt, last_insert_rowid, nullvalue, onecolumn, preupdate, profile, progress
- restore, rollback_hook, serialize, status, timeout, total_changes, trace, trace_v2, transaction, unlock_notify, update_hook, version, wal_hook
각 메서드의 사용은 아래에서 설명할 텐데, 위에 보인 순서와는 다르게요.
3.1. eval 메서드
가장 유용한 dbcmd 메서드는 "eval"이에요. eval 메서드는 데이터베이스에서 SQL을 실행하는 데 사용돼요. eval 메서드의 구문은 다음과 같아요:
dbcmd eval ?-withoutnulls? ?-asdict? sql var-name? ?script?
eval 메서드의 역할은 두 번째 인자에 주어진 SQL 문(들)을 실행하는 거예요. 예를 들어 데이터베이스에 새 테이블을 만들려면:
sqlite3 db1 ./testdb
db1 eval {CREATE TABLE t1(a int, b text)}
위 코드는 a와 b 컬럼을 가진 t1이라는 새 테이블을 만들어요. 이보다 더 간단할 수는 없겠죠?
쿼리 결과는 컬럼 값의 리스트로 반환돼요. 쿼리가 2개의 컬럼을 요청하고 쿼리와 일치하는 행이 3개라면, 반환된 리스트는 6개의 요소를 포함해요. 예를 들어:
db1 eval {INSERT INTO t1 VALUES(1,'hello')}
db1 eval {INSERT INTO t1 VALUES(2,'goodbye')}
db1 eval {INSERT INTO t1 VALUES(3,'howdy!')}
set x [db1 eval {SELECT * FROM t1 ORDER BY a}]
위 코드는 변수 $x를 다음 값으로 설정해요:
1 hello 2 goodbye 3 howdy!
배열 이름을 지정하거나 -asdict 플래그로 dict 변수와 SQL 코드 뒤의 스크립트를 지정해 쿼리 결과를 한 행씩 처리할 수도 있어요. 쿼리 결과의 각 행에 대해 모든 컬럼의 값이 배열(또는 dict 변수)에 삽입되고 스크립트가 실행돼요. 예를 들어:
db1 eval {SELECT * FROM t1 ORDER BY a} values {
parray values
puts ""
}
이 마지막 코드는 다음 출력을 줘요:
values(*) = a b
values(a) = 1
values(b) = hello
values(*) = a b
values(a) = 2
values(b) = goodbye
values(*) = a b
values(a) = 3
values(b) = howdy!
결과의 행에 있는 각 컬럼에 대해, 그 컬럼의 이름이 배열의 인덱스로 사용되고 컬럼의 값이 해당 배열 항목에 저장돼요. (주의: 쿼리 결과 집합의 두 개 이상의 컬럼이 같은 이름을 가지면, 그 이름의 마지막 컬럼이 이전 값을 덮어쓰고 같은 이름의 이전 컬럼은 접근할 수 없게 돼요.) 특수 배열 인덱스 *는 컬럼 이름이 나타나는 순서대로 그 목록을 저장하는 데 사용돼요.
보통 SQL NULL 결과는 nullvalue 설정을 사용해 배열에 저장돼요. 하지만 -withoutnulls 옵션을 사용하면 NULL SQL 값은 대신 해당 배열 요소를 설정 해제(unset)하게 해요.
배열 변수 이름을 생략하거나 빈 문자열로 설정하면, 각 컬럼의 값이 컬럼과 같은 이름의 변수에 저장돼요. 예를 들어:
db1 eval {SELECT * FROM t1 ORDER BY a} {
puts "a=$a b=$b"
}
이로부터 다음 출력을 얻어요:
a=1 b=hello
a=2 b=goodbye
a=3 b=howdy!
Tcl 변수 이름은 두 번째 인자의 SQL 문에서 문자열이나 숫자 리터럴을 넣을 수 있는 모든 위치에 나타날 수 있어요. 변수의 값이 변수 이름 대신 대입돼요. 변수가 존재하지 않으면 NULL 값이 사용돼요. 예를 들어:
db1 eval {INSERT INTO t1 VALUES(5,$bigstring)}
$bigstring 값을 따옴표로 묶을 필요가 없다는 점을 주목하세요. 자동으로 처리돼요. $bigstring이 큰 문자열이나 바이너리 객체라면, 이 기법은 쓰기 더 쉬울 뿐 아니라 $bigstring의 콘텐츠 복사본을 만드는 것을 피하므로 훨씬 더 효율적이에요.
$bigstring 변수에 문자열과 "bytearray" 표현이 둘 다 있으면 Tcl은 값을 문자열로 삽입해요. "bytearray" 표현만 있다면 값은 BLOB으로 삽입돼요. 텍스트 표현도 있어도 값을 BLOB으로 강제로 삽입하려면 "$" 대신 "@" 문자를 사용해요. 이렇게요:
db1 eval {INSERT INTO t1 VALUES(5,@bigstring)}
변수에 bytearray 표현이 없으면 "@"는 "$"처럼 작동해요. 모든 경우 ":"은 "$"처럼 작동하므로 다음은 같은 문을 표현하는 또 다른 방법이에요:
db1 eval {INSERT INTO t1 VALUES(5,:bigstring)}
변수 이름 앞에 "$" 대신 ":"을 사용하는 것은 SQL 텍스트가 중괄호 {...} 대신 큰따옴표 "..."로 둘러싸여 있을 때 유용할 수 있어요. SQL이 큰따옴표 "..." 안에 있으면 Tcl이 $-변수 대입을 수행하는데, 극도로 주의하지 않으면 SQL 인젝션으로 이어질 수 있어요. 하지만 Tcl은 SQL을 감싸는 데 큰따옴표 "..."를 쓰든 중괄호 {...}를 쓰든 상관없이 :-변수를 결코 대입하지 않으므로, :-변수를 사용하는 것은 SQL 인젝션에 대한 추가 방어 수단이 돼요.
3.2. close 메서드
이름이 암시하듯이 SQLite 데이터베이스의 "close" 메서드는 데이터베이스를 닫아요. 이는 dbcmd Tcl 명령을 삭제하는 부작용이 있어요. 열고 즉시 닫는 예시는 다음과 같아요:
sqlite3 db1 ./testdb
db1 close
dbcmd를 직접 삭제하면 "close" 메서드를 호출하는 것과 같은 효과가 있어요. 그래서 다음 코드는 앞선 것과 동등해요:
sqlite3 db1 ./testdb
rename db1 {}
3.3. transaction 메서드
"transaction" 메서드는 SQLite 데이터베이스 트랜잭션 안에서 TCL 스크립트를 실행하는 데 사용돼요. 스크립트가 완료되면 트랜잭션이 커밋되고, 스크립트가 실패하면 롤백돼요. 트랜잭션이 다른 트랜잭션 안에서 발생하면(BEGIN으로 수동 시작한 것도 포함) no-op이에요.
transaction 명령은 여러 SQLite 명령을 안전하게 묶는 데 사용할 수 있어요. 물론 항상 BEGIN으로 트랜잭션을 수동으로 시작할 수 있어요. 하지만 오류가 발생해서 COMMIT이나 ROLLBACK이 실행되지 않으면 데이터베이스는 무기한 잠긴 상태로 남아요. 또한 BEGIN은 중첩되지 않으므로 새 트랜잭션을 시작하기 전에 다른 활성 트랜잭션이 없는지 확인해야 해요. "transaction" 메서드는 이 모든 세부 사항을 자동으로 처리해요.
구문은 다음과 같아요:
dbcmd transaction ?transaction-type? script
transaction-type은 deferred, exclusive, immediate 중 하나일 수 있어요. 기본값은 deferred예요.
3.4. cache 메서드
위에서 설명한 "eval" 메서드는 최근에 평가된 SQL 명령에 대해 prepared statement 캐시를 유지해요. "cache" 메서드는 이 캐시를 제어하는 데 사용돼요. 이 명령의 첫 번째 형태는:
dbcmd cache size N
이것은 캐시할 수 있는 최대 문 수를 설정해요. 상한은 100이에요. 기본값은 10이에요. 캐시 크기를 0으로 설정하면 캐싱을 하지 않아요.
명령의 두 번째 형태는:
dbcmd cache flush
cache-flush 메서드는 현재 캐시에 있는 모든 prepared statement를 finalize해요.
3.5. complete 메서드
"complete" 메서드는 유일한 인자로 SQL이라고 가정된 문자열을 받아요. 문자열이 완전한 SQL 문이면 TRUE를, 더 입력할 것이 있으면 FALSE를 반환해요.
"complete" 메서드는 사용자가 SQL 코드 한 줄 입력을 끝냈는지 알기 위해 대화형 애플리케이션을 빌드할 때 유용해요. 이는 사실상 sqlite3_complete() C 함수의 인터페이스일 뿐이에요.
3.6. config 메서드
"config" 메서드는 sqlite3_db_config() 인터페이스를 사용해 데이터베이스 연결의 특정 구성 설정을 질의하거나 변경해요. 인자 없이 이 메서드를 실행하면 사용 가능한 구성 설정과 현재 값의 TCL 리스트를 얻어요:
dbcmd config
위 코드는 대략 다음과 같은 것을 반환해요:
defensive 0 dqs_ddl 1 dqs_dml 1 enable_fkey 0 enable_qpsg 0 enable_trigger 1 enable_view 1 fts3_tokenizer 1 legacy_alter_table 0 legacy_file_format 0 load_extension 0 no_ckpt_on_close 0 reset_database 0 trigger_eqp 0 trusted_schema 1 writable_schema 0
개별 구성 설정의 이름을 추가해 그 설정의 현재 값을 질의할 수 있어요. 선택적으로 boolean 값을 추가해 설정을 변경할 수 있어요.
최대 애플리케이션 보안을 위해 다음 네 가지 구성 변경이 권장돼요. trust_schema 설정을 끄면 가상 테이블과 위험한 SQL 함수가 트리거, 뷰, CHECK 제약, 생성된 컬럼, 표현식 인덱스 안에서 사용되는 것을 방지해요. dqs_dml과 dqs_ddl 설정을 끄면 큰따옴표로 묶인 문자열 사용을 방지해요. defensive를 켜면 shadow 테이블에 대한 직접 쓰기를 방지해요.
db config trusted_schema 0
db config defensive 1
db config dqs_dml 0
db config dqs_ddl 0
3.7. copy 메서드
"copy" 메서드는 파일에서 테이블로 데이터를 복사해요. 파일에서 성공적으로 처리된 행 수를 반환해요. copy 메서드의 구문은 다음과 같아요:
dbcmd copy conflict-algorithm table-name file-name ?column-separator? ?null-indicator?
Conflict-algorithm은 INSERT 문을 위한 SQLite 충돌 알고리즘 중 하나여야 해요: rollback, abort, fail, ignore, replace. 자세한 내용은 SQLite Language의 ON CONFLICT 절을 참고하세요. conflict-algorithm은 소문자로 지정해야 해요.
Table-name은 이미 테이블로 존재해야 해요. File-name은 존재해야 하고, 각 행은 테이블에 정의된 컬럼 수와 같은 수의 컬럼을 포함해야 해요. 파일의 한 줄이 정의된 컬럼 수보다 많거나 적게 포함하면, copy 메서드는 모든 삽입을 롤백하고 오류를 반환해요.
Column-separator는 선택적 컬럼 구분 문자 문자열이에요. 기본값은 ASCII 탭 문자 \t예요.
Null-indicator는 컬럼 값이 null임을 나타내는 선택적 문자열이에요. 기본값은 빈 문자열이에요. column-separator와 null-indicator는 선택적 위치 인자라는 점을 기억하세요; null-indicator를 지정하면 column-separator 인자를 지정해야 하고, 그 인자는 null-indicator 인자보다 앞에 와야 해요.
copy 메서드는 SQLite 쉘 명령 .import와 유사한 기능을 구현해요.
3.8. timeout 메서드
"timeout" 메서드는 데이터베이스 트랜잭션을 포기하기 전에 SQLite 라이브러리가 잠금이 해제되기를 기다리는 시간을 제어하는 데 사용돼요. 기본 타임아웃은 0밀리초예요. (즉, 기본 동작은 전혀 기다리지 않는 거예요.)
SQLite 데이터베이스는 여러 동시 읽기 또는 단일 쓰기를 허용하지만 둘 다는 아니에요. 어떤 프로세스가 데이터베이스에 쓰고 있으면 다른 프로세스는 읽거나 쓸 수 없어요. 어떤 프로세스가 데이터베이스를 읽고 있으면 다른 프로세스는 읽을 수 있지만 쓸 수는 없어요. 전체 데이터베이스가 단일 잠금을 공유해요.
SQLite가 데이터베이스를 열려고 시도하다가 잠겨 있음을 발견하면, 선택적으로 잠시 지연한 뒤 파일을 다시 열려 시도할 수 있어요. 이 과정은 쿼리가 타임아웃되고 SQLite가 실패를 반환할 때까지 반복돼요. 타임아웃은 조정할 수 있어요. 기본값이 0으로 설정되어 있어 데이터베이스가 잠겨 있으면 SQL 문이 즉시 실패해요. 하지만 "timeout" 메서드로 타임아웃 값을 양수로 변경할 수 있어요. 예를 들어:
db1 timeout 2000
timeout 메서드의 인자는 잠금이 해제되기를 기다리는 최대 밀리초 수예요. 따라서 위 예시에서 최대 지연은 2초가 될 거예요.
3.9. busy 메서드
"busy" 메서드는 "timeout"처럼 데이터베이스가 잠겨 있을 때만 작동해요. 하지만 "busy" 메서드는 프로그래머에게 취할 조치에 대한 훨씬 더 많은 제어를 제공해요. "busy" 메서드는 SQLite가 잠긴 데이터베이스를 열려고 할 때마다 호출되는 콜백 Tcl 프로시저를 지정해요. 콜백이 호출되기 전에 단일 정수 인자가 추가돼요. 그 인자는 현재 잠금 이벤트에 대해 busy 콜백이 이전에 호출된 횟수예요. 콜백이 잠시 동안(GUI 이벤트 서비스 같은) 다른 유용한 작업을 수행한 뒤 반환되어 잠금을 다시 시도할 수 있게 하는 것이 의도예요. 콜백 프로시저는 SQLite가 데이터베이스 열기를 다시 시도하기를 원하면 "0"을 반환하고, SQLite가 현재 작업을 포기하기를 원하면 "1"을 반환해야 해요.
busy 메서드를 인자 없이 호출하면, busy 메서드가 마지막으로 설정한 콜백 프로시저의 이름이 반환돼요. 콜백 프로시저가 설정되지 않았으면 빈 문자열이 반환돼요.
3.10. enable_load_extension 메서드
SQLite의 확장 로딩 메커니즘(load_extension() SQL 함수로 접근)은 기본적으로 꺼져 있어요. 이는 보안 예방책이에요. 애플리케이션이 load_extension() 함수를 사용하려면 먼저 이 메서드로 그 기능을 켜야 해요.
이 메서드는 확장 로딩 기능을 켜거나 끄는 단일 boolean 인자를 받아요.
최상의 보안을 위해 꼭 필요하지 않으면 이 메서드를 사용하지 말고, 이 메서드를 호출하기 전에 PRAGMA trusted_schema=OFF나 "db config trusted_schema 0" 메서드를 실행하세요.
이 메서드는 sqlite3_enable_load_extension() C/C++ 인터페이스에 대응해요.
3.11. exists 메서드
"exists" 메서드는 SQL 문을 실행한다는 점에서 "onecolumn" 및 "eval"과 유사해요. 차이는 "exists" 메서드가 항상 boolean 값을 반환한다는 것이에요. 실행한 SQL 문의 쿼리가 하나 이상의 행을 반환하면 TRUE이고, SQL이 빈 집합을 반환하면 FALSE예요.
"exists" 메서드는 테이블에 행이 존재하는지 테스트하는 데 흔히 사용돼요. 예를 들어:
if {[db exists {SELECT 1 FROM table1 WHERE user=$user}]} {
# Processing if $user exists
} else {
# Processing if $user does not exist
}
3.12. last_insert_rowid 메서드
"last_insert_rowid" 메서드는 가장 최근에 삽입된 데이터베이스 행의 ROWID인 정수를 반환해요.
3.13. function 메서드
"function" 메서드는 SQLite 엔진에 새 SQL 함수를 등록해요. 인자는 새 SQL 함수의 이름과 그 함수를 구현하는 TCL 명령이에요. 함수의 인자는 TCL 명령이 호출되기 전에 명령에 추가돼요.
보안상의 이유로 애플리케이션은 이 메서드를 사용하기 전에 먼저 PRAGMA trusted_schema=OFF를 설정하거나 "db config trusted_schema 0" 메서드를 실행하는 것이 권장돼요.
구문은 다음과 같아요:
dbcmd function sql-name ?options? script
다음 예시는 숫자 인자를 16진수 인코딩된 문자열로 변환하는 "hex"라는 새 SQL 함수를 만들어요:
db function hex {format 0x%X}
"function" 메서드는 다음 옵션을 받아요:
-
-argcount INTEGER — SQL 함수가 받는 인자 수를 지정해요. 기본값 -1은 임의의 인자 수를 의미해요.
-
-deterministic — 이 옵션은 함수가 같은 인자 값이 주어지면 항상 같은 답을 반환함을 나타내요. SQLite 쿼리 최적화기는 이 정보를 사용해 상수 입력으로 함수 호출의 답을 캐시하고, 함수를 반복 호출하는 대신 결과를 재사용해요.
-
-directonly — 이 옵션은 함수를 직접적인 최상위 SQL 문에서만 사용할 수 있도록 제한해요. 함수는 트리거, 뷰, CHECK 제약, 생성된 컬럼, 인덱스 표현식에서 접근할 수 없어요. 이 옵션은 모든 애플리케이션 정의 SQL 함수에 권장되며, 부작용이 있거나 애플리케이션의 내부 상태를 드러내는 SQL 함수에는 강력히 권장돼요.
- 보안 경고: 이 스위치가 없으면 공격자가 데이터베이스 파일의 스키마를 변경해 새 함수를 트리거나 뷰나 CHECK 제약 안에 포함시켜, 애플리케이션이 공격자가 선택한 매개변수로 함수를 실행하도록 속일 수 있어요. 따라서 새 함수에 부작용이 있거나 애플리케이션에 대한 내부 상태를 드러내는데 -directonly 옵션을 사용하지 않으면 잠재적 보안 취약점이에요.
-
-innocuous — 이 옵션은 함수에 부작용이 없고 입력 매개변수에서 직접 계산할 수 없는 정보를 누출하지 않음을 나타내요. 이 옵션을 지정하면 PRAGMA trusted_schema=OFF여도 함수가 트리거, 뷰, CHECK 제약, 생성된 컬럼, 및/또는 인덱스 표현식에서 사용될 수 있어요. 정말 필요하지 않으면 이 옵션의 사용은 권장되지 않아요.
-
-returntype integer|real|text|blob|any — 이 옵션은 함수가 반환하는 결과의 타입을 구성하는 데 사용돼요. 이 옵션을 "any"(기본값)로 설정하면 SQLite는 Tcl 값의 내부 타입에 기반해 함수 구현이 반환하는 각 값의 타입을 결정하려 해요. "text"나 "blob"으로 설정하면 반환 값은 각각 항상 텍스트나 blob 값이에요. "integer"로 설정하면 SQLite는 함수가 반환한 값을 정수로 강제 변환하려 해요. 데이터 손실 없이 불가능하면 real 값으로, 마지막으로 text로 강제 변환을 시도해요. "real"로 설정하면 real 값을 반환하려 시도하고 불가능하면 text로 대체해요.
3.51 버전부터 SQL 함수에서 전파되는 break는 빈 문자열과 구별되는 SQL NULL로 해석돼요.
3.14. nullvalue 메서드
"nullvalue" 메서드는 "eval" 메서드의 결과로 반환되는 NULL의 표현을 변경해요.
db1 nullvalue NULL
"nullvalue" 메서드는 Tcl에 NULL 표현이 없으므로 NULL과 빈 컬럼 값을 구별하는 데 유용해요. NULL 값의 기본 표현은 빈 문자열이에요.
3.15. onecolumn 메서드
"onecolumn" 메서드는 인자로 주어진 SQL 쿼리 문을 평가한다는 점에서 "eval"처럼 작동해요. 차이는 "onecolumn"이 쿼리 결과의 첫 번째 행의 첫 번째 컬럼인 단일 요소를 반환한다는 것이에요.
이것은 편의 메서드예요. 단일 컬럼 결과를 추출하기 위해 "eval"의 결과에 "[lindex ... 0]"을 해야 하는 수고를 사용자에게 덜어줘요.
메서드 이름이 어떤 고유 접두어로도 줄어들 수 있기 때문에, 이 메서드는 보통 전체 이름 "onecolumn" 대신 "one"으로 작성돼요.
3.16. changes 메서드
"changes" 메서드는 가장 최근 "eval" 메서드에 의해 삽입, 삭제, 및/또는 수정된 데이터베이스의 행 수인 정수를 반환해요.
3.17. total_changes 메서드
"total_changes" 메서드는 현재 데이터베이스 연결이 처음 열린 이후 삽입, 삭제, 및/또는 수정된 데이터베이스의 행 수인 정수를 반환해요.
3.18. authorizer 메서드
"authorizer" 메서드는 sqlite3_set_authorizer C/C++ 인터페이스에 대한 접근을 제공해요. authorizer의 인자는 특정 작업을 승인하기 위해 SQL 문이 컴파일될 때 호출되는 프로시저의 이름이에요. 콜백 프로시저는 코딩 중인 작업을 설명하는 5개의 인자를 받아요. 콜백이 텍스트 문자열 "SQLITE_OK"를 반환하면 작업이 허용돼요. "SQLITE_IGNORE"를 반환하면 작업이 조용히 비활성화돼요. 반환이 "SQLITE_DENY"이면 컴파일이 오류로 실패해요.
인자가 빈 문자열이면 authorizer가 비활성화돼요. 인자가 생략되면 현재 authorizer가 반환돼요.
3.19. bind_fallback 메서드
"bind_fallback" 메서드는 TCL 변수가 매개변수 이름과 일치하지 않을 때 매개변수 바인딩을 처리하는 방법을 애플리케이션에 제어권을 줘요.
eval 메서드가 SQL 문에서 "$abc"나 ":def"나 "@ghi" 같은 명명된 SQL 매개변수를 보면, 같은 이름의 TCL 변수를 찾으려 시도하고 그 TCL 변수의 값을 SQL 매개변수에 바인딩해요. 그런 TCL 변수가 없으면 기본 동작은 SQL NULL 값을 매개변수에 바인딩하는 거예요. 하지만 bind_fallback proc이 지정되어 있으면, 그 proc이 SQL 매개변수의 이름으로 호출되고 proc의 반환 값이 SQL 매개변수에 바인딩돼요. proc이 오류를 반환하면 SQL 문이 그 오류로 중단돼요. proc이 TCL_OK나 TCL_ERROR가 아닌 다른 코드로 반환하면 SQL 매개변수는 기본 동작처럼 NULL에 바인딩돼요.
"bind_fallback" 메서드는 단일 선택적 인자를 가져요. 인자가 빈 문자열이면 bind_fallback이 취소되고 기본 동작이 복원돼요. 인자가 비어 있지 않은 문자열이면, 그 인자는 어떤 TCL 변수와도 일치하지 않는 SQL 매개변수가 보일 때마다 호출할 TCL 명령(보통 proc의 이름)이에요. "bind_fallback" 메서드에 인자가 주어지지 않으면 현재 bind_fallback 명령이 반환돼요.
예를 들어, 다음 설정은 SQL 문에 어떤 전역 TCL 변수와도 일치하지 않는 매개변수가 포함되면 TCL이 오류를 던지게 해요:
proc bind_error {nm} {
error "no such variable: $nm"
}
db bind_fallback bind_error
3.20. progress 메서드
이 메서드는 쿼리 처리 중 주기적으로 호출되는 콜백을 등록해요. 두 개의 인자가 있어요: 호출 사이의 SQLite 가상 머신 opcode 수, 그리고 호출할 TCL 명령이에요. progress 콜백을 빈 문자열로 설정하면 비활성화돼요.
progress 콜백은 긴 쿼리의 상태를 표시하거나 긴 쿼리 동안 GUI 이벤트를 처리하는 데 사용할 수 있어요.
3.21. collate 메서드
이 메서드는 새 텍스트 collating sequence를 등록해요. 두 개의 인자가 있어요: collating sequence의 이름, 그리고 collating sequence에 대한 비교 함수를 구현하는 TCL 프로시저의 이름이에요.
예를 들어 다음 코드는 대소문자를 무시하고 텍스트 순서로 정렬하는 "NOCASE"라는 collating sequence를 구현해요:
proc nocase_compare {a b} {
return [string compare [string tolower $a] [string tolower $b]]
}
db collate NOCASE nocase_compare
3.22. collation_needed 메서드
이 메서드는 SQLite 엔진이 특정 collating sequence가 필요하지만 등록되어 있지 않을 때 호출되는 콜백 루틴을 등록해요. 콜백이 collating sequence를 등록할 수 있어요. 콜백은 필요한 collating sequence의 이름인 단일 매개변수로 호출돼요.
3.23. commit_hook 메서드
이 메서드는 SQLite가 데이터베이스에 변경을 커밋하려 하기 직전에 호출되는 콜백 루틴을 등록해요. 콜백이 예외를 던지거나 0이 아닌 결과를 반환하면 트랜잭션은 커밋 대신 롤백돼요.
3.24. rollback_hook 메서드
이 메서드는 SQLite가 롤백을 하려 하기 직전에 호출되는 콜백 루틴을 등록해요. 스크립트 인자는 변경 없이 실행돼요.
3.25. status 메서드
이 메서드는 가장 최근에 평가된 SQL 문에서 상태 정보를 반환해요. status 메서드는 "steps" 또는 "sorts" 중 하나여야 하는 단일 인자를 받아요. 인자가 "steps"이면 메서드가 이전 SQL 문이 평가한 전체 테이블 스캔 단계 수를 반환해요. 인자가 "sorts"이면 메서드가 정렬 작업 수를 반환해요. 이 정보는 검색이나 정렬을 가속하는 인덱스를 사용하지 않는 쿼리를 감지하는 데 사용할 수 있어요.
status 메서드는 기본적으로 sqlite3_stmt_status() C 언어 인터페이스의 래퍼예요.
3.26. update_hook 메서드
이 메서드는 UPDATE, INSERT, DELETE 문에 의해 각 행이 수정된 직후 호출되는 콜백 루틴을 등록해요. 콜백이 호출되기 전에 네 개의 인자가 추가돼요:
- 적절한 키워드 "INSERT", "UPDATE", "DELETE"
- 변경 중인 데이터베이스의 이름
- 변경 중인 테이블
- 변경 중인 테이블의 행의 rowid
콜백은 쿼리 실행처럼 update hook을 호출한 데이터베이스 연결을 수정하는 어떤 일도 해서는 안 돼요.
3.27. preupdate 메서드
이 메서드는 UPDATE, INSERT, DELETE 문에 의해 각 행이 수정되기 직전에 호출되는 콜백 루틴을 등록하거나, 임박한 업데이트와 관련된 특정 작업을 수행할 수 있어요.
preupdate 콜백을 등록하거나 제거하려면 다음 구문을 사용해요:
dbcmd preupdate hook ?SCRIPT?
preupdate 콜백이 등록되면, 각 행 수정 전에 콜백이 다음 인자로 실행돼요:
- 적절한 키워드 "INSERT", "UPDATE", "DELETE"
- 변경 중인 데이터베이스의 이름
- 변경 중인 테이블
- 변경 중인 테이블의 행의 원래 rowid
- 변경 중인 테이블의 행의 새 rowid (있다면)
콜백은 쿼리 실행처럼 preupdate hook을 호출한 데이터베이스 연결을 수정하는 어떤 일도 해서는 안 돼요.
콜백이 실행 중일 때만(그 때만), 다음 구문을 사용해 이 preupdate 작업을 수행할 수 있어요:
dbcmd preupdate count
dbcmd preupdate depth
dbcmd preupdate new INDEX
dbcmd preupdate old INDEX
count 하위 메서드는 삽입, 업데이트, 또는 삭제되는 행의 컬럼 수를 반환해요.
depth 하위 메서드는 업데이트 중첩 깊이를 반환해요. 직접 삽입, 업데이트, 삭제 작업이면 0이고, 최상위 트리거가 호출한 삽입/업데이트/삭제면 1이며, 트리거가 호출한 트리거로 인한 변경이면 더 높은 값이에요.
old와 new 하위 메서드는 각각 업데이트되는 행의 선택된 원래 또는 변경된 컬럼 값을 반환해요.
Tcl 인터페이스(그리고 기반 SQLite 라이브러리)가 전처리기 기호 SQLITE_ENABLE_PREUPDATE_HOOK가 정의된 상태로 빌드되어야 preupdate 메서드를 사용할 수 있다는 점을 기억하세요.
3.28. wal_hook 메서드
이 메서드는 데이터베이스가 WAL 모드일 때 트랜잭션 커밋 후 호출되는 콜백 루틴을 등록해요. 콜백 명령이 호출되기 전에 두 개의 인자가 추가돼요:
- 트랜잭션이 커밋된 데이터베이스의 이름
- 그 데이터베이스의 write-ahead log (WAL) 파일의 항목 수
이 메서드는 체크포인트를 직접 또는 후속 idle 콜백으로 실행하기로 결정할 수 있어요. SQLite는 단일 WAL hook만 허용한다는 점을 기억하세요. 기본적으로 이 단일 WAL hook은 자동 체크포인팅에 사용돼요. 명시적 WAL hook을 설정하면, 자동 체크포인팅 메커니즘이 비활성화되므로 그 WAL hook 하나가 체크포인트가 발생하도록 보장해야 해요.
이 메서드는 SQLite 오류 코드에 해당하는 정수 값을 반환해야 해요(성공 시 SQLITE_OK의 0, 어떤 오류 발생 시 SQLITE_ERROR의 1). sqlite3_wal_hook()처럼, SQLite 오류 코드에 해당하지 않는 정수를 반환한 결과는 정의되지 않아요. 스크립트가 반환한 값을 정수로 해석할 수 없거나 스크립트가 Tcl 예외를 던지면, SQLite에 오류가 반환되지 않지만 Tcl 배경 오류(background-error)가 발생해요.
3.29. incrblob 메서드
이 메서드는 데이터베이스의 기존 BLOB을 읽거나 쓰는 데 사용할 수 있는 TCL 채널을 열어요. 구문은 다음과 같아요:
dbcmd incrblob ?-readonly? ?DB? TABLE COLUMN ROWID
명령은 BLOB을 읽거나 쓰기 위한 새 TCL 채널을 반환해요. 채널은 기반 sqlite3_blob_open() C 언어 인터페이스를 사용해 열려요. TCL의 close 명령으로 채널을 닫아요.
3.30. errorcode 메서드
이 메서드는 가장 최근 SQLite 작업에서 발생한 숫자 오류 코드를 반환해요.
3.31. trace 메서드
"trace" 메서드는 각 SQL 문이 컴파일될 때 호출되는 콜백을 등록해요. SQL 텍스트가 호출 전에 단일 문자열로 명령에 추가돼요. 이는 (예를 들어) 애플리케이션이 수행하는 모든 SQL 작업의 로그를 유지하는 데 사용할 수 있어요.
3.32. trace_v2 메서드
"trace_v2" 메서드는 각 SQL 문이 컴파일될 때 호출되는 콜백을 등록해요. 구문은 다음과 같아요:
dbcmd trace_v2 ?callback? ?mask?
이 명령은 특정 조건이 발생할 때마다 "callback" 스크립트가 호출되게 해요. 조건은 mask 인자로 결정되며, 다음 키워드 중 0개 이상의 TCL-list여야 해요:
- statement
- profile
- row
- close
statement에 대한 트레이스는 새 SQL 문이 실행될 때마다 콜백을 두 인자로 호출해요. 첫 번째 인자는 기반 sqlite3_stmt 객체에 대한 포인터의 값인 정수예요. 이 정수는 SQL 문 텍스트를 profile이나 row 콜백의 결과와 연관시키는 데 사용할 수 있어요. 두 번째 인자는 실행 중인 SQL 문의 확장되지 않은 텍스트예요. "확장되지 않은"이란 텍스트의 변수 대입이 변수 값으로 확장되지 않음을 의미해요. 이는 변수 대입을 확장하는 "trace" 메서드의 동작과 다르다는 점이에요.
profile에 대한 트레이스는 각 SQL 문이 끝날 때 콜백을 두 인자로 호출해요. 첫 번째 인자는 기반 sqlite3_stmt 객체의 값인 정수예요. 두 번째 인자는 나노초 단위의 문 실행 시간 근사값이에요. 실행 시간은 애플리케이션이 실행되는 플랫폼의 기능에 따라 사용할 수 있는 최상의 추정치예요.
row에 대한 트레이스는 SQL 문에서 새 결과 행이 나올 때마다 콜백을 단일 인자로 호출해요. 그 인자는 기반 sqlite3_stmt 객체 포인터의 값인 정수예요.
close에 대한 트레이스는 데이터베이스 연결이 닫힐 때 콜백을 단일 인자로 호출해요. 그 인자는 닫히는 기반 sqlite3 객체에 대한 포인터의 값인 정수예요.
데이터베이스 연결에는 단일 trace 콜백만 등록할 수 있어요. "trace"나 "trace_v2"를 사용할 때마다 이전의 모든 trace 콜백을 취소해요.
3.33. backup 메서드
"backup" 메서드는 라이브 데이터베이스의 백업 복사본을 만들어요. 명령 구문은 다음과 같아요:
dbcmd backup ?source-database? backup-filename
선택적 source-database 인자는 현재 연결에서 어떤 데이터베이스를 백업할지 알려줘요. 기본값은 main(즉, 기본 데이터베이스 파일)이에요. TEMP 테이블을 백업하려면 temp를 사용해요. ATTACH 명령으로 연결에 추가된 보조 데이터베이스를 백업하려면, ATTACH 명령에서 그 데이터베이스에 지정한 이름을 사용해요.
backup-filename은 백업이 기록되는 파일의 이름이에요. Backup-filename은 미리 존재할 필요가 없지만, 존재한다면 잘 구성된 SQLite 데이터베이스여야 해요.
3.34. restore 메서드
"restore" 메서드는 별도의 데이터베이스 파일의 콘텐츠를 현재 데이터베이스 연결로 복사해 기존 콘텐츠를 덮어써요. 명령 구문은 다음과 같아요:
dbcmd restore ?target-database? source-filename
선택적 target-database 인자는 현재 연결에서 새 콘텐츠로 덮어쓸 데이터베이스를 알려줘요. 기본값은 main(즉, 기본 데이터베이스 파일)이에요. TEMP 테이블을 다시 채우려면 temp를 사용해요. ATTACH 명령으로 연결에 추가된 보조 데이터베이스를 덮어쓰려면, ATTACH 명령에서 그 데이터베이스에 지정한 이름을 사용해요.
source-filename은 콘텐츠가 추출되는 기존의 잘 구성된 SQLite 데이터베이스 파일의 이름이에요.
3.35. serialize 메서드
"serialize" 메서드는 기반 데이터베이스의 완전한 복사본인 BLOB을 만들어요. 구문은 다음과 같아요:
dbcmd serialize ?database?
선택적 인자는 직렬화할 스키마 또는 데이터베이스의 이름이에요. 기본값은 "main"이에요.
이 루틴은 식별된 데이터베이스의 완전한 콘텐츠인 TCL byte-array를 반환해요. 이 byte-array는 파일에 써서 일반 SQLite 데이터베이스로 사용하거나, TCP/IP 연결로 다른 애플리케이션에 보내거나, 다른 데이터베이스 연결의 "deserialize" 메서드에 전달할 수 있어요.
3.36. deserialize 메서드
"deserialize" 메서드는 SQLite 데이터베이스 파일을 포함하는 TCL byte-array를 받아 데이터베이스 연결에 추가해요. 구문은:
dbcmd deserialize ?database? value
선택적 database 인자는 역직렬화를 받을 ATTACH된 데이터베이스가 무엇인지 식별해요. 기본값은 "main"이에요.
이 명령은 SQLite가 이전 데이터베이스에서 연결을 끊고 value의 콘텐츠로 인메모리 데이터베이스에 다시 연결하게 해요. value가 잘 정의된 SQLite 데이터베이스를 포함하는 byte-array가 아니면, 후속 명령이 SQLITE_CORRUPT 오류를 반환할 가능성이 커요.
3.37. interrupt 메서드
"interrupt" 메서드는 sqlite3_interrupt() 인터페이스를 호출해 대기 중인 쿼리를 중단하게 해요.
3.38. version 메서드
현재 라이브러리 버전을 반환해요. 예를 들어 "3.23.0".
3.39. profile 메서드
이 메서드는 애플리케이션이 실행하는 SQL 문의 실행을 프로파일링하는 데 사용돼요. 구문은 다음과 같아요:
dbcmd profile ?script?
script가 빈 문자열이 아니면, 이 메서드는 각 SQL 문 실행 후에 script가 평가되도록 준비해요. script가 호출되기 전에 두 인자가 추가돼요: 실행된 SQL 문의 텍스트와 그 문을 실행하는 동안 경과한 시간(나노초).
데이터베이스 핸들은 언제든 단일 profile script만 등록할 수 있어요. profile 메서드가 호출될 때 이미 script가 등록되어 있으면 이전 profile script가 새 것으로 교체돼요. script 인자가 빈 문자열이면 이전에 등록된 profile 콜백은 취소되지만 새 profile script는 등록되지 않아요.
3.40. unlock_notify 메서드
unlock_notify 메서드는 테스트 목적으로 SQLite 핵심 라이브러리의 sqlite3_unlock_notify() 인터페이스에 접근하는 데 사용돼요. 애플리케이션이 이 메서드를 사용하는 것은 권장되지 않아요.
3.41. format 메서드
format 메서드는 SQLite 3.52.0 (2026-03-06) 버전에서 도입됐어요. format 메서드는 Query Result Formatter (QRF) 하위 시스템에 대한 인터페이스를 제공해요.
dbcmd format ?options? SQL
format 메서드는 인자로 주어진 SQL을 실행하고, 옵션에 따라 출력을 형식화한 뒤 형식화된 결과를 문자열로 반환해요. QRF는 복잡한 하위 시스템이므로 옵션이 많아요. 각 옵션은 sqlite3_qrf_spec 객체의 필드에 해당해요. 각 옵션의 TCL 이름, 허용된 인자, 그리고 그 옵션이 제어하는 sqlite3_qrf_spec 필드는 아래에 나열돼 있어요. 각 옵션의 의미에 대한 세부 사항은 QRF 문서를 참고하세요.
지정되지 않은 옵션은 적절히 "auto"나 0이나 빈 문자열로 기본 설정돼요.
- -style STYLE — STYLE은 "auto", "box", "column", "count", "csv", "eqp", "explain", "html", "insert", "json", "jobject", "line", "list", "markdown", "off", "quote", "stats", "statsest", "statsvm", "table" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eStyle 값을 결정해요.
- -esc ESC — ESC는 "auto", "off", "ascii", "symbol" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eEsc 값을 결정해요.
- -text ENCODING — ENCODING은 "auto", "csv", "html", "json", "plain", "relaxed", "sql", "tcl" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eText 값을 결정해요.
- -title ENCODING — ENCODING은 "on", "off", "auto", "csv", "html", "json", "plain", "relaxed", "sql", "tcl" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eTitle과 bTitles 값을 결정해요.
- -blob ENCODING — ENCODING은 "auto", "hex", "json", "tcl", "text", "size" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eBlob 값을 결정해요.
- -border auto|off|on — 이 옵션은 --style이 "box"나 "table"일 때 전체 결과 주위에 바깥 테두리를 그릴지 여부를 제어해요. 기본값은 테두리를 그리는 거예요. 하지만 이 설정이 "off"이면 테두리를 생략해요. 이 옵션은 sqlite3_qrf_spec의 bBorder 값을 제어해요.
- -wordwrap auto|off|on — 이 옵션은 sqlite3_qrf_spec의 bWordWrap 값을 제어해요.
- -textjsonb auto|off|on — 이 옵션은 sqlite3_qrf_spec의 bTextJsonb 값을 제어해요.
- -splitcolumn auto|off|on — 이 옵션은 sqlite3_qrf_spec의 bSplitColumn 값을 제어해요.
- -defaultalign ALIGNMENT — ALIGNMENT는 "auto", "bottom", "c", "center", "e", "left", "middle", "n", "ne", "nw", "right", "s", "se", "sw", "top", "w" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eDfltAlign 값을 제어해요.
- -titlealign ALIGNMENT — ALIGNMENT는 "auto", "bottom", "c", "center", "e", "left", "middle", "n", "ne", "nw", "right", "s", "se", "sw", "top", "w" 중 하나일 수 있어요. 이 옵션은 sqlite3_qrf_spec의 eTitleAlign 값을 제어해요.
- -align ALIGNMENT-LIST — ALIGNMENT-LIST는 각 토큰이 "auto", "bottom", "c", "center", "e", "left", "middle", "n", "ne", "nw", "right", "s", "se", "sw", "top", "w" 중 하나인 0개 이상의 토큰을 포함하는 TCL 리스트예요. 이 옵션은 sqlite3_qrf_spec의 nAlign과 aAlign 값을 결정해요.
- -wrap INTEGER — 이 옵션은 sqlite3_qrf_spec의 nWrap 값을 결정해요.
- -screenwidth INTEGER — 이 옵션은 sqlite3_qrf_spec의 nScreenWidth 값을 결정해요.
- -linelimit INTEGER — 이 옵션은 sqlite3_qrf_spec의 nLineLimit 값을 결정해요.
- -charlimit INTEGER — 이 옵션은 sqlite3_qrf_spec의 nCharLimit 값을 결정해요.
- -titlelimit INTEGER — 이 옵션은 sqlite3_qrf_spec의 nTitleLimit 값을 결정해요.
- -multiinsert INTEGER — 이 옵션은 sqlite3_qrf_spec의 nMultiInsert 값을 결정해요.
- -widths INTEGER-LIST — INTEGER-LIST는 정수의 TCL 리스트예요. 이 옵션은 sqlite3_qrf_spec의 nWidth와 aWidth 값을 결정해요.
- -columnsep STRING — 이 옵션은 sqlite3_qrf_spec의 zColumnSep 값을 설정해요.
- -rowsep STRING — 이 옵션은 sqlite3_qrf_spec의 zRowSep 값을 설정해요.
- -tablename STRING — 이 옵션은 sqlite3_qrf_spec의 zTableName 값을 설정해요.
- -null STRING — 이 옵션은 sqlite3_qrf_spec의 zNull 값을 설정해요.
더 알아보기 (Learn more)
- JSON Functions in SQLite — SQLite의 JSON 함수
- Bridging Tcl and JSON — Tcl에서 JSON 처리
- SQLite Forum — Tcl interface — Tcl 확장 관련 토론
- sqlite3 — Tcl 확장 소스 — tclsqlite.c 소스 코드