펄 데이터베이스 연결
우리는 당신을 소개합니다이 장에서는 펄 데이터베이스를 연결합니다.
펄 (5), 우리는 데이터베이스에 연결 DBI 모듈을 사용할 수있다.
DBI 영어 이름 : 데이터베이스 독립적 인 인터페이스, 중국어 데이터베이스 독립적 인 인터페이스를했다.
DBI 및 방법, 변수 및 상수들의 세트를 정의하고, 특정 데이터베이스 플랫폼 독립적 인 데이터베이스 지속성 층을 제공 Perl 언어 데이터베이스 인터페이스 통신 표준있다.
DBI 구조
DBI 및 특정 데이터베이스 플랫폼 독립적 인, 우리는 오라클, MySQL의 또는 인포믹스 및 기타 데이터베이스에 적용 할 수 있습니다.
모든 차트 DBI의 API (응용 프로그래밍 인터페이스 : 애플리케이션 프로그래밍 인터페이스)를 얻기 구현에 대응하는 드라이버 SQL 데이터에서 보낸 후 분산을하고, 마지막으로 데이터를 다시 얻는다.
변수 이름 규칙
변수 이름의 일반적인 이름의 다음 세트 :
$dsn 驱动程序对象的句柄 $dbh 一个数据库对象的句柄 $sth 一个语句或者一个查询对象的句柄 $h 通用的句柄 ($dbh, $sth, 或 $drh),依赖于上下文 $rc 操作代码返回的布什值(true 或 false) $rv 操作代码返回的整数值 @ary 查询返回的一行值的数组(列表) $rows 操作代码返回的行数值 $fh 文件句柄 undef NULL 值表示未定义 \%attr 引用属性的哈希值并传到方法上
데이터베이스 연결
다음으로, 우리는 어떻게 데이터베이스 작업의 예를 들어 MySQL 데이터베이스와 펄을 보여줍니다.
여기에서 우리는 다음과 같습니다 MySQL의 데이터베이스 w3big 데이터 테이블 웹 사이트, 테이블 구조와 데이터의 데이터베이스를 만들 :
: 데이터 시트 다운로드 http://static.w3big.com/download/websites_perl.sql을
다음으로, 우리는 데이터베이스에 연결하려면 다음 코드를 사용합니다 :
#!/usr/bin/perl -w use strict; use DBI; my $host = "localhost"; # 主机地址 my $driver = "mysql"; # 接口类型 默认为 localhost my $database = "w3big"; # 数据库 # 驱动程序对象的句柄 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();
삽입
단계 :
- API는 SQL 문을 준비 ()을 준비합니다.
- SQL 문을 실행하는 실행 () API를 사용합니다.
- 명령문 핸들을 해제 마무리 () 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;
업데이트 작업
단계 :
- API는 SQL 문을 준비 ()을 준비합니다.
- SQL 문을 실행하는 실행 () API를 사용합니다.
- 명령문 핸들을 해제 마무리 () 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 = '本教程'; my $sth = $dbh->prepare("UPDATE Websites SET alexa = alexa + 1 WHERE name = ?"); $sth->execute('$name') or die $DBI::errstr; print "更新的记录数 :" + $sth->rows; $sth->finish();
물론, 우리는 또한 값이 나라가 1000 CN의 알렉사를 수정해야합니다 위해 다음과 같이 설정할 수 바인딩 할 수 있습니다 :
$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();
데이터를 삭제
단계 :
- API는 SQL 문을 준비 ()을 준비합니다.
- SQL 문을 실행하는 실행 () API를 사용합니다.
- 명령문 핸들을 해제 마무리 () API를 사용합니다.
- 모두가 잘 어울리는 경우 마지막으로,이 작업을 통해 제출됩니다.
다음 데이터 알렉사 데이터 것 웹 사이트는 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;
사용 문을
문은 UPDATE, INSERT를 수행하거나 작업을 삭제할 수 있습니다않습니다, 그는 다음과 같은 예는, 성공적으로 실행이 true를 반환, 아주 짧은 false를 반환 실패
$dbh->do('DELETE FROM Websites WHERE alexa>1000');
작업을 COMMIT
데이터베이스 작업을 완료하기 위해 트랜잭션을 커밋하는 커밋
$dbh->commit or die $dbh->errstr;
ROLLBACK 작업
오류가 SQL의 실행 중에 발생하면 변경없이 데이터를 롤백 할 수 있습니다 :
$dbh->rollback or die $dbh->errstr;
사무
다른 언어, 데이터베이스의 펄 DBI 동작은이를 달성하는 방법은 두 가지가 있으며, 트랜잭션 처리를 지원
하나는,베이스에 연결에서 트랜잭션을 시작할 때
$dbh = DBI->connect($dsn, $userid, $password, {AutoCommit => 0}) or die $DBI::errstr;
자동 커밋 설정 연결시 위의 코드는이 데이터베이스 작업을 업데이트 할 때, 자동으로 데이터베이스에 직접 기록들을 업데이트하지 않습니다이며, 거짓이지만, $ dbh-에 의해 프로그램에>에 투입 데이터가 실제로 데이터베이스에 기록하도록, 또는 $ dbh-> 롤백 작업을 롤백합니다.
2, $ dbh-> begin_work에 의해 () 문은 트랜잭션을 시작합니다
이러한 방식으로, 데이터베이스 연결 시간에 자동 커밋 = 0을 설정할 필요는 없다.
당신은 할 모든 트랜잭션이 데이터베이스에 연결하기 시작, 데이터베이스 트랜잭션 작업을 여러 번에 연결할 수 있습니다.
$rc = $dbh->begin_work or die $dbh->errstr; ##################### ##这里执行一些 SQL 操作 ##################### $dbh->commit; # 成功后操作 ----------------------------- $dbh->rollback; # 失败后回滚
데이터베이스 연결을 분리
우리가 데이터베이스에서 분리해야하는 경우, 당신은 차단 API를 사용할 수 있습니다 :
$rc = $dbh->disconnect or warn $dbh->errstr;