PostgreSQL – psql – gexec

Veritabanı yöneticileri veya yazılım geliştiriciler olarak bizler bazen sql üreten sql’ler yazmak durumunda kalırız. Çıktıyı dosyaya kaydederiz. Sonra bu dosyayı tekrar çalıştırıp istediğimiz asıl sonucu alırız. Oluşan script çok büyük değilse kopyalayıp / yapıştırdık mı da tamamdır. Daha önceleri bu durumu pratik olarak çözmek için yazılmış (içerisinde execute olan) fonksiyonlar da görmedim değil. PostgreSQL 9.6 ile gelen psql içerisindeki bir gexec komutu bu süreci çok kolay hale getiriyor. Aslında PostgreSQL’in syntax’ı içerisinde olmayan ama client uygulaması olan psql içerisinde olan bir meta-command kendisi. Yani aşağıda yazdıklarımı psql harici başka bir client üzerinde denerseniz büyük ihtimal sonuç alamazsınız.

Önce sql üreten bir sql oluşturalım; 5 tane tablo oluştursun. Çalıştırmadan önce kontrol etmek iyidir. 🙂

SELECT format(
 'CREATE TABLE gexec_test_%s (
 id integer,
 some_data text,
 primary key (id)
 );', gs
)
FROM generate_series(1, 5) gs;

Aşağıda göründüğü gibi tablo oluşturma sorgularımız düzgün durumda;

SELECT format( 'CREATE TABLE gexec_test_%s ( id integer, some_data text, primary key (id) );', gs ) FROM generate_series(1, 5) gs;

Bunları oluşturalım. Tek yapmamız gereken yukarıda yazdığımız sorgu sonuna \gexec eklemek.

SELECT format( 'CREATE TABLE gexec_test_%s ( id integer, some_data text, primary key (id) );', gs ) FROM generate_series(1, 5) gs; \gexec

Tablolarımız oluşmuş durumda. \dt ile sonucu görebiliriz.

\dt

Hadi bunları drop edelim.

 SELECT format('drop table public.%I;', tablename)
 FROM pg_tables
 WHERE schemaname = 'public' AND tablename LIKE 'gexec_test_%';

 SELECT format('drop table public.%I;', tablename) FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'gexec_test_%';

Önce çıktımızı kontrol ettik. Sonrasında çalıştırdık ve sonucu gördük. Gayet kolay / pratik.

Notlar

  • Sorgular, çıktı sırasına göre ve eğer çıktıda birden çok sütun varsa soldan sağa şeklinde çalıştırılır.
  • Çalıştırılan sorgular sql sorguları olmalı psql’e ait meta commandlar kullanılamaz.
  • Bir sorguda hata olursa varsayılanda çalıştırma devam eder. Bunu önlemek isterseniz de psql’in ON_ERROR_STOP parametresini kullanabilirsiniz.

Referanslar

  • https://www.postgresql.org/docs/current/static/app-psql.html

Loading

Leave Your Comment