Perl-Datenbankverbindung
In diesem Kapitel stellen wir Ihnen Perl-Datenbankverbindungen vor.
In Perl 5 können wir das DBI-Modul verwenden, um eine Verbindung zu Datenbanken herzustellen.
DBIs vollständiger englischer Name ist Database Independent Interface, im Chinesischen bekannt als die datenbankunabhängige Schnittstelle.
Als Standardschnittstelle für die Kommunikation zwischen der Perl-Sprache und Datenbanken definiert DBI eine Reihe von Methoden, Variablen und Konstanten und bietet eine Datenbankpersistenzschicht, die unabhängig von jeder spezifischen Datenbankplattform ist.
DBI-Struktur
DBI ist unabhängig von spezifischen Datenbankplattformen und wir können es auf Datenbanken wie Oracle, MySQL oder Informix anwenden.
In der Abbildung empfängt DBI alle von der API (Application Programming Interface) gesendeten SQL-Daten, verteilt sie zur Ausführung an die entsprechenden Treiber und ruft die Daten schließlich ab und gibt sie zurück.
Namenskonventionen für Variablen
Im Folgenden sind einige häufig verwendete Namenskonventionen für Variablen aufgeführt:
$dsn 驱动程序对象的句柄 $dbh 一个数据库对象的句柄 $sth 一个语句或者一个查询对象的句柄 $h 通用的句柄 ($dbh, $sth, oder $drh),依赖于上下文 $rc 操作代码返回的布什值(true oder false) $rv 操作代码返回的整数值 @ary 查询返回的一行值的数组(列表) $rows 操作代码返回的行数值 $fh 文件句柄 undef NULL 值表示未定义 \%attr 引用属性的哈希值并传到方法上
Datenbankverbindung
Als Nächstes verwenden wir die MySQL-Datenbank als Beispiel, um zu demonstrieren, wie Perl Datenbankoperationen durchführt.
Hier erstellen wir die EXAMPLE-Datenbank in MySQL, wobei die Datentabelle Websites heißt. Die Tabellenstruktur und die Daten sind in der folgenden Abbildung dargestellt:

Laden Sie diese Datentabelle herunter:/static.jyshare.com/download/websites_perl.sql
Als Nächstes verwenden wir den folgenden Code, um eine Verbindung zur Datenbank herzustellen:
Beispiel
Einfügeoperation
Ausführungsschritte:
- Verwenden Sie die prepare()-API, um die SQL-Anweisung vorzubereiten.
- Verwenden Sie die execute()-API, um die SQL-Anweisung auszuführen.
- Verwenden Sie die finish()-API, um das Statement-Handle freizugeben.
- Wenn schließlich alles gut geht, werden die oben ausgeführten Operationen festgeschrieben.
my $sth = $dbh->prepare("INSERT INTO Websites
(name, url, alexa, country )
values
('Twitter', 'https://twitter.com/', 10, 'USA')");
$sth->execute() or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Anwendungen können auch Ausgabe- und Eingabeparameter binden. Das folgende Beispiel führt eine Einfügeabfrage aus, indem die ?-Platzhalter durch Variablen ersetzt werden:
my $name = "Twitter";
my $url = "https://twitter.com/";
my $alexa = 10;
my $country = "USA";
my $sth = $dbh->prepare("INSERT INTO Websites
(name, url, alexa, country )
values
(?,?,?,?)");
$sth->execute($name,$url,$alexa, $country)
or die $DBI::errstr;
$sth->finish();
$dbh->commit or die $DBI::errstr;
Aktualisierungsoperation
Ausführungsschritte:
- Verwenden Sie die prepare()-API, um die SQL-Anweisung vorzubereiten.
- Verwenden Sie die execute()-API, um die SQL-Anweisung auszuführen.
- Verwenden Sie die finish()-API, um das Statement-Handle freizugeben.
- Wenn schließlich alles gut geht, werden die oben ausgeführten Operationen festgeschrieben.
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;
Anwendungen können auch Ausgabe- und Eingabeparameter binden. Das folgende Beispiel führt eine Aktualisierungsabfrage aus, indem die ?-Platzhalter durch Variablen ersetzt werden:
$name = 'Example';
my $sth = $dbh->prepare("UPDATE Websites
SET alexa = alexa + 1
WHERE name = ?");
$sth->execute('$name') or die $DBI::errstr;
print "更新的记录数 :" + $sth->rows;
$sth->finish();
Natürlich können wir auch die festzulegenden Werte binden, wie unten gezeigt, wobei alexa aller Datensätze mit country CN auf 1000 geändert wird:
$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();
Daten löschen
Ausführungsschritte:
- Verwenden Sie die prepare()-API, um die SQL-Anweisung vorzubereiten.
- Verwenden Sie die execute()-API, um die SQL-Anweisung auszuführen.
- Verwenden Sie die finish()-API, um das Statement-Handle freizugeben.
- Wenn schließlich alles gut geht, werden die oben ausgeführten Operationen festgeschrieben.
Im Folgenden werden alle Daten aus Websites gelöscht, bei denen alexa größer als 1000 ist:
$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;
Verwendung der do-Anweisung
doDie do-Anweisung kann UPDATE-, INSERT- oder DELETE-Operationen ausführen. Sie ist prägnant; bei Erfolg gibt sie true zurück, bei Fehler false. Ein Beispiel ist wie folgt:
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
COMMIT-Operation
commit wird verwendet, um die Transaktion zu bestätigen und Datenbankoperationen abzuschließen:
$dbh->commit or die $dbh->errstr;
ROLLBACK-Operation
Wenn während der SQL-Ausführung ein Fehler auftritt, können Sie die Daten zurückrollen, ohne Änderungen vorzunehmen:
$dbh->rollback or die $dbh->errstr;
Transaktionen
Wie andere Sprachen unterstützt Perl DBI auch die Transaktionsverarbeitung für Datenbankoperationen. Es gibt zwei Möglichkeiten, dies zu implementieren:
1. Eine Transaktion beim Verbinden mit der Datenbank starten
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
Der obige Code setzt AutoCommit beim Verbinden auf false. Das bedeutet, dass bei der Ausführung von Aktualisierungsoperationen auf der Datenbank diese Aktualisierungen nicht automatisch direkt in die Datenbank geschrieben werden. Stattdessen muss das Programm $dbh->commit verwenden, um die Daten tatsächlich in die Datenbank zu schreiben, oder $dbh->rollback, um die vorherigen Operationen zurückzurollen.
2. Eine Transaktion mit der Anweisung $dbh->begin_work() starten
Bei diesem Ansatz ist es nicht erforderlich, AutoCommit = 0 beim Verbinden mit der Datenbank festzulegen.
Sie können mehrere Transaktionsoperationen mit einer einzigen Datenbankverbindung ausführen, ohne dass für den Beginn jeder Transaktion eine Verbindung zur Datenbank hergestellt werden muss.
$rc = $dbh->begin_work or die $dbh->errstr; ##################### ##这里执行一些 SQL 操作 ##################### $dbh->commit; # 成功后操作 ----------------------------- $dbh->rollback; # 失败后回滚
Trennen von der Datenbank
Wenn wir die Verbindung zur Datenbank trennen müssen, können wir die disconnect-API verwenden:
$rc = $dbh->disconnect or warn $dbh->errstr;Andere Erweiterungen