SQL dönüştürme (SQL Conversion), SQL betiğindeki verileri çıkarıp JSON, CSV, XML, YAML, HTML, Markdown gibi diğer veri formatlarına yeniden düzenleme sürecidir. SQL (Structured Query Language, Yapılandırılmış Sorgu Dili) ilişkisel veritabanları için standart sorgu dilidir, veritabanı dışa aktarma araçları (mysqldump, pg_dump gibi) genellikle verileri SQL betiğinde INSERT deyimleri şeklinde dışa aktarır, bu format veritabanına içe aktarım için uygun olsa da programlar tarafından okunma, veri analizi veya sistemler arası değişim için uygun değildir, bu nedenle daha evrensel formatlara dönüştürme gerekir.
Yaygın SQL veri dışa aktarma betikleri iki tür deyim içerir: CREATE TABLE tablo yapısını tanımlamak için (sütun adları, veri türleri, kısıtlamalar) ve INSERT INTO ... VALUES (...) belirli verileri eklemek için kullanılır. Bu araç her iki tür deyimi ayrıştırır, CREATE TABLE'dan sütun tanımlarını ve tür bilgilerini, INSERT'ten gerçek veri satırlarını çıkarır, ardından kullanıcı tarafından seçilen formatta çıktıyı yeniden düzenler. Tüm ayrıştırma süreci tarayıcıda yerel olarak yapılır, herhangi bir backend hizmetine bağlı değildir.
SQL neden diğer formatlara dönüştürülmeli? SQL betikleri evrenseldir, ancak aşağıdaki senaryolarda kullanışsızdır: birincisi, frontend programları için JSON okumak SQL ayrıştırmaktan çok daha kolaydır, SQL ayrıştırıcı eklemeye gerek yoktur; ikincisi, Excel, Google Sheets gibi tablo yazılımları doğal olarak SQL değil CSV destekler; üçüncüsü, yapılandırma dosyası ve dokümantasyon senaryolarında YAML, Markdown SQL'den daha okunabilirdir; dördüncüsü, sistemler arası veri değişimi için genellikle XML veya JSON nötr formatlar olarak kullanılır. SQL bu evrensel formatlara dönüştürüldükten sonra veriler daha fazla araç ve dil tarafından doğrudan tüketilebilir.
Bu aracın SQL ayrıştırıcısı elle yazılmıştır ve INSERT ve CREATE TABLE deyimlerini ayrıştırmaya odaklanmıştır. INSERT için hem tek değerli demetler (INSERT INTO t (a,b) VALUES (1,2)) hem de çok değerli demetler (INSERT INTO t (a,b) VALUES (1,2), (3,4), (5,6)) desteklenir, veriler sütun adlarına göre otomatik eşleştirilir. CREATE TABLE için sütun tanımları, veri türleri (parantez içi uzunlukla VARCHAR(255), INT, DECIMAL(10,2) vb.), NOT NULL, PRIMARY KEY, IF NOT EXISTS kısıtlamaları ve yan cümleciklerin ayrıştırılması desteklenir, hatalı bölmeyi önlemek için iç içe parantezler doğru işlenir.
Tür tanıma, SQL dönüştürmenin kilit bir yönüdür. Araç, değerin literal formuna göre türü otomatik belirler: tek veya çift tırnakla çevrelenen değerler dizelerdir; NULL (büyük/küçük harf duyarsız) boş değerdir; TRUE/FALSE boolean değerlerdir; 0x..., X'...', B'...' onaltılık literallerdir; saf sayılar (eksi işareti, ondalık nokta, bilimsel gösterimle) sayılardır. Bu otomatik tür tanıma, dönüştürülen JSON, CSV vb. formatların orijinal verilerin semantiğini korumasını sağlar (örn. 1 sayısı "1" dizesi olmaz), bu da downstream programların doğru işlemesini kolaylaştırır.
Veritabanı dialect'leri arasındaki alıntı stili farklılıkları, SQL ayrıştırmasında yaygın bir tuzaktır. MySQL varsayılan olarak tanımlayıcıları (tablo adları, sütun adları) çevrelemek için ters tik (`) kullanır, PostgreSQL çift tırnak (") kullanır, SQL Server/T-SQL köşeli parantez ([]) kullanır, standart SQL de çift tırnak kullanır. Bu aracın unquoteIdentifier fonksiyonu bu alıntıları otomatik tanır ve kaldırır, aynı zamanda alıntı içindeki kaçışları işler (örn. `` → `, "" → "). SQL yeniden oluşturma modunda INSERT deyimleri hedef dialect için ilgili alıntı stiliyle yeniden oluşturulur.
SQL dize kaçışı başka bir kilit teknik detaydır. SQL standardı, dize içindeki tek tırnağın ikiye katlanarak kaçışını tanımlar ('It''s' It's anlamına gelir), MySQL varsayılan olarak ters eğik çizgi kaçışını da destekler (\n, \t, \', \", \\\\, \0, \Z vb.). Bu aracın dize ayrıştırıcısı her iki kaçış mekanizmasını aynı anda işler, orijinal dize içeriğini doğru şekilde geri yükler. CSV'ye dönüştürme sırasında virgül, alıntı, satır sonu içeren alanlar RFC 4180 standardına göre yeniden kaçışlanır; XML/HTML'ye dönüştürme sırasında &, <, >, ", ' gibi özel karakterler kaçışlanır.
Tamamen frontend işleme bu aracın temel tasarım ilkesidir. Tüm SQL ayrıştırma ve veri dönüştürme tarayıcının JavaScript motorunda yürütülür, hiçbir veri sunucuya gönderilmez. Bu, SQL betiği kullanıcı gizliliği, ticari olarak hassas bilgiler veya iç veritabanı yapısı içerse bile dışarı sızmaması anlamına gelir. Bu tasarım özellikle üretim veritabanlarının dışa aktarımını işlemek için uygundur, veri uyumluluğu endişesi yoktur. Aynı zamanda frontend işlemede ağ gecikmesi yoktur, dönüştürme hızı yalnızca cihazın CPU ve belleğiyle sınırlıdır.
Geleneksel komut satırı SQL dönüştürme araçlarına (sql2csv, sqlparser gibi) kıyasla bu aracın birkaç avantajı vardır: ortam kurulumu ve yapılandırması gerektirmez, web sayfasını açın ve kullanın; dönüştürme sonucunun gerçek zamanlı önizlemesi için görsel arayüz sağlar; tek tıkla birden çok çıktı formatı geçişi destekler; yerleşik örnek veriler ve yardım dokümantasyonu; her yerde kullanım için mobil uyumlu tasarım. Ancak araç veri çıkarmaya odaklanır ve karmaşık SQL dialect farklılıklarını (örn. PostgreSQL JSONB operatörleri, MySQL ON DUPLICATE KEY UPDATE) ve gelişmiş özellikleri (saklı yordamlar, fonksiyonlar, tetikleyiciler) işlemez; bu tür ihtiyaçlar için yerel veritabanı araçları veya özel ETL platformları kullanılması önerilir.
SQL dönüştürme aracı kullanılırken dikkat edilmesi gereken birkaç en iyi uygulama vardır: birincisi, dönüştürmeden önce SQL betiğinin tam veriler (INSERT deyimleri) içerip içermediğini kontrol edin, yalnızca sorgular (SELECT) değil, SELECT ayrıştırılmaz; ikincisi, birden çok tablolu SQL betikleri için tablo yapısı bilgilerini korumak üzere «Çoklu tabloları ayrı çıktıla» seçeneğini etkinleştirmek önerilir; üçüncüsü, Çince karakter içeren SQL işlenirken, Excel'in kodlamayı doğru tanımasını sağlamak için CSV çıktısı için «BOM dahil et» seçeneğini etkinleştirmek önerilir; dördüncüsü, büyük SQL dump işlenirken çıktı boyutunu azaltmak için «güzel çıktı»yı kapatmak önerilir; beşincisi, çapraz veritabanı migrasyonunda dialect değiştirmek için «SQL yeniden oluşturma» modu kullanılabilir, ancak karmaşık türler (örn. PostgreSQL dizileri, JSONB) manuel ayarlama gerektirebilir.