SQLite komut satırı aracında sorgu sonuçlarının nasıl görüneceğini .mode komutu belirler. .mode list değerleri | ile ayırır, .mode csv virgülle ayrılmış ve tırnaklanmış değerler üretir, .mode json her satırı bir JSON nesnesine çevirir, .mode line her sütunu ayrı satıra yazar, .mode insert sonuçları INSERT ifadelerine dönüştürür, .mode box ve .mode table ise ekranda okunur tablolar çizer. Komutu argümansız yazarsanız geçerli biçimi gösterir.
Bu komut, SQLite'ın son sürümlerinde en çok değişen parçalardan biridir. Belgeler, .mode komutunun baştan tasarlandığını, etkileşimli oturumların varsayılan görünümünün kutu çizgili bir tabloya geçtiğini ve bazı eski komutların yeni seçeneklerle değiştirildiğini anlatır. Bu yazıda önce bütün sürümlerde çalışan temel biçimleri SQLite 3.50.6 aracında çalıştırarak gösteriyor, ardından yeni sürümlerdeki değişiklikleri belgelere dayanarak açıklıyoruz. Nokta komutlarının genel kuralları için SQLite CLI nokta komutları yazısına bakın.
Örnek tablo

Bütün örneklerde aynı küçük tabloyu kullanıyoruz. Bilerek bir NULL değer, virgül ve çift tırnak içeren bir metin ekledik; böylece her biçimin bu zor durumları nasıl ele aldığını görebilirsiniz:
CREATE TABLE kitap(id INTEGER PRIMARY KEY, ad TEXT, yazar TEXT, yil INTEGER, puan REAL);
INSERT INTO kitap(ad, yazar, yil, puan) VALUES
('Tutunamayanlar', 'Oğuz Atay', 1972, 4.5),
('Kürk Mantolu Madonna', 'Sabahattin Ali', 1943, NULL),
('Yaban, "ilk baskı"', 'Yakup Kadri', 1932, 4.0);Betik modu ve list biçimi
Standart giriş ve standart çıktı bir dosyaya veya boruya bağlıyken araç betik (batch) modunda çalışır. Bu modda varsayılan biçim, eski sürümlerden beri değişmeyen list biçimidir: değerler tırnaklanmadan, veritabanındaki hâliyle yazılır, sütunlar | ile ayrılır, satırlar yeni satır karakteriyle biter ve değer uzunluğuna sınır konmaz. NULL değerler boş görünür. List biçimi, sonucu awk gibi başka bir programa aktaracağınız durumlar için tasarlanmıştır.
.mode
-- çıktı: current output mode: list --escape ascii
SELECT ad, yil, puan FROM kitap ORDER BY id;
-- çıktı:
-- Tutunamayanlar|1972|4.5
-- Kürk Mantolu Madonna|1943|
-- Yaban, "ilk baskı"|1932|4.0
.separator " ; "
SELECT ad, yil FROM kitap WHERE id = 1;
-- çıktı: Tutunamayanlar ; 1972
.separator "|"
.nullvalue YOK
.headers on
SELECT ad, puan FROM kitap ORDER BY id;
-- çıktı:
-- ad|puan
-- Tutunamayanlar|4.5
-- Kürk Mantolu Madonna|YOK
-- Yaban, "ilk baskı"|4.0Bu örnekte eski araçlardaki üç yardımcı komutu kullandık: .separator sütun ayırıcısını, .nullvalue NULL yerine yazılacak metni, .headers sütun başlıklarını ayarlar. Yeni sürümlerde aynı işler .mode seçenekleriyle yapılır: --colsep ayırıcıyı, --null NULL metnini, --titles başlıkları belirler. .nullvalue 3.54 belgelerinde hâlâ listelenir; .width için ise belgeler açıkça eskidiğini ve yerine --width seçeneğinin geldiğini söyler. Ayırıcının bir veri değerinin içinde de geçebileceğini unutmayın: üçüncü satırdaki virgül list biçiminde sorun çıkarmaz, ama ayırıcıyı virgül yaparsanız sütunlar karışır. Bu durumda CSV biçimine geçin.
CSV ve JSON: başka programlara veri aktarmak
CSV biçimi RFC 4180 kurallarına göre tırnaklama yapar: virgül veya tırnak içeren değerler çift tırnak içine alınır, değerin içindeki çift tırnak iki kez yazılır. JSON biçimi ise her satırı sütun adlarını anahtar olarak kullanan bir nesneye çevirir ve NULL değerleri null olarak yazar:
.headers on
.mode csv
SELECT ad, yazar, puan FROM kitap ORDER BY id;
-- çıktı:
-- ad,yazar,puan
-- Tutunamayanlar,"Oğuz Atay",4.5
-- "Kürk Mantolu Madonna","Sabahattin Ali",
-- "Yaban, ""ilk baskı""","Yakup Kadri",4.0
.mode json
SELECT ad, yil, puan FROM kitap ORDER BY id;
-- çıktı:
-- [{"ad":"Tutunamayanlar","yil":1972,"puan":4.5},
-- {"ad":"Kürk Mantolu Madonna","yil":1943,"puan":null},
-- {"ad":"Yaban, \"ilk baskı\"","yil":1932,"puan":4.0}]Çıktıda dikkat edilecek iki nokta var. Birincisi, deneme aracımız boşluk içeren metinleri de tırnak içine aldı; bu geçerli bir CSV'dir ve okuyucular sorunsuz işler. İkincisi, belgelere göre CSV çıktısında satır sonu her platformda \r\n olur. CSV'yi bir dosyaya yazmak için .once dosya.csv, elektronik tablo programında açmak için .excel kullanabilirsiniz; içe aktarmanın ayrıntıları CSV içe ve dışa aktarma yazısında. JSON verilerini SQL içinde işlemek isterseniz SQLite JSON fonksiyonları yazısına bakın.
line, insert ve quote biçimleri
Çok sütunlu tek bir kaydı incelerken line biçimi işinizi kolaylaştırır; her sütunu ayrı satıra yazar ve kayıtları boş satırla ayırır. insert biçimi, sonucu verdiğiniz tablo adına yönelik INSERT ifadelerine çevirir; veriyi başka bir veritabanına taşımak için kullanılır. quote biçimi ise her değeri SQL sabiti olarak yazar: metinler tek tırnak içine alınır, NULL değerler NULL olarak görünür.
.mode line
SELECT ad, yazar FROM kitap WHERE id = 2;
-- çıktı (3.50.6):
-- ad = Kürk Mantolu Madonna
-- yazar = Sabahattin Ali
.mode insert kitap_yedek
SELECT ad, yil, puan FROM kitap ORDER BY id;
-- çıktı (.headers on açıkken):
-- INSERT INTO kitap_yedek(ad,yil,puan) VALUES('Tutunamayanlar',1972,4.5);
-- INSERT INTO kitap_yedek(ad,yil,puan) VALUES('Kürk Mantolu Madonna',1943,NULL);
-- INSERT INTO kitap_yedek(ad,yil,puan) VALUES('Yaban, "ilk baskı"',1932,4.0);
.mode quote
SELECT ad, puan FROM kitap ORDER BY id;
-- çıktı:
-- 'ad','puan'
-- 'Tutunamayanlar',4.5
-- 'Kürk Mantolu Madonna',NULL
-- 'Yaban, "ilk baskı"',4.0Burada sürüm farkı hemen göze çarpar. Belgelere göre line biçiminde ad ile değer arasındaki ayırıcı eskiden eşittir işaretiydi, yeni sürümlerde iki nokta üst üstedir; eski görünümü .mode line --colsep " = " ile geri alabilirsiniz. Insert biçiminde de yeni araçlar, ifadenin boyutu --multiinsert sınırını (varsayılan 3000 bayt) aşana kadar birden çok satırı aynı INSERT içine ekler; sütun adlarını görmek için --titles on vermeniz gerekir. Deneme aracımız ise her satır için ayrı bir INSERT üretti ve .headers on açık olduğu için sütun adlarını ekledi.
Tablo biçimleri: column, box, table, markdown
Ekranda okumak için tasarlanan biçimler sütunları hizalar ve genişliği içeriğe göre otomatik ayarlar. column sade sütunlar, box Unicode kutu çizgileri, table ASCII çizgiler, markdown ise belgelere yapıştırılabilecek Markdown tabloları üretir. Yeni sürümlerde bunlara PostgreSQL'in psql aracına benzeyen psql biçimi de eklendi.
.mode table
SELECT ad, yil FROM kitap WHERE id < 3 ORDER BY id;
-- çıktı (SQLite 3.50.6; 3.53 ve sonrasında hizalama farklıdır):
-- +----------------------+------+
-- | ad | yil |
-- +----------------------+------+
-- | Tutunamayanlar | 1972 |
-- | Kürk Mantolu Madonna | 1943 |
-- +----------------------+------+
.mode markdown
SELECT ad, yil FROM kitap WHERE id < 3 ORDER BY id;
-- çıktı (SQLite 3.50.6):
-- | ad | yil |
-- |----------------------|------|
-- | Tutunamayanlar | 1972 |
-- | Kürk Mantolu Madonna | 1943 |Yukarıdaki çıktılar eski biçimlendiriciye aittir ve sayılar sola hizalıdır. 3.53.0 sürüm notlarına göre komut satırı artık sonuçları QRF (Query Result Formatter) kütüphanesiyle biçimlendirir ve tablo biçimlerinde sayılar varsayılan olarak sağa hizalanır; belgelerdeki örneklerde kutu köşeleri de yuvarlatılmış çizgilerle çizilir. Aynı sorguyu yeni bir araçta çalıştırdığınızda çizgilerin ve hizalamanın farklı görünmesi bu yüzdendir. Uzun metinler için --wrap N seçeneği sütunu N karakterde kaydırır, -ww eklerseniz kaydırma kelime sınırında yapılır. Sütun genişliklerini --width 12,-6 gibi bir listeyle sabitleyebilirsiniz; eksi değer sağa hizalama, 0 otomatik genişlik demektir.
3.53 ve sonrasında .mode: QRF ve yeni varsayılanlar

