Ekspor Adalah Tugas Shell, Bukan Pernyataan SQL
SQLite tidak punya COPY ... TO atau SELECT INTO OUTFILE seperti Postgres atau MySQL. Ekspor data dilakukan di command-line shell sqlite3, dikendalikan oleh dot command: .mode, .headers, .output, .dump. Begitu kamu menguasai keempatnya, kamu bisa menghasilkan CSV, JSON, teks biasa, atau SQL dump lengkap dari database mana pun.
Gambaran sederhananya: kamu memberi tahu shell bagaimana memformat hasil (.mode), apakah menyertakan nama kolom (.headers), dan ke mana mengirim output-nya (.output). Lalu kamu menjalankan query, dan hasil query itu masuk ke file.
Kita siapkan database kecil untuk dicoba:
Tiga baris, empat kolom. Kita akan mengekspornya dalam beberapa format.
CSV: .mode csv dengan Header
CSV adalah format ekspor yang paling umum: spreadsheet, pipeline data, dan sebagian besar tool lain memahaminya. Di dalam shell sqlite3:
sqlite> .mode csv
sqlite> .headers on
sqlite> .output users.csv
sqlite> SELECT * FROM users;
sqlite> .output stdout
Yang baru saja terjadi:
.mode csvmemformat setiap baris sebagai nilai yang dipisahkan koma, dan memberi tanda kutip pada field yang mengandung koma, tanda kutip, atau baris baru..headers onmenambahkan baris pertama berisi nama kolom. Tanpanya, CSV-mu tidak punya header, dan biasanya bukan itu yang kamu mau..output users.csvmengalihkan hasil ke sebuah file. Mulai saat itu, output query masuk ke sana, bukan ke layar.SELECTberjalan dan menulis ke file tanpa menampilkan apa pun..output stdoutmengembalikan output ke terminal agar kamu bisa melihat hasil query berikutnya.
File yang dihasilkan:
id,name,email,signup_date
1,"Ada Lovelace",ada@example.com,2025-01-15
2,"Boris Johnson",boris@example.com,2025-02-03
3,"Carmen Diaz",carmen@example.com,2025-03-22
Kamu bisa mengekspor hasil query apa pun, tidak hanya seluruh tabel: filter, join, agregasi, lalu alihkan output-nya:
sqlite> .output recent_users.csv
sqlite> SELECT name, email FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
Satu Baris dari Shell
Kamu sama sekali tidak perlu masuk ke shell interaktif. Kirim dot command dan SQL ke sqlite3 dari shell sistem operasimu:
sqlite3 mydb.sqlite <<EOF
.headers on
.mode csv
.output users.csv
SELECT * FROM users;
EOF
Inilah bentuk yang kamu butuhkan untuk skrip dan cron job: bisa diulang, tanpa mengetik manual. .output hanya berlaku di sesi itu, jadi tidak meninggalkan efek di tempat lain.
JSON: .mode json
Untuk ekspor yang ditujukan ke aplikasi web atau tool yang membaca JSON, .mode json menghasilkan array berisi objek, satu untuk setiap baris:
sqlite> .mode json
sqlite> .output users.json
sqlite> SELECT * FROM users;
sqlite> .output stdout
File-nya:
[{"id":1,"name":"Ada Lovelace","email":"ada@example.com","signup_date":"2025-01-15"},
{"id":2,"name":"Boris Johnson","email":"boris@example.com","signup_date":"2025-02-03"},
{"id":3,"name":"Carmen Diaz","email":"carmen@example.com","signup_date":"2025-03-22"}]
Header sudah tersirat di JSON (berupa key), jadi .headers tidak berlaku di sini. Kalau kamu ingin bentuk khusus, seperti objek bersarang atau field yang diganti namanya, bangun di dalam query dengan json_object():
Hasilnya adalah string JSON per baris dengan kendali penuh atas strukturnya. Gabungkan dengan json_group_array() untuk menggulung seluruh hasil menjadi satu dokumen JSON.
SQL Dump Lengkap: .dump
.dump berbeda jenisnya dari CSV atau JSON. Ia menghasilkan file .sql berisi skema dan semua data dalam bentuk pernyataan CREATE TABLE dan INSERT, cukup untuk membangun ulang database dari kosong:
sqlite3 mydb.sqlite .dump > backup.sql
Potongan dari hasilnya:
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT NOT NULL,
signup_date TEXT NOT NULL
);
INSERT INTO users VALUES(1,'Ada Lovelace','ada@example.com','2025-01-15');
INSERT INTO users VALUES(2,'Boris Johnson','boris@example.com','2025-02-03');
INSERT INTO users VALUES(3,'Carmen Diaz','carmen@example.com','2025-03-22');
COMMIT;
Restore adalah operasi kebalikannya: kirim file itu kembali ke database yang baru:
sqlite3 restored.sqlite < backup.sql
.dump adalah alat yang tepat untuk backup, snapshot data uji di version control, dan migrasi antarmesin. Ia mempertahankan index, trigger, view, semua yang ada di skema.
Dump Satu Tabel Saja
.dump menerima nama tabel (atau pola) untuk membatasi output-nya:
sqlite3 mydb.sqlite ".dump users" > users_only.sql
Perintah itu hanya membuat dump skema dan baris dari tabel users. Berguna kalau kamu ingin menyalin satu tabel ke database lain tanpa membawa sisanya. Kamu juga bisa memakai pola: .dump 'log_%' membuat dump setiap tabel yang namanya diawali log_.
Skema Tanpa Data
Kadang kamu ingin strukturnya tanpa baris, untuk dokumentasi, lingkungan pengembangan yang bersih, atau membandingkan skema antardatabase. .schema hanya mencetak pernyataan CREATE:
sqlite3 mydb.sqlite .schema > schema.sql
Pasangkan dengan nama tabel untuk mendapatkan satu tabel saja:
sqlite3 mydb.sqlite ".schema users" > users_schema.sql
Output-nya adalah SQL biasa, yaitu CREATE TABLE, CREATE INDEX, CREATE TRIGGER, yang siap dijalankan pada database kosong.
Mode Lain yang Berguna
.mode punya lebih banyak pilihan selain CSV dan JSON. Beberapa yang perlu diketahui:
.mode column -- aligned columns, nice for reading at the terminal
.mode markdown -- pipe-separated, GitHub-friendly tables
.mode html -- HTML <table> output
.mode tabs -- tab-separated values (TSV)
.mode insert users -- emits INSERT statements for the named table
.mode quote -- SQL-quoted values, useful for inspection
.mode markdown bagus untuk menempelkan hasil query ke README atau pull request. .mode insert <table> adalah cara cepat membuat data seed: jalankan SELECT, tangkap pernyataan INSERT-nya, lalu tempelkan ke file fixture.
sqlite> .mode insert users
sqlite> .output seed.sql
sqlite> SELECT * FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
Beberapa Catatan Praktis
.output stdout(atau.outputtanpa argumen) mengembalikan output ke terminal. Kalau kamu lupa, hasil query berikutnya diam-diam hilang ke dalam file.- Ekspor CSV tidak mempertahankan tipe. Semuanya menjadi teks di file, dan saat diimpor ulang butuh skema tujuan untuk menafsirkannya. Pakai
.dumpkalau memindahkan data bolak-balik ke database SQLite lain itu penting. - Ekspor besar dialirkan.
.outputmenulis baris begitu dihasilkan, jadi kamu bisa membuat dump tabel yang lebih besar dari RAM tanpa masalah. - Untuk hot backup dari database yang sedang dipakai,
.dumpbisa dipakai, tapi perintah khusus.backup(dibahas nanti di kurikulum) lebih cepat dan lebih aman karena memakai online backup API milik SQLite.
Berikutnya: Query Data
Sekarang kamu sudah punya gambaran lengkap tentang menulis data: INSERT, UPDATE, DELETE, UPSERT, RETURNING, impor dari CSV, dan ekspor kembali. Berikutnya adalah separuh lain dari bekerja dengan database: membaca data secara efisien. Pernyataan SELECT adalah tempat sebagian besar waktumu akan dihabiskan, dan itu halaman berikutnya.
Pertanyaan yang sering diajukan
Bagaimana cara mengekspor tabel SQLite ke CSV?
Dari shell sqlite3, pindah ke mode CSV, nyalakan header, arahkan output ke sebuah file, lalu jalankan query: .mode csv, .headers on, .output users.csv, lalu SELECT * FROM users;. Jalankan .output stdout setelahnya untuk mengembalikan hasil ke terminal.
Apa bedanya .dump dan ekspor ke CSV?
.dump menghasilkan file .sql berisi pernyataan CREATE TABLE dan INSERT, yaitu semua yang dibutuhkan untuk membangun ulang database dari awal. CSV hanya mengekspor baris dari satu query atau tabel, tanpa skema. Pakai .dump untuk backup dan migrasi; pakai CSV untuk menyerahkan data ke spreadsheet atau tool lain.
Bisakah saya mengekspor hasil query SQLite ke JSON?
Bisa. Atur .mode json di shell lalu jalankan SELECT apa pun, atau pakai fungsi bawaan json_object() dan json_group_array() untuk membangun JSON di dalam query. Cara .mode json lebih sederhana untuk ekspor sesaat; cara dengan fungsi memberimu kendali penuh atas bentuknya.