Perl - Veritabanı Erişimi
Bu bölüm size Perl betiğiniz içindeki bir veritabanına nasıl erişeceğinizi öğretir. Perl 5'ten başlayarak veritabanı uygulamaları yazmak çok kolay hale geldi.DBImodül. DBI,Database Independent Interface Perl için, yani DBI, Perl kodu ile temeldeki veritabanı arasında bir soyutlama katmanı sağlar ve veritabanı uygulamalarını gerçekten kolayca değiştirmenize olanak tanır.
DBI, Perl programlama dili için bir veritabanı erişim modülüdür. Kullanılan gerçek veritabanından bağımsız olarak tutarlı bir veritabanı arabirimi sağlayan bir dizi yöntem, değişken ve kural sağlar.
DBI Uygulamasının Mimarisi
DBI, arka uçta bulunan herhangi bir veritabanından bağımsızdır. Oracle, MySQL veya Informix, vb. İle çalışıyor olsanız da DBI kullanabilirsiniz. Bu, aşağıdaki arşiv diyagramından anlaşılır.
Burada DBI, tüm SQL komutlarını API (yani Uygulama Programlama Arayüzü) aracılığıyla almaktan ve bunları gerçek yürütme için uygun sürücüye göndermekten sorumludur. Ve son olarak, DBI sürücüden sonuçları almaktan ve arayan scritp'e geri vermekten sorumludur.
Gösterim ve Kurallar
Bu bölüm boyunca aşağıdaki gösterimler kullanılacaktır ve aynı kurala uymanız da tavsiye edilir.
$dsn Database source name
$dbh Database handle object
$sth Statement handle object
$h Any of the handle types above ($dbh, $sth, or $drh)
$rc General Return Code (boolean: true=ok, false=error)
$rv General Return Value (typically an integer)
@ary List of values returned from the database.
$rows Number of rows processed (if available, else -1)
$fh A filehandle
undef NULL values are represented by undefined values in Perl
\%attr Reference to a hash of attribute values passed to methods
Veritabanı Bağlantısı
MySQL veritabanı ile çalışacağımızı varsayalım. Bir veritabanına bağlanmadan önce aşağıdakilerden emin olun. MySQL veritabanında veritabanı ve tabloların nasıl oluşturulacağını bilmiyorsanız MySQL eğitimimizden yardım alabilirsiniz.
TESTDB adıyla bir veritabanı oluşturdunuz.
TESTDB'de TEST_TABLE adıyla bir tablo oluşturdunuz.
Bu tablo FIRST_NAME, LAST_NAME, AGE, SEX ve INCOME alanlarına sahip.
"Testuser" kullanıcı kimliği ve "test123" şifresi TESTDB'ye erişmek için ayarlanmıştır.
Perl Module DBI, makinenize doğru bir şekilde kurulmuştur.
MySQL Temellerini anlamak için MySQL eğitiminden geçtiniz.
Aşağıda MySQL veritabanı "TESTDB" ile bağlantı kurma örneği verilmiştir -
#!/usr/bin/perl
use DBI
use strict;
my $driver = "mysql";
my $database = "TESTDB";
my $dsn = "DBI:$driver:database=$database";
my $userid = "testuser";
my $password = "test123";
my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr;
Veri kaynağı ile bir bağlantı kurulursa, bir Veritabanı Tutamacı döndürülür ve daha sonra kullanılmak üzere $ dbh'ye kaydedilir, aksi takdirde $ dbh, undef değerine ayarlanır ve $ DBI :: errstr bir hata dizesi döndürür.
INSERT İşlemi
Bir tabloya bazı kayıtlar oluşturmak istediğinizde INSERT işlemi gereklidir. Burada kayıtlarımızı oluşturmak için TEST_TABLE tablosunu kullanıyoruz. Dolayısıyla, veritabanı bağlantımız bir kez kurulduktan sonra, TEST_TABLE'a kayıt oluşturmaya hazırız. TEST_TABLE'a tek kayıt oluşturma prosedürü aşağıdadır. Aynı konsepti kullanarak istediğiniz kadar kayıt oluşturabilirsiniz.
Kayıt oluşturma aşağıdaki adımları gerçekleştirir -
INSERT deyimiyle SQL deyiminin hazırlanması. Bu kullanılarak yapılacaktırprepare() API.
Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu kullanılarak yapılacaktırexecute() API.
Stattement kolu serbest bırakılıyor. Bu kullanılarak yapılacaktırfinish() API.
Her şey yolunda giderse o zaman commit bu işlem yoksa yapabilirsin rollbackişlemi tamamla. Kaydetme ve Geri Alma sonraki bölümlerde açıklanmaktadır.
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
('john', 'poul', 'M', 30, 13000)");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Bağlama Değerlerini Kullanma
Girilecek değerlerin önceden verilmediği bir durum olabilir. Böylece, çalışma zamanında gerekli değerleri alacak olan bağlama değişkenlerini kullanabilirsiniz. Perl DBI modülleri, gerçek değer yerine bir soru işareti kullanır ve daha sonra gerçek değerler, çalışma zamanında execute () API'sinden geçirilir. Örnek aşağıdadır -
my $first_name = "john";
my $last_name = "poul";
my $sex = "M";
my $income = 13000;
my $age = 30;
my $sth = $dbh->prepare("INSERT INTO TEST_TABLE
(FIRST_NAME, LAST_NAME, SEX, AGE, INCOME )
values
(?,?,?,?)");
$sth->execute($first_name,$last_name,$sex, $age, $income)
or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
OKUMA İşlemi
Herhangi bir veri yolu üzerinde OKU işlemi, veri tabanından bazı yararlı bilgileri, yani bir veya daha fazla tablodan bir veya daha fazla kaydı almak anlamına gelir. Dolayısıyla, veritabanı bağlantımız kurulduktan sonra, bu veritabanına bir sorgu yapmaya hazırız. Aşağıda, 20'den büyük AGE'ye sahip tüm kayıtları sorgulama prosedürü açıklanmaktadır. Bu dört adım alacaktır -
SQL SELECT sorgusunu gerekli koşullara göre hazırlamak. Bu kullanılarak yapılacaktırprepare() API.
Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu kullanılarak yapılacaktırexecute() API.
Tüm sonuçları tek tek almak ve bu sonuçları yazdırmak. fetchrow_array() API.
Stattement kolu serbest bırakılıyor. Bu kullanılarak yapılacaktırfinish() API.
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > 20");
$sth->execute() or die $DBI::errstr;
print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
Bağlama Değerlerini Kullanma
Önceden koşul verilmediği bir durum olabilir. Böylece, çalışma zamanında gerekli değerleri alacak olan bağlama değişkenlerini kullanabilirsiniz. Perl DBI modülleri, gerçek değer yerine bir soru işareti kullanır ve daha sonra gerçek değerler çalışma zamanında execute () API üzerinden geçirilir. Örnek aşağıdadır -
$age = 20;
my $sth = $dbh->prepare("SELECT FIRST_NAME, LAST_NAME
FROM TEST_TABLE
WHERE AGE > ?");
$sth->execute( $age ) or die $DBI::errstr;
print "Number of rows found :" + $sth->rows;
while (my @row = $sth->fetchrow_array()) {
my ($first_name, $last_name ) = @row;
print "First Name = $first_name, Last Name = $last_name\n";
}
$sth->finish();
GÜNCELLEME İşlemi
GÜNCELLEME Herhangi bir veritabanı üzerinde işlem, veritabanı tablolarında zaten mevcut olan bir veya daha fazla kaydı güncellemek anlamına gelir. Aşağıda, SEX olan tüm kayıtları 'M' olarak güncelleme prosedürü yer almaktadır. Burada tüm erkeklerin YAŞ'ını bir yıl artıracağız. Bu üç adım atacak -
SQL sorgusunun gerekli koşullara göre hazırlanması. Bu kullanılarak yapılacaktırprepare() API.
Veritabanından tüm sonuçları seçmek için SQL sorgusunun yürütülmesi. Bu kullanılarak yapılacaktırexecute() API.
Stattement kolu serbest bırakılıyor. Bu kullanılarak yapılacaktırfinish() API.
Her şey yolunda giderse o zaman commit bu işlem yoksa yapabilirsin rollbackişlemi tamamla. Kaydetme ve geri alma API'leri için sonraki bölüme bakın.
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = 'M'");
$sth->execute() or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Bağlama Değerlerini Kullanma
Önceden koşul verilmediği bir durum olabilir. Böylece, çalışma zamanında gerekli değerleri alacak olan bağlama değişkenlerini kullanabilirsiniz. Perl DBI modülleri, gerçek değer yerine bir soru işareti kullanır ve daha sonra gerçek değerler çalışma zamanında execute () API üzerinden geçirilir. Örnek aşağıdadır -
$sex = 'M';
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET AGE = AGE + 1
WHERE SEX = ?");
$sth->execute('$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Bazı durumlarda, önceden verilmeyen bir değer ayarlamak istersiniz, böylece aşağıdaki gibi bağlama değerini kullanabilirsiniz. Bu örnekte tüm erkeklerin geliri 10000 olarak ayarlanacaktır.
$sex = 'M';
$income = 10000;
my $sth = $dbh->prepare("UPDATE TEST_TABLE
SET INCOME = ?
WHERE SEX = ?");
$sth->execute( $income, '$sex') or die $DBI::errstr;
print "Number of rows updated :" + $sth->rows;
$sth->finish();
DELETE İşlemi
Veritabanınızdan bazı kayıtları silmek istediğinizde DELETE işlemi gereklidir. Aşağıda, AGE'nin 30'a eşit olduğu TEST_TABLE'dan tüm kayıtları silme prosedürü açıklanmaktadır. Bu işlem aşağıdaki adımları alacaktır.
SQL sorgusunun gerekli koşullara göre hazırlanması. Bu kullanılarak yapılacaktırprepare() API.
Veritabanından gerekli kayıtları silmek için SQL sorgusunun yürütülmesi. Bu kullanılarak yapılacaktırexecute() API.
Stattement kolu serbest bırakılıyor. Bu kullanılarak yapılacaktırfinish() API.
Her şey yolunda giderse o zaman commit bu işlem yoksa yapabilirsin rollback işlemi tamamla.
$age = 30;
my $sth = $dbh->prepare("DELETE FROM TEST_TABLE
WHERE AGE = ?");
$sth->execute( $age ) or die $DBI::errstr;
print "Number of rows deleted :" + $sth->rows;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Do İfadesini Kullanma
GÜNCELLEME, INSERT veya DELETE yapıyorsanız, veritabanından geri gelen veri yoktur, bu nedenle bu işlemi gerçekleştirmek için kısa bir yol vardır. Kullanabilirsinizdo komutlardan herhangi birini aşağıdaki gibi çalıştırmak için ifade.
$dbh->do('DELETE FROM TEST_TABLE WHERE age =30');
doBaşarılı olursa gerçek bir değer, başarısız olursa yanlış bir değer döndürür. Aslında başarılı olursa, etkilenen satırların sayısını döndürür. Örnekte, gerçekten silinen satırların sayısını döndürür.
COMMIT İşlemi
Commit, değişiklikleri sonlandırmak için veri tabanına yeşil sinyal veren ve bu işlemden sonra hiçbir değişiklik orijinal konumuna geri döndürülemeyen işlemdir.
İşte aramak için basit bir örnek commit API.
$dbh->commit or die $dbh->errstr;
GERİ DÖNME İşlemi
Tüm değişikliklerden memnun kalmazsanız veya herhangi bir işlem arasında bir hatayla karşılaşırsanız, bu değişiklikleri kullanmak üzere geri döndürebilirsiniz. rollback API.
İşte aramak için basit bir örnek rollback API.
$dbh->rollback or die $dbh->errstr;
İşlemi Başlatın
Birçok veritabanı işlemleri destekler. Bu, veritabanlarını değiştirecek bir sürü sorgu yapabileceğiniz anlamına gelir, ancak değişikliklerin hiçbiri gerçekte yapılmaz. Ardından, özel SQL sorgusunu yayınlarsınız.COMMITve tüm değişiklikler aynı anda yapılır. Alternatif olarak, ROLLBACK sorgusunu yayınlayabilirsiniz, bu durumda tüm değişiklikler atılır ve veritabanı değişmeden kalır.
Perl DBI modülü sağlandı begin_workAPI, işlemlere (AutoCommit'i kapatarak) bir sonraki commit veya geri alma çağrısına kadar izin verir. Bir sonraki kaydetme veya geri alma işleminden sonra, AutoCommit otomatik olarak yeniden açılacaktır.
$rc = $dbh->begin_work or die $dbh->errstr;
Otomatik Komite Seçeneği
İşlemleriniz basitse, kendinizi çok fazla taahhütte bulunma zahmetinden kurtarabilirsiniz. Bağlantı araması yaptığınızda, birAutoCommitHer başarılı sorgudan sonra otomatik bir kesinleştirme işlemi gerçekleştirecek seçenek. İşte göründüğü gibi -
my $dbh = DBI->connect($dsn, $userid, $password,
{AutoCommit => 1})
or die $DBI::errstr;
Burada AutoCommit, 1 veya 0 değerini alabilir; burada 1, AutoCommit'in açık olduğu ve 0, AutoCommit'in kapalı olduğu anlamına gelir.
Otomatik Hata İşleme
Connect çağrısı yaptığınızda, hataları sizin için otomatik olarak işleyen bir RaiseErrors seçeneği belirtebilirsiniz. Bir hata oluştuğunda, DBI bir hata kodu döndürmek yerine programınızı durdurur. Tek istediğiniz programı bir hata nedeniyle iptal etmekse, bu uygun olabilir. İşte göründüğü gibi -
my $dbh = DBI->connect($dsn, $userid, $password,
{RaiseError => 1})
or die $DBI::errstr;
Burada RaiseError 1 veya 0 değerini alabilir.
Veritabanının Bağlantısını Kesme
Veritabanı bağlantısını kesmek için şunu kullanın: disconnect API aşağıdaki gibidir -
$rc = $dbh->disconnect or warn $dbh->errstr;
Bağlantı kesme yönteminin işlem davranışı ne yazık ki tanımsızdır. Bazı veritabanı sistemleri (Oracle ve Ingres gibi), tüm olağanüstü değişiklikleri otomatik olarak gerçekleştirecek, ancak diğerleri (Informix gibi), olağanüstü değişiklikleri geri alacaktır. AutoCommit kullanmayan uygulamalar, bağlantı kesmeyi çağırmadan önce açıkça commit veya geri alma çağrısı yapmalıdır.
NULL Değerleri Kullanma
Tanımlanmamış değerler veya undef, NULL değerleri belirtmek için kullanılır. NULL olmayan bir değere yaptığınız gibi NULL değerine sahip sütunlar ekleyebilir ve güncelleyebilirsiniz. Bu örnekler sütun yaşını NULL değerle ekler ve günceller -
$sth = $dbh->prepare(qq {
INSERT INTO TEST_TABLE (FIRST_NAME, AGE) VALUES (?, ?)
});
$sth->execute("Joe", undef);
Buraya qq{} tırnak içine alınmış bir dizeyi döndürmek için kullanılır prepareAPI. Ancak, bir WHERE yan tümcesinde NULL değerleri kullanmaya çalışırken dikkatli olunmalıdır. Düşünün -
SELECT FIRST_NAME FROM TEST_TABLE WHERE age = ?
Yer tutucuya bir undef (NULL) bağlamak, NULL yaşı olan satırları seçmez! En azından SQL standardına uyan veritabanı motorları için. Bunun nedenleri için veritabanı motorunuzun SQL kılavuzuna veya herhangi bir SQL kitabına bakın. NULL'leri açıkça seçmek için "WHERE age IS NULL" demeniz gerekir.
Yaygın bir sorun, bir kod parçasının çalışma zamanında tanımlanmış veya tanımlanmamış (NULL olmayan veya NULL) olabilen bir değeri işlemesidir. Basit bir teknik, gerektiği gibi uygun ifadeyi hazırlamak ve NULL olmayan durumlar için yer tutucuyu değiştirmektir -
$sql_clause = defined $age? "age = ?" : "age IS NULL";
$sth = $dbh->prepare(qq {
SELECT FIRST_NAME FROM TEST_TABLE WHERE $sql_clause
});
$sth->execute(defined $age ? $age : ());
Diğer Bazı DBI İşlevleri
available_drivers
@ary = DBI->available_drivers;
@ary = DBI->available_drivers($quiet);
@INC içindeki dizinlerde DBD :: * modüllerini arayarak tüm mevcut sürücülerin bir listesini döndürür. Varsayılan olarak, bazı sürücüler önceki dizinlerde aynı ada sahip başkaları tarafından gizlenmişse bir uyarı verilir. $ Quiet için gerçek bir değerin iletilmesi uyarıyı engelleyecektir.
install_drivers
%drivers = DBI->installed_drivers();
Geçerli işleme 'yüklenen' (yüklenen) tüm sürücüler için sürücü adı ve sürücü tanıtıcı çiftlerinin bir listesini döndürür. Sürücü adı 'DBD ::' önekini içermez.
veri kaynakları
@ary = DBI->data_sources($driver);
Adlandırılmış sürücü aracılığıyla kullanılabilen veri kaynaklarının (veritabanları) listesini döndürür. $ Driver boşsa veya undef ise, DBI_DRIVER ortam değişkeninin değeri kullanılır.
alıntı
$sql = $dbh->quote($value);
$sql = $dbh->quote($value, $data_type);
Dize içinde bulunan özel karakterlerden (tırnak işaretleri gibi) kaçınarak ve gerekli dış tırnak işaretlerini ekleyerek, bir SQL ifadesinde değişmez değer olarak kullanmak için bir dize değişmezi alıntılayın.
$sql = sprintf "SELECT foo FROM bar WHERE baz = %s",
$dbh->quote("Don't");
Çoğu veritabanı türü için, tırnak 'Yapma' (dış tırnak işaretleri dahil) döndürür. Alıntı () yönteminin, istenen dizge olarak değerlendirilen bir SQL ifadesi döndürmesi için geçerlidir. Örneğin -
$quoted = $dbh->quote("one\ntwo\0three")
may produce results which will be equivalent to
CONCAT('one', CHAR(12), 'two', CHAR(0), 'three')
Tüm Kollarda Ortak Olan Yöntemler
hata
$rv = $h->err;
or
$rv = $DBI::err
or
$rv = $h->err
Çağrılan son sürücü yönteminden yerel veritabanı motoru hata kodunu döndürür. Kod tipik olarak bir tamsayıdır, ancak bunu varsaymamalısınız. Bu, $ DBI :: err veya $ h-> err ile eşdeğerdir.
hatastr
$str = $h->errstr;
or
$str = $DBI::errstr
or
$str = $h->errstr
Çağrılan son DBI yönteminden yerel veritabanı motoru hata mesajını döndürür. Bu, yukarıda açıklanan "err" yöntemiyle aynı yaşam süresi sorunlarına sahiptir. Bu, $ DBI :: errstr veya $ h-> errstr ile eşdeğerdir.
satırlar
$rv = $h->rows;
or
$rv = $DBI::rows
Bu, önceki SQL ifadesinden etkilenen ve $ DBI :: satırlarına eşdeğer olan satır sayısını döndürür.
iz
$h->trace($trace_settings);
DBI, ne yaptığına dair çalışma zamanı izleme bilgilerini oluşturmak için son derece yararlı bir beceriye sahiptir; bu, DBI programlarınızdaki garip sorunları izlemeye çalışırken büyük bir zaman tasarrufu sağlayabilir. İzleme seviyesini ayarlamak için farklı değerler kullanabilirsiniz. Bu değerler, 0 ile 4 arasında değişir. 0 değeri, izlemeyi devre dışı bırakma anlamına gelir ve 4, tam izleme oluştur anlamına gelir.
Yorumlanmış İfadeler Yasaktır
Aşağıdaki gibi enterpolasyonlu ifadelerin kullanılmaması şiddetle tavsiye edilir -
while ($first_name = <>) {
my $sth = $dbh->prepare("SELECT *
FROM TEST_TABLE
WHERE FIRST_NAME = '$first_name'");
$sth->execute();
# and so on ...
}
Bu nedenle, enterpolasyonlu ifadeler kullanmayın. bind value dinamik SQL deyimi hazırlamak.