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:

rreee

OPERASI 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;