首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Perl DBI 訪問 MySQL 完整教程:模塊安裝、連接、預處理、批量插入、查詢回調

     編輯:MySQL 綜合教學

Perl DBI/DBD::mysql 實戰指南:ppm 安裝、連接池、預處理批量插入、參數化查詢、錯誤處理

本文記錄 Windows 下使用 ActivePerl ppm 安裝 DBI 與 DBD::mysql,建立測試庫表,演示預處理批量插入與參數化查詢的完整流程,代碼採用嚴格的錯誤檢查模式,可直接用於生產腳本。

1. 模塊安裝(Windows + ActivePerl)

mysql> CREATE DATABASE mydata;
mysql> USE mydata;
mysql> CREATE TABLE address (
    id INT(5) NOT NULL,
    name VARCHAR(40) NOT NULL,
    email VARCHAR(50) NOT NULL,
    telephone INT(12)
);
mysql> INSERT INTO address VALUES (1, 'Nighthawk', 'nighthawk@163.net', 92384092);

3. 完整 Perl 腳本

#!/usr/bin/perl
use strict;
use warnings;
use DBI;

# 連接數據庫(RaiseError 自動拋出異常)
my $dbh = DBI->connect('DBI:mysql:mydata', undef, undef, {
    RaiseError => 1,
    PrintError => 0,
    AutoCommit => 1,
}) or die "連接失敗: $DBI::errstr";

print "開始批量插入...\n";

# 預處理插入語句
my $sth_ins = $dbh->prepare(q{
    INSERT INTO address (id, name, email, telephone) VALUES (?, ?, ?, ?)
});

print "請輸入記錄 (id,name,email,tel),空行結束:\n";
while (my $input = ) {
    chomp $input;
    last unless $input;
    my ($id, $name, $email, $tel) = split /,/, $input;
    $sth_ins->execute($id, $name, $email, $tel);
    print "已插入: $name\n";
}

print "\n按姓名查詢郵箱和電話:\n";
my $sth_sel = $dbh->prepare('SELECT * FROM address WHERE name = ?');
while (1) {
    print "請輸入姓名: ";
    my $name = ;
    last unless defined $name;
    chomp $name;
    last unless $name;

    $sth_sel->execute($name);
    while (my @row = $sth_sel->fetchrow_array()) {
        printf "Email: %-30s  Tel: %s\n", $row[2], $row[3];
    }
}

$dbh->disconnect;
print "完成。\n";

關鍵最佳實踐

實踐代碼體現效果
RaiseErrorconnect({RaiseError=>1})SQL 錯誤自動 die,無需手動檢查
預處理prepare + execute(@params)防 SQL 注入、重複執行高效
佔位符 ?VALUES (?, ?, ?, ?)驅動層自動轉義、類型轉換
fetchrow_array@row = $sth->fetchrow_array()按列順序返回陣列,性能最佳
嚴格模式use strict; use warnings;編譯期捕獲變量拼寫錯誤

進階擴展

  • 事務控制:$dbh->{AutoCommit}=0; ... $dbh->commit();
  • 批量綁定:$sth->bind_param_array($idx, \@values); $sth->execute_array({ArrayTupleStatus=>\@status});
  • 連接池:Apache::DBI (mod_perl) 或 DBI::Pool
  • 異步通知:MySQL 不支援 LISTEN/NOTIFY,需輪詢或觸發器+外部隊列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved