Sambungan pangkalan data Perl
Dalam bab ini kami akan memperkenalkan anda kepada sambungan pangkalan data Perl.
Dalam Perl 5 kita boleh menggunakan modul DBI untuk menyambung ke pangkalan data.
Nama Bahasa Inggeris penuh DBI ialah: Antara Muka Bebas Pangkalan Data, yang dipanggil Antara Muka Bebas Pangkalan Data dalam bahasa Cina.
DBI ialah antara muka standard untuk berkomunikasi dengan pangkalan data dalam bahasa Perl Ia mentakrifkan satu siri kaedah, pembolehubah dan pemalar, dan menyediakan lapisan kegigihan pangkalan data yang bebas daripada platform pangkalan data tertentu.
Struktur DBI
DBI tiada kaitan dengan platform pangkalan data tertentu Kami boleh menggunakannya pada pangkalan data seperti Oracle, MySQL atau Informix.
DBI dalam carta memperoleh data SQL yang dihantar oleh semua API (Antara Muka Pengaturcaraan Aplikasi: Antara Muka Pengaturcaraan Aplikasi), kemudian mengedarkannya kepada pemacu yang sepadan untuk pelaksanaan, dan akhirnya mendapatkan data dan mengembalikannya.
Konvensyen nama pembolehubah
Berikut menetapkan kaedah penamaan nama pembolehubah yang lebih biasa digunakan:
$dsn 驱动程序对象的句柄 $dbh 一个数据库对象的句柄 $sth 一个语句或者一个查询对象的句柄 $h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文 $rc 操作代码返回的布什值(true 或 false) $rv 操作代码返回的整数值 @ary 查询返回的一行值的数组(列表) $rows 操作代码返回的行数值 $fh 文件句柄 undef NULL 值表示未定义 \%attr 引用属性的哈希值并传到方法上
Sambungan pangkalan data
Seterusnya kami menggunakan MySQL pangkalan data Ambil contoh untuk menunjukkan cara Perl mengendalikan pangkalan data.
Di sini kami mencipta pangkalan data php dalam pangkalan data MySQL Jadual data adalah Laman Web Struktur jadual dan data adalah seperti yang ditunjukkan di bawah:
Muat turun. jadual data: http ://static.php.cn/download/websites_perl.sql
Seterusnya kami menggunakan kod berikut untuk menyambung ke pangkalan data:
#!/usr/bin/perl -w use strict; use DBI; my $host = "localhost"; # 主机地址 my $driver = "mysql"; # 接口类型 默认为 localhost my $database = "php"; # 数据库 # 驱动程序对象的句柄 my $dsn = "DBI:$driver:database=$database:$host"; my $userid = "root"; # 数据库用户名 my $password = "123456"; # 数据库密码 # 连接数据库 my $dbh = DBI->connect($dsn, $userid, $password ) or die $DBI::errstr; my $sth = $dbh->prepare("SELECT * FROM Websites"); # 预处理 SQL 语句 $sth->execute(); # 执行 SQL 操作 # 注释这部分使用的是绑定值操作 # $alexa = 20; # my $sth = $dbh->prepare("SELECT name, url # FROM Websites # WHERE alexa > ?"); # $sth->execute( $alexa ) or die $DBI::errstr; # 循环输出所有数据 while ( my @row = $sth->fetchrow_array() ) { print join('\t', @row)."\n"; } $sth->finish(); $dbh->disconnect();
Kendalian sisip
Langkah pelaksanaan :
Gunakan prepare() API untuk menyediakan pernyataan SQL.
Gunakan execute() API untuk melaksanakan pernyataan SQL.
Gunakan finish() API untuk melepaskan pemegang penyata.
Akhir sekali, jika semuanya berjalan lancar, operasi pelaksanaan di atas akan diserahkan.
my $sth = $dbh->prepare("INSERT INTO Websites (name, url, alexa, conutry ) values ('Twitter', 'https://twitter.com/', 10, 'USA')"); $sth->execute() or die $DBI::errstr; $sth->finish(); $dbh->commit or die $DBI::errstr;
Aplikasi juga boleh mengikat parameter output dan input Contoh berikut melaksanakan pertanyaan sisipan dengan menggantikan kedudukan pemegang tempat dengan pembolehubah:
my $name = "Twitter"; my $url = "https://twitter.com/"; my $alexa = 10; my $conutry = "USA"; my $sth = $dbh->prepare("INSERT INTO Websites (name, url, alexa, conutry ) values (?,?,?,?)"); $sth->execute($name,$url,$alexa, $conutry) or die $DBI::errstr; $sth->finish(); $dbh->commit or die $DBI::errstr;
Kemas kini operasi
Langkah pelaksanaan:
Gunakan prepare() API untuk menyediakan pernyataan SQL.
Gunakan execute() API untuk melaksanakan pernyataan SQL.
Gunakan finish() API untuk melepaskan pemegang penyata.
Akhir sekali, jika semuanya berjalan lancar, operasi pelaksanaan di atas akan diserahkan.
my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE country = 'CN'"); $sth->execute() or die $DBI::errstr; print "更新的记录数 :" + $sth->rows; $sth->finish(); $dbh->commit or die $DBI::errstr;
Aplikasi juga boleh mengikat parameter output dan input Contoh berikut melaksanakan pertanyaan kemas kini dengan menggantikan kedudukan pemegang tempat ? kursus Kami juga boleh mengikat nilai yang akan ditetapkan, seperti yang ditunjukkan di bawah, mengubah suai Alexa dengan negara CN kepada 1000:
$name = 'php中文网'; my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE name = ?"); $sth->execute('$name') or die $DBI::errstr; print "更新的记录数 :" + $sth->rows; $sth->finish();Padam data
Langkah pelaksanaan:
- Gunakan prepare() API untuk menyediakan pernyataan SQL.
- Gunakan execute() API untuk melaksanakan pernyataan SQL.
- Gunakan finish() API untuk melepaskan pemegang penyata.
- Akhir sekali, jika semuanya berjalan lancar, operasi pelaksanaan di atas akan diserahkan.
- Data berikut akan memadamkan semua data dalam Tapak Web dengan alexa lebih daripada 1000:
$country = 'CN'; $alexa = 1000:; my $sth = $dbh->prepare("UPDATE Websites SET alexa = ? WHERE country = ?"); $sth->execute( $alexa, '$country') or die $DBI::errstr; print "更新的记录数 :" + $sth->rows; $sth->finish();
Gunakan penyataan do
do penyataan untuk melaksanakan operasi KEMASKINI, INSERT atau PADAM Ia akan kembali benar jika perlaksanaan berjaya dan false jika pelaksanaan gagal Contoh Seperti berikut:
$alexa = 1000; my $sth = $dbh->prepare("DELETE FROM Websites WHERE alexa = ?"); $sth->execute( $alexa ) or die $DBI::errstr; print "删除的记录数 :" + $sth->rows; $sth->finish(); $dbh->commit or die $DBI::errstr;
operasi KOMIT
komit adalah untuk melakukan transaksi dan melengkapkan operasi pangkalan data:
rreeeOPERASI ROLLBACK
Jika dalam Jika ralat berlaku semasa pelaksanaan SQL, data boleh digulung semula tanpa sebarang perubahan:
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
Transaksi
Seperti bahasa lain, perl DBI juga menyokong pemprosesan transaksi untuk operasi pangkalan data. Pelaksanaannya adalah seperti berikut Dua:
1 Mulakan transaksi apabila menyambung ke pangkalan data
$dbh->commit or die $dbh->errstr;
Kod di atas menetapkan AutoCommit kepada palsu apabila menyambung, yang bermaksud apabila anda mengemas kini. pangkalan data Pada masa ini, ia tidak akan secara automatik menulis kemas kini tersebut terus ke pangkalan data, tetapi memerlukan atur cara untuk benar-benar menulis data ke pangkalan data melalui $dbh->commit, atau $dbh->rollback untuk melancarkan semula sebelumnya operasi.
2. Mulakan transaksi melalui penyataan $dbh->begin_work()
Kaedah ini tidak memerlukan tetapan AutoCommit = 0 apabila menyambung ke pangkalan data.
Anda boleh melakukan berbilang operasi transaksi dengan satu sambungan pangkalan data, tanpa perlu menyambung ke pangkalan data pada permulaan setiap transaksi.
$dbh->rollback or die $dbh->errstr;
Putuskan sambungan sambungan pangkalan data
Jika kita perlu memutuskan sambungan pangkalan data, kita boleh menggunakan API putus sambungan:
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;