Yeni araçla etkileşimli bir terminalde çalışırken varsayılan biçim qbox adını taşır. Belgelere göre bu, kutu çizgili tabloya ek olarak şu ayarları içerir: metinleri yalnızca gerektiğinde tırnaklayan --quote relaxed, çok satırlı değerlerde ilk 5 satırı, uzun değerlerde ilk 300 karakteri ve sütun başlıklarında 20 karakteri gösteren --limits 5,300,20, JSONB değerlerini JSON metni olarak gösteren --textjsonb on ve tabloyu ekran genişliğine sığdırmaya çalışan --sw auto. Betik modu ise geriye uyumluluk için eski list biçimini korur.
Bu değişikliği belgeler 3.52.0 sürümüyle anlatıyor; sürüm geçmişinde 3.52.0 kaydı boş, ilgili maddeler ise 3.53.0 altında yer alıyor. Pratikte 3.53.0 ve sonrasını kullanıyorsanız yeni davranışı görürsünüz. Yeni sürümde sık kullanacağınız komutlar şunlardır (bu satırlar 3.53 ve sonrasını gerektirir; deneme aracımız .mode --list ve --colsep gibi seçenekleri tanımadığı için çalıştırılmadı):
.mode -v
.mode --list
.mode list --colsep ", "
.mode line --colsep " = "
.mode box --wrap 30 -ww
.mode table -quote off -null NULL -blob hex -limits 10,1000
.mode insert yeni_tablo --titles on
.mode --once csv
.mode batch.mode -v bütün ayarları ayrıntılı gösterir, .mode --list kullanılabilir biçimleri listeler. --once seçeneği sağındaki ayarları yalnızca bir sonraki SQL girdisi için uygular; sonra önceki ayara döner. .mode batch ve .mode tty sırasıyla betik ve terminal varsayılanlarını geri yükler. --tag AD o anki ayarları yeni bir biçim adı altında saklar, sonra .mode AD ile çağırabilirsiniz. Belgeler başka bir ayrıntıya da dikkat çeker: biçim değiştirmek ayırıcı gibi ayarları yeni biçimin varsayılanına döndürebilir, bu yüzden özel bir ayırıcı kullanıyorsanız --colsep seçeneğini tekrar vermeniz gerekebilir.
| Biçim | --quote | Sütun ayırıcı | NULL gösterimi |
|---|---|---|---|
| list | off | | | boş |
| csv | csv | , | boş |
| tabs | csv | sekme | boş |
| quote | on | , | NULL |
| jatom | json | , | null |
| ascii | csv | 0x1F | boş |
Tablo, belgelerde list ailesinden sayılan biçimlerin bir bölümünü özetliyor; bunların hepsi aslında list biçiminin farklı tırnaklama, ayırıcı ve NULL ayarlarıyla kullanılmış hâlidir. 3.54.0 ile birkaç yenilik daha geldi: sütunlu biçimler sorgu hiç satır döndürmese bile başlıkları gösterir (eski davranış için --titles on), --rowcount on sonuna satır sayısını ekler, --ifmt ve --fpfmt tamsayı ve ondalık sayıların printf tarzı biçimini belirler, -csv komut satırı seçeneği de gösterim sınırlarını otomatik kapatır. Sonuçları hiç göstermeden yalnızca süre ölçmek isterseniz count veya off biçimleri satır sayısını ya da hiçbir şeyi yazmaz.
Uygulamalı örnek: raporu CSV dosyasına almak
Gerçek bir işte biçimler genellikle birlikte kullanılır: rapor için CSV dosyası üretilir, ardından ekrana kısa bir doğrulama mesajı yazılır. Aşağıdaki betik, örnek tabloyu yıla göre sıralayıp başlıklı bir CSV dosyasına yazıyor, sonra list biçimine dönüp kaç satır aktarıldığını bildiriyor. .once yalnızca bir sonraki sorguyu yönlendirdiği için ikinci sorgu yeniden ekrana gelir:
.headers on
.mode csv
.once kitaplar.csv
SELECT ad, yazar, yil FROM kitap ORDER BY yil;
.mode list
.headers off
SELECT 'dosyaya yazıldı: ' || count(*) FROM kitap;
-- çıktı: dosyaya yazıldı: 3
-- kitaplar.csv içeriği (satır sonları CRLF):
-- ad,yazar,yil
-- "Yaban, ""ilk baskı""","Yakup Kadri",1932
-- "Kürk Mantolu Madonna","Sabahattin Ali",1943
-- Tutunamayanlar,"Oğuz Atay",1972Bu kalıbı bir kabuk betiğine koyarsanız raporu her gece otomatik üretebilirsiniz. Biçimi betiğin başında açıkça seçmek iyi bir alışkanlıktır: araç bir gün etkileşimli bir terminalden çalıştırılırsa varsayılan biçim değişse bile dosyanın içeriği aynı kalır. Yeni sürümlerde aynı işi tek satırda .mode --once csv ile yapabilir, başlıklar için --titles on ekleyebilirsiniz. Hangi biçimin hangi iş için uygun olduğunu kabaca şöyle özetleyebiliriz: insan gözüyle okunacak sonuçlar için tablo biçimleri, başka bir programın okuyacağı sonuçlar için CSV, JSON veya list, başka bir veritabanına taşınacak satırlar için insert ve quote.
Kontrol karakterleri ve satır sonları
Belgelere göre 3.50.0 sürümünden beri araç, metinlerin içindeki kontrol karakterlerinin çoğunu doğrudan basmaz; böylece ANSI kaçış dizileri terminalinizi bozamaz. Sekme, satır sonu ve CRLF olduğu gibi geçer, diğerleri Linux'taki cat -A gibi ^ ile gösterilir. Aşağıda ESC karakteri ^[ olarak göründü:
.mode list
.headers off
SELECT 'satir1' || char(10) || 'satir2', 'esc' || char(27) || '[31m';
-- çıktı:
-- satir1
-- satir2|esc^[[31m--escape symbol bu karakterleri U+2401 ile U+241F aralığındaki görünür simgelere çevirir, --escape off ise dönüşümü tamamen kapatır. Windows'ta satır sonu varsayılan olarak CRLF'dir; çıktının diğer platformlarla birebir aynı olmasını istiyorsanız .crlf off kullanın. Bu ayar Windows dışındaki sistemlerde etkisizdir.
Sık yapılan hatalar

- Betikte kutu biçimine güvenmek: Etkileşimli oturumda gördüğünüz kutulu çıktı betik modunda list biçimine döner. Betiklerde biçimi her zaman açıkça
.modeile seçin. - Ayırıcıyı veriyle çakıştırmak: Değerlerin içinde virgül varsa list biçiminde virgül ayırıcı kullanmayın; CSV veya JSON biçimine geçin.
- Gösterim sınırlarını veri kaybı sanmak: Yeni sürümlerde uzun değerler ekranda kısaltılır; bu yalnızca görünümdür. Tam değeri görmek için
--limits offkullanın. - Eski komutları yeni araçta beklemek:
.width,.headersve.separatoryerine yeni sürümlerde.modeseçeneklerini tercih edin. - Ondalık sayıların görünümünü karşılaştırmak: 3.53.0 ile ondalık sayılar 17 anlamlı basamakla metne çevrilir; aynı değer eski ve yeni araçta farklı yazılabilir. Ayrıntı için matematik fonksiyonları yazısına bakın.
Sık Sorulan Sorular
Etkileşimli oturumda eski list görünümünü nasıl geri alırım?
.mode list veya betik varsayılanlarının tamamı için .mode batch yazın. Aracı --batch seçeneğiyle başlatmak da betik modunu zorlar.
Sütun başlıklarını CSV dosyasına nasıl eklerim?
Eski araçlarda .headers on, yeni araçlarda .mode csv --titles on kullanın. Ardından .once dosya.csv ile sonucu dosyaya yazın.
NULL değerleri nasıl görünür yaparım?
Eski araçlarda .nullvalue NULL, yeni araçlarda --null NULL seçeneğini kullanın. quote biçimi NULL değerleri zaten NULL olarak yazar.
Biçim ayarlarını her oturumda yeniden yazmamak için ne yapabilirim?
Sık kullandığınız .mode ve ilgili komutları bir dosyaya yazıp aracı -init dosya.sql ile başlatabilir ya da tek bir komut için -cmd ".mode line" seçeneğini kullanabilirsiniz. Yeni sürümlerde --tag ile kaydettiğiniz bir biçimi aynı oturum içinde adıyla tekrar çağırmak da mümkündür. Bu seçeneklerin örnekleri kurulum yazısında bulunuyor.
Hangi biçim veri aktarımı için en güvenlisidir?
Başka bir SQLite veya SQL veritabanına aktaracaksanız insert, elektronik tablolar ve çoğu araç için csv, programlarla işleyecekseniz json biçimi uygundur. Tablonun tamamını taşıyorsanız .dump komutu şemayı da içerir.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: SQLite öğrenme rehberi · SQLite CLI nokta komutları · SQLite CSV içe ve dışa aktarma · SQLite 3.53 yenilikleri · SQLite kurulumu