Perl 데이터베이스 연결
이 장에서는 Perl 데이터베이스 연결에 대해 소개합니다.
Perl 5에서는 DBI 모듈을 사용하여 데이터베이스에 연결할 수 있습니다.
DBI의 정식 영어 명칭은 Database Independent Interface, 중국어로는 Database Independent Interface라고 합니다.
DBI는 Perl 언어로 데이터베이스와 통신하기 위한 표준 인터페이스로 일련의 메소드, 변수 및 상수를 정의하고 특정 데이터베이스 플랫폼에 독립적인 데이터베이스 지속성 계층을 제공합니다.
DBI 구조
DBI는 특정 데이터베이스 플랫폼과 관련이 없으며 Oracle, MySQL 또는 Informix와 같은 데이터베이스에 적용할 수 있습니다.
차트의 DBI는 모든 API(Application Programing Interface: 애플리케이션 프로그래밍 인터페이스)에서 전송되는 SQL 데이터를 얻어서 해당 드라이버에 배포하여 실행하고 최종적으로 데이터를 얻어서 반환합니다.
변수 이름 규칙
다음은 더 일반적으로 사용되는 변수 이름 명명 방법을 설정합니다.
$dsn 驱动程序对象的句柄 $dbh 一个数据库对象的句柄 $sth 一个语句或者一个查询对象的句柄 $h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文 $rc 操作代码返回的布什值(true 或 false) $rv 操作代码返回的整数值 @ary 查询返回的一行值的数组(列表) $rows 操作代码返回的行数值 $fh 文件句柄 undef NULL 值表示未定义 \%attr 引用属性的哈希值并传到方法上
데이터베이스 연결
다음으로 MySQL을 사용합니다. 데이터베이스 Perl이 데이터베이스를 작동하는 방법을 보여주는 예를 들어보십시오.
여기서 MySQL 데이터베이스에 PHP 데이터베이스를 생성합니다. 데이터 테이블은 웹사이트입니다. 테이블 구조와 데이터는 아래와 같습니다.
다운로드 데이터 테이블: http://static.php.cn/download/websites_perl.sql
다음으로 다음 코드를 사용하여 데이터베이스에 연결합니다:
#!/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();
삽입 작업
실행 단계 :
prepare() API를 사용하여 SQL 문을 준비합니다.
execute() API를 사용하여 SQL 문을 실행합니다.
finish() API를 사용하여 명령문 핸들을 해제합니다.
마지막으로 모든 것이 잘 진행되면 위의 실행 작업이 제출됩니다.
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;
다음 예에서는 ? 자리 표시자 위치를 변수로 바꿔서 삽입 쿼리를 실행합니다.
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;
업데이트 작업
실행 단계:
prepare() API를 사용하여 SQL 문을 준비합니다.
execute() API를 사용하여 SQL 문을 실행합니다.
finish() API를 사용하여 명령문 핸들을 해제합니다.
마지막으로 모든 것이 잘 진행되면 위의 실행 작업이 제출됩니다.
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;
다음 예에서는 ? 자리 표시자의 위치를 변수로 바꿔 업데이트 쿼리를 실행합니다.
$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();
Of 물론 아래와 같이 설정할 값을 바인딩할 수도 있습니다. 국가 CN이 있는 Alexa를 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();
데이터 삭제
실행 단계:
Prepare() API를 사용하여 SQL 문을 준비합니다.
execute() API를 사용하여 SQL 문을 실행합니다.
finish() API를 사용하여 명령문 핸들을 해제합니다.
마지막으로 모든 것이 잘 진행되면 위의 실행 작업이 제출됩니다.
다음 데이터는 Alexa가 1000보다 큰 웹사이트의 모든 데이터를 삭제합니다.
$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;
DO 문
do 문을 사용하여 UPDATE, INSERT 또는 DELETE 작업을 수행합니다. 실행이 성공하면 true를 반환합니다. 실행이 실패하면 false입니다. 예 다음과 같습니다.
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
COMMIT 작업
커밋은 트랜잭션을 커밋하고 데이터베이스 작업을 완료하는 것입니다.
$dbh->commit or die $dbh->errstr;
ROLLBACK 연산
If in SQL 실행 중 오류가 발생하면 아무런 변경 없이 데이터를 롤백할 수 있습니다.
$dbh->rollback or die $dbh->errstr;
Transaction
다른 언어와 마찬가지로 Perl DBI도 트랜잭션 처리를 지원합니다. 두 가지:
1. 데이터베이스에 연결할 때 트랜잭션을 시작합니다.
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
위 코드는 연결 시 AutoCommit을 false로 설정합니다. 데이터베이스 현재로서는 해당 업데이트를 데이터베이스에 직접 자동으로 기록하지 않지만, 이전 업데이트를 롤백하려면 $dbh->commit 또는 $dbh->rollback을 통해 실제로 데이터베이스에 데이터를 기록하는 프로그램이 필요합니다. 작업.
2. $dbh->begin_work() 문을 통해 트랜잭션을 시작합니다.
이 방법은 데이터베이스에 연결할 때 AutoCommit = 0을 설정할 필요가 없습니다.
각 트랜잭션 시작 시 데이터베이스에 연결할 필요 없이 하나의 데이터베이스 연결로 여러 트랜잭션 작업을 수행할 수 있습니다.
$rc = $dbh->begin_work or die $dbh->errstr; ##################### ##这里执行一些 SQL 操作 ##################### $dbh->commit; # 成功后操作 ----------------------------- $dbh->rollback; # 失败后回滚
데이터베이스 연결 끊기
데이터베이스 연결을 끊어야 하는 경우 연결 끊기 API를 사용할 수 있습니다:
$rc = $dbh->disconnect or warn $dbh->errstr;