PostgreSQL – JSON Veri Tipi İşlemleri
JSON veri tipi ve destekleyici işlevler PostgreSQL 9.2 sürümü ile desteklenmeye başladığında büyük olay olmuştu. Bugün ise PostgreSQL’in ardından diğer veritabanları da birer birer bu veri tipine destek vermeye başlarken, PostgreSQL’de oturmuş bir json desteği mevcut. JSON, web uygulamaları, JavaScript ve REST tabanlı mobil uygulama geliştirenler için vazgeçilmez bir dil hatta eskilerin deyimiyle sabir dil (lingua franca: geçerli dil, ortak dil) durumunda. 9.4 sürümünde ise JSON’ın binary sürümü olan jsonb veri tipi desteği gelmişti.
JSON Fonksiyon ve Operatörleri
Tüm JSON fonksiyon ve operatörleri için https://www.postgresql.org/docs/current/static/functions-json.html adresine bakabilirsiniz.
JSON Veri Eklemek
Önce veri tipi json olan bir sütun içeren bir tablo oluşturalım:
CREATE TABLE aile (id serial PRIMARY KEY, profil json);
Sonra bu tabloya json veri ekleyelim:
INSERT INTO aile (profil) VALUES ('
{{"ad": "Katip",
"fertler": [
{"fert": {"ilişki": "baba", "ad": "Hüseyin" }},
{"fert": {"ilişki": "anne", "ad": "Saniye" }},
{"fert": {"ilişki": "çocuk", "ad": "Emrah" }},
{"fert": {"ilişki": "çocuk", "ad": "Sema" }}]}
');
PostgreSQL tabloya veriyi eklemeden önce JSON veriyi doğrulamaktadır.
JSON Veri Sorgulama
Aşağıdaki sorgu json_extract_path, json_array_elements, ve json_extract_path_text işlevlerini kullanarak aile üyelerini getirmektedir.
Sorguyu parçalayıp anlatmaya çalışacağım:
SELECT
json_extract_path_text(profil, 'ad') AS aile,
json_extract_path_text(json_array_elements (json_extract_path(profil,'fertler')),
'fert','ad') As fert
FROM aile;
--
aile | fert
----------+---------
Katip | Hüseyin
Katip | Saniye
Katip | Emrah
Katip | Sema
SELECT
json_extract_path_text(profil, ‘ad’) AS aile,1
json_extract_path_text( 2 json_array_elements ( 3 json_extract_path(profil,’fertler’) 4 ), ‘fert’,’ad’) As fert FROM aile;
- Aile adını text olarak getirir
- Aile ferdi adını text olarak getirir
- Array elemanlarını ayrı JSON objeleri olarak getirir
- Aile fertlerini ayrı objeler olarak getirir
Bu şekilde yazmak yerine fonksiyonların kısayol operatörlerini kullanmak daha kolay geliyor bana, muhtemelen obje tabanlı programlama yapanlara da bu daha doğal gelecektir. Yukarıdaki sorgu bu durumda aşağıdaki gibi daha kolay hale geliyor:
SELECT profile->>'name' As family,
json_array_elements((profile->'members')) #>> '{member,name}'::text[] AS member
FROM families_j;
JSON Sonuç Döndürmek
row_to_json fonksiyonu ile seçilen sütunları JSON formatında çıktı haline getirmek mümkündür.
select row_to_json(words) from words;
Not: olarak PostgreSQL aynı zamanda diğer veritabanları gibi XML de desteklemektir.