Impor dan Ekspor

Mengisi tabel dari CSV dengan .import serta mengarsipkan basis data dengan .dump dan .output.

Daftar isi

Data untuk basis data sering sudah tersedia sebagai berkas teks, dan hasil pengolahan sering perlu dikirim ke luar SQLite. Topik ini membahas tiga perintah titik yang menutup kebutuhan itu, yaitu .import untuk memasukkan berkas CSV ke sebuah tabel, .dump untuk mengarsipkan basis data sebagai teks SQL, dan .output untuk menulis hasil query ke berkas. Seluruh contohnya dieksekusi di terminal dengan basis data contoh perpustakaan.

Berkas CSV dan tabel tujuan#

Basis data contoh dibuat terlebih dahulu dengan tabel buku dan tabel anggota yang baru terisi dua anggota.

bash
# membuat basis data perpustakaan.db beserta dua tabel dan isinya
sqlite3 perpustakaan.db <<'SQL'
CREATE TABLE buku (
  id      INTEGER PRIMARY KEY,
  judul   TEXT NOT NULL,
  penulis TEXT NOT NULL,
  tahun   INTEGER
);
CREATE TABLE anggota (
  id     INTEGER PRIMARY KEY,
  nama   TEXT NOT NULL,
  gabung DATE
);
INSERT INTO buku (judul, penulis, tahun) VALUES
  ('Kisah Kota Tua', 'Sari Wulandari', 2018),
  ('Anak Sungai', 'Rahmat Hidayat', 2021),
  ('Musim di Ujung Jalan', 'Lina Marlina', 2019);
INSERT INTO anggota (nama, gabung) VALUES
  ('Ali', '2026-01-12'),
  ('Budi', '2026-02-03');
SQL

Berkas anggota.csv berikut berisi empat anggota baru yang akan dimasukkan. CSV (comma-separated values) adalah format teks sederhana yang menyimpan satu baris data per baris berkas dengan nilai dipisahkan tanda koma. Baris pertamanya berupa kepala kolom yang menamai setiap kolom, sedangkan baris sisanya berupa data.

csv anggota.csv
id,nama,gabung
3,Citra,2026-03-02
4,Dewi,2026-03-17
5,Eka,2026-04-08
6,Farhan,2026-04-25

Urutan kolom pada berkas sengaja disamakan dengan urutan kolom tabel anggota, yaitu id, nama, dan gabung. Kecocokan urutan ini penting karena .import memetakan nilai berdasarkan posisi kolom, bukan berdasarkan namanya. Berkas CSV yang kolomnya tertukar akan menghasilkan baris dengan isi yang tertukar pula, dan pembacaan ulang tabel tidak memperbaiki kekeliruan semacam itu dengan mudah.

Format CSV juga memiliki aturan pelarian sederhana. Apabila sebuah nilai memuat koma atau tanda kutip, nilai itu ditulis di dalam tanda kutip ganda dan tanda kutip di dalamnya digandakan. Data contoh pada topik ini tidak memuat karakter demikian, sehingga seluruh nilai tampil polos. Kolom gabung berupa teks tanggal berformat tahun-bulan-hari, yaitu bentuk yang tersusun menurut abjad sama dengan urutan waktunya, sehingga pengurutan dan perbandingannya tetap benar.

Mengimpor dengan .import#

Perintah titik .import membaca berkas teks dan memasukkan setiap barisnya ke tabel yang ditunjuk. Opsi –csv memerintahkan pembacaan dalam format CSV dengan pemisah koma, sedangkan opsi –skip 1 melewati satu baris pertama berupa kepala kolom.

bash
# .import --csv --skip 1 memasukkan isi anggota.csv dengan baris kepala dilewati
printf '.import --csv --skip 1 anggota.csv anggota\n' | sqlite3 perpustakaan.db

Perintah di atas berjalan senyap, sesuai kebiasaan perintah command line ketika berhasil. Keberhasilannya diverifikasi dengan SELECT berikut.

bash
# memastikan seluruh anggota kini ada di tabel
sqlite3 -header -column perpustakaan.db "SELECT * FROM anggota ORDER BY id;"
text Keluaran
id   nama     gabung
--  ------  ----------
 1  Ali     2026-01-12
 2  Budi    2026-02-03
 3  Citra   2026-03-02
 4  Dewi    2026-03-17
 5  Eka     2026-04-08
 6  Farhan  2026-04-25

Enam baris kini ada di tabel anggota, dua baris lama beserta empat baris baru dari berkas CSV. Kolom id terisi nilai dari berkas, sehingga anggota baru memperoleh nomor 3 sampai 6 tanpa menggeser baris yang sudah ada. Pola yang sama dipakai untuk berkas CSV lain sepanjang urutan kolomnya cocok dengan tabel tujuannya. Nilai –skip juga dapat disesuaikan dengan jumlah baris awalan yang harus dilewati, dan apabila berkasnya tidak memuat baris kepala sama sekali, opsinya boleh digugurkan.

Arsip SQL dengan .dump#

Perintah titik .dump menghasilkan ulang basis data sebagai rangkaian pernyataan SQL, mulai dari CREATE TABLE sampai INSERT untuk setiap baris. Argumen berupa pola nama membatasi keluaran pada tabel tertentu saja.

bash
# .dump anggota menghasilkan ulang tabel anggota sebagai teks SQL
printf '.dump anggota\n' | sqlite3 perpustakaan.db
text Keluaran
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE anggota (
  id     INTEGER PRIMARY KEY,
  nama   TEXT NOT NULL,
  gabung DATE
);
INSERT INTO anggota VALUES(1,'Ali','2026-01-12');
INSERT INTO anggota VALUES(2,'Budi','2026-02-03');
INSERT INTO anggota VALUES(3,'Citra','2026-03-02');
INSERT INTO anggota VALUES(4,'Dewi','2026-03-17');
INSERT INTO anggota VALUES(5,'Eka','2026-04-08');
INSERT INTO anggota VALUES(6,'Farhan','2026-04-25');
COMMIT;

Keluaran itu dapat dibaca persis seperti skrip SQL, dan memang demikian fungsinya. Perintah PRAGMA di awal mematikan pemeriksaan kunci asing (foreign key, aturan hubungan antartabel) selama pemulihan berlangsung, kemudian transaksi dibuka, seluruh pernyataan pembuatan dan pengisian ditulis satu per satu, dan transaksi ditutup dengan COMMIT. Karena berupa teks biasa, arsip semacam ini dapat disimpan di sistem pengontrol versi, dibaca manusia, dan dipindahkan antar versi SQLite tanpa risiko format biner.

Arsip penuh diambil dengan .dump tanpa argumen, dan pemulihannya cukup dengan mengirim arsip tersebut ke sqlite3 pada nama berkas baru.

bash
# seluruh basis data diarsipkan ke berkas teks lewat pengalihan shell
sqlite3 perpustakaan.db ".dump" > cadangan.sql
# arsip dipulihkan menjadi basis data baru bernama salinan.db
sqlite3 salinan.db < cadangan.sql
# isi salinan diperiksa
sqlite3 salinan.db "SELECT count(*) FROM buku;"
text Keluaran
3

Tiga baris buku pada salinan.db membuktikan arsip kembali utuh. Pola dump lalu pulihkan ini menjadi cara paling mudah memindahkan basis data antar mesin, selama SQLite tersedia di kedua sisi. Keluaran .dump juga dapat dipipakan langsung ke perintah lain, misalnya gzip, bila arsip ingin dipadatkan seketika tanpa menyimpan salinan teksnya lebih dahulu.

Mengekspor hasil query dengan .output#

Perintah titik .output mengalihkan keluaran berikutnya ke sebuah berkas sampai .output stdout dipanggil kembali. Untuk ekspor CSV, mode diubah ke csv dan .headers on diaktifkan agar berkasnya langsung memuat kepala kolom.

bash
# .output mengalihkan keluaran ke berkas sampai .output stdout dipanggil
printf '.output ekspor-anggota.csv\n.mode csv\n.headers on\nSELECT id, nama, gabung FROM anggota ORDER BY id;\n.output stdout\n' | sqlite3 perpustakaan.db

Isi berkasnya dibaca balik dengan cat.

bash
# berkas hasil ekspor dibaca balik
cat ekspor-anggota.csv
text Keluaran
id,nama,gabung
1,Ali,2026-01-12
2,Budi,2026-02-03
3,Citra,2026-03-02
4,Dewi,2026-03-17
5,Eka,2026-04-08
6,Farhan,2026-04-25

Setiap nilai diekspor tanpa tanda kutip karena tidak ada nilai yang memuat koma atau tanda kutip, dan sqlite3 hanya mengutip apabila diperlukan. Lupa memanggil .output stdout adalah kecerobohan yang lazim, sebab seluruh keluaran berikutnya akan terus ditulis ke berkas sampai sesi ditutup. Pemisah pada mode list juga dapat diganti dengan .separator, sedangkan pemisah CSV sudah bawaan berupa koma.

Untuk kebutuhan satu query saja, perintah titik .once melakukan hal serupa dengan lebih singkat. Perintah ini menulis keluaran query berikutnya ke berkas yang ditunjuk, lalu kembali otomatis ke layar tanpa perlu .output stdout. Dengan begitu, laporan berupa hasil query tertentu dapat diproduksi ulang kapan saja dalam satu baris perintah.

Ringkasan#

  • .import –csv –skip 1 memasukkan isi CSV dengan pemetaan posisi kolom, dan tabel tujuan sebaiknya sudah dibuat agar tipe kolomnya terjaga.
  • .dump menghasilkan arsip SQL lengkap yang dapat dibatasi pola nama, lalu dipulihkan dengan mengirimkannya kembali ke sqlite3 pada berkas baru.
  • .output berkas mengalihkan keluaran ke berkas sampai .output stdout dipanggil kembali.
  • Kombinasi .mode csv dan .headers on menghasilkan ekspor CSV berkepala kolom.

Referensi#