Dışa Aktarma SQL Değil, Shell İşidir
SQLite'ta Postgres veya MySQL'deki gibi COPY ... TO ya da SELECT INTO OUTFILE benzeri bir komut yoktur. SQLite veri dışa aktarma işlemleri SQL ifadeleriyle değil, doğrudan sqlite3 komut satırı kabuğundan yürütülür ve nokta-komutlar üzerinden çalışır: .mode, .headers, .output, .dump. Bu dördünü öğrendiğinizde, herhangi bir veritabanından CSV, JSON, düz metin veya tam bir SQL dump üretebilirsiniz.
Mantık şu: kabuğa sonuçları nasıl biçimlendireceğini (.mode), sütun adlarının eklenip eklenmeyeceğini (.headers) ve çıktının nereye gideceğini (.output) söylüyorsunuz. Ardından sorguyu çalıştırıyorsunuz ve sonuç dosyaya düşüyor.
Şimdi üzerinde oynayabileceğimiz küçük bir veritabanı kuralım:
Üç satır, dört sütun. Bu tabloyu birkaç farklı formatta dışa aktaracağız.
CSV olarak dışa aktarma: başlıklı .mode csv
CSV, en yaygın kullanılan dışa aktarma formatıdır — elektronik tablolar, veri akışları ve diğer araçların çoğu bu formatla konuşur. sqlite3 kabuğunda şu komutları kullanabilirsiniz:
sqlite> .mode csv
sqlite> .headers on
sqlite> .output users.csv
sqlite> SELECT * FROM users;
sqlite> .output stdout
Az önce ne yaptık:
.mode csv, her satırı virgülle ayrılmış değerler olarak biçimlendirir; içinde virgül, tırnak veya satır sonu geçen alanları otomatik olarak tırnak içine alır..headers onile dosyanın ilk satırına sütun adları yazılır. Bu olmadan CSV'nizin başlığı olmaz — genelde istediğiniz şey değildir..output users.csv, sonuçları bir dosyaya yönlendirir. Bu noktadan sonra sorgu çıktıları ekrana değil dosyaya yazılır.SELECTçalışır ve sessiz sedasız dosyaya yazar..output stdout, çıktıyı tekrar terminale döndürür; böylece bir sonraki sorgunun sonuçlarını ekranda görebilirsiniz.
Oluşan dosya:
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
Yalnızca tabloların tamamını değil, herhangi bir sorgunun sonucunu da dışa aktarabilirsiniz; filtreleyin, join'leyin, aggregate edin, sonra çıktıyı dosyaya yönlendirin:
sqlite> .output recent_users.csv
sqlite> SELECT name, email FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
Shell'den Tek Satırlık Komutla Dışa Aktarma
Aslında interaktif kabuğu hiç açmanıza bile gerek yok. Nokta komutlarını ve SQL ifadelerini doğrudan işletim sisteminizin terminalinden sqlite3'e pipe ile gönderebilirsiniz:
sqlite3 mydb.sqlite <<EOF
.headers on
.mode csv
.output users.csv
SELECT * FROM users;
EOF
Bu yöntem, scriptler ve cron job'lar için tam aradığınız şey — tekrarlanabilir ve elle bir şey yazmana gerek yok. .output komutu yalnızca o oturuma özel olduğundan, hiçbir yere durum sızdırmaz.
JSON formatı: .mode json
Çıktıyı bir web uygulamasına ya da JSON tüketen bir araca gönderecekseniz, .mode json her satırı bir nesne olacak şekilde nesne dizisi üretir:
sqlite> .mode json
sqlite> .output users.json
sqlite> SELECT * FROM users;
sqlite> .output stdout
The file:
[{"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"}]
JSON'da başlıklar zaten anahtarlar üzerinden örtük olarak gelir, dolayısıyla burada .headers ayarının bir hükmü yok. İç içe nesneler ya da yeniden adlandırılmış alanlar gibi özel bir yapı istiyorsanız, bunu sorgunun içinde json_object() ile kurmanız gerekir:
Bu sayede her satır için yapısını tamamen kontrol edebildiğiniz JSON dizeleri elde edersiniz. Sonucun tamamını tek bir JSON belgesine dönüştürmek isterseniz json_group_array() ile birleştirebilirsiniz.
Tam SQL dump alma: .dump komutu
.dump, CSV veya JSON dışa aktarmadan farklı bir kategoride yer alır. Hem şemayı hem de tüm veriyi CREATE TABLE ve INSERT ifadeleri halinde içeren bir .sql dosyası üretir; yani veritabanını sıfırdan yeniden oluşturmaya yetecek her şeyi:
sqlite3 mydb.sqlite .dump > backup.sql
A snippet of what comes out:
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;
Geri yükleme ise tam tersi bir işlem; dosyayı yeni bir veritabanına şu şekilde aktarıyorsunuz:
sqlite3 restored.sqlite < backup.sql
.dump, yedek almak, test verilerini sürüm kontrolüne göndermek ya da veritabanını başka bir makineye taşımak için en doğru araçtır. Şemadaki her şeyi olduğu gibi korur: indeksler, tetikleyiciler, görünümler — hepsi içeride.
Tek Bir Tabloyu Dışa Aktarmak
.dump komutuna bir tablo adı (ya da desen) vererek çıktıyı tek bir tabloyla sınırlayabilirsiniz:
sqlite3 mydb.sqlite ".dump users" > users_only.sql
Bu komut yalnızca users tablosunun şemasını ve satırlarını dışa aktarır. Diğer tabloları taşımadan tek bir tabloyu başka bir veritabanına kopyalamak istediğinizde işinize yarar. Desen eşleştirme de yapabilirsiniz: .dump 'log_%' komutu, adı log_ ile başlayan tüm tabloları döker.
Veriyi Almadan Sadece Şemayı Dışa Aktarma
Bazen satırlar olmadan yalnızca yapıya ihtiyaç duyarsınız — dokümantasyon hazırlarken, temiz bir geliştirme ortamı kurarken ya da farklı veritabanlarının şemalarını karşılaştırırken. .schema komutu yalnızca CREATE ifadelerini yazdırır:
sqlite3 mydb.sqlite .schema > schema.sql
Tek bir tabloyu almak isterseniz yanına tablo adını yazmanız yeterli:
sqlite3 mydb.sqlite ".schema users" > users_schema.sql
Çıktı, boş bir veritabanında doğrudan çalıştırabileceğiniz saf SQL'dir: CREATE TABLE, CREATE INDEX, CREATE TRIGGER ifadeleri.
İşinize Yarayacak Diğer Modlar
.mode komutu yalnızca CSV ve JSON ile sınırlı değil. Bilmeye değer birkaç seçenek daha var:
.mode column -- hizalanmış sütunlar, terminalde okumak için güzel
.mode markdown -- pipe ile ayrılmış, GitHub uyumlu tablolar
.mode html -- HTML <table> çıktısı
.mode tabs -- sekme ile ayrılmış değerler (TSV)
.mode insert users -- belirtilen tablo için INSERT ifadeleri üretir
.mode quote -- SQL ile tırnaklanmış değerler, inceleme için kullanışlı
.mode markdown, sorgu sonuçlarını bir README'ye ya da pull request'e yapıştırmak istediğinde tam aradığınız şey. .mode insert <tablo> ise hızlıca seed verisi üretmenin pratik bir yolu — bir SELECT çalıştır, çıkan INSERT ifadelerini al, fixture dosyana yapıştır, bitti.
sqlite> .mode insert users
sqlite> .output seed.sql
sqlite> SELECT * FROM users WHERE signup_date >= '2025-02-01';
sqlite> .output stdout
Pratik Birkaç Not
.output stdout(veya argümansız.output) çıktıyı tekrar terminale döndürür. Bunu unutursanız bir sonraki sorgunuzun sonuçları sessiz sessiz dosyaya yazılır ve kaybolur.- CSV dışa aktarımı veri tiplerini korumaz. Dosyada her şey metne dönüşür ve geri içeri aktarırken yorumlamak için bir hedef şemaya ihtiyacınız olur. Veriyi başka bir SQLite veritabanına geri taşımak istiyorsanız
.dumpkullanın. - Büyük dışa aktarımlar akış halinde çalışır.
.output, satırlar üretildikçe dosyaya yazar; bu sayede RAM'den daha büyük tabloları bile sorunsuz dökebilirsiniz. - Çalışan bir veritabanından sıcak yedek almak için
.dumpiş görür, ama müfredatın ilerleyen bölümlerinde göreceğiniz.backupkomutu hem daha hızlı hem de daha güvenlidir; çünkü SQLite'ın online backup API'sini kullanır.
Sırada: Veri Sorgulama
Veri yazma tarafının tamamını artık görmüş oldunuz: INSERT, UPDATE, DELETE, UPSERT, RETURNING, CSV'den içe aktarma ve geri dışa aktarma. Şimdi sıra veritabanı çalışmasının diğer yarısında — veriyi verimli biçimde okumakta. Zamanınızın büyük kısmını SELECT ifadesiyle geçireceksiniz; o da bir sonraki sayfanın konusu.
Sıkça Sorulan Sorular
SQLite tablosunu CSV olarak nasıl dışa aktarırım?
sqlite3 kabuğunda önce CSV moduna geçin, başlıkları açın, çıktıyı bir dosyaya yönlendirin ve sorgunuzu çalıştırın: sırayla .mode csv, .headers on, .output users.csv ve ardından SELECT * FROM users;. İşiniz bittikten sonra .output stdout diyerek çıktıyı tekrar terminale geri alabilirsiniz.
.dump ile CSV dışa aktarma arasındaki fark nedir?
.dump komutu; CREATE TABLE ve INSERT ifadelerini içeren bir .sql dosyası üretir, yani veritabanını sıfırdan yeniden kurmak için ihtiyacınız olan her şeyi verir. CSV ise sadece tek bir tablonun ya da sorgunun satırlarını dışa aktarır, şema bilgisi içermez. Yedek almak ve veritabanını taşımak için .dump, veriyi Excel veya başka araçlara devretmek için CSV kullanın.
SQLite sorgu sonuçlarını JSON olarak alabilir miyim?
Evet. İki yol var: ya kabukta .mode json ayarlayıp herhangi bir SELECT çalıştırırsınız ya da sorgunun içinde json_object() ve json_group_array() fonksiyonlarını kullanarak JSON'u kendiniz oluşturursunuz. Hızlı dışa aktarmalar için .mode json daha pratik; çıktının yapısını birebir kontrol etmek istediğinizde fonksiyon yaklaşımı daha esnek.