Friday, April 13, 2012

plpython

Kayitli prosedurler (stored procedures) veri tabanlarina fonksiyonel bazli cetrefil ek mantik eklemek gerektiginde gundeme gelirler. Cogunlukla bir sorgudan gelen sonucu satir satir isleyerek ek mantik uygulamak gerektigine kullanilirlar, SELECT vb. sorgu komutlari, her ne kadar kuvvetli ozelliklere sahip olsalar da, bu baglamda yetersiz kalabilirler.

Kayitli prosedurleri kodlamak icin her tabanin kendine has bir dili var cogunlukla, Oracle PL/SQL kullanir, MySql baska, vs. Hepsi de kosul (if), dongu (loop) icin farkli komutlar kullanirlar. Postgresql da kayitli prosedur icinde Python kullanmak mumkun. Bu buyuk rahatlik cunku farkli bir dil ogrenmeye gerek kalmiyor. Kurmak icin

sudo apt-get install postgresql-plpython-9.1

sudo -u postgres createlang plpythonu [taban] -U postgres

Ornek bir prosedur
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if a > b:
  return a
return b
$$ LANGUAGE plpythonu;
Test etmek icin

select pymax(2,4);

Sonucun 4 geldigini goreceksiniz.

Python bazli PG kayitli islemleri her turlu Python paketini import edebilirler. Yani select uzerinde cagirdiginiz bir islem arka planda Numpy, Scipy kullaniyor bile olabilir! Burada muthis potansiyel var. Raporlama motorunuz (mesela Pentaho) hicbir seyden habersiz "basit" SQL isletiyor olabilir, ama arka planda o basit cagrilar sofistike analitik islemleri yapiyor olabilirler.

Plpython fonksiyonlari icinden logging mumkun, basta
import logging
LOG_FILENAME = '/tmp/plpython.log'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
tanimlanirsa,
logging.debug("mesaj")
ile istenilen cikti ustte tanimli dosyaya yaziliyor.

Notlar

Plpython icinden kullanilan python, ya da sisteminizde kurulu ayni Python'un kullanilis sekli biraz daha secici olabilir. Mesela if 'kelime' in degisken gibi bir ifade eger degisken None ise disaridan bir test ile problemsiz calissa da Postgresql icinden problem cikartti. Bu tur farkliliklar olabilir.
 

No comments: