본문 바로가기

Common Gateway Interface/Perl

[옛 강좌] 33. Perlprog - perl & db

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 이 게시물은 지금은 폐쇄되어 접속되지 않는 Kim Young Soo(http://hours.interpia98.net/~unisoo/)님의 웹 사이트에 2001년경 게시된 내용을 바탕으로 오늘날 웹 환경에 맞게 내용을 덧붙였습니다.

Perlprog - perl & db

Description

Perl과 DB의 연동 1 - DBI, DBD 모듈에 관하여


들어가기(Start)

 이번부터는 Perl과 데이터베이스 프로그램을 연동하는 것에 대해 알아 보겠습니다. 이것두 어디까지나, 제가 아는 한도내에서 말씀드리겠습니다. 강좌 도중 이상하거나, 틀린점이 있으시면, 바로, 게시판이나 멜을 주시기 바랍니다.

 전제사항 : 이 글을 읽으시는 분들은 이미 사용하는 DB와 펄에 대하여 어느정도 아신다는 전제하에 썼습니다.


DBI, DBD 모듈에 관하여

 펄에서 DB와 연동을 하기 위해서는 DBI, DBD모듈이 있어야 합니다. DBI 모듈은 어떤 데이타베이스 프로그램을 쓰든지, 일괄된 함수(메소드)로 프로그래밍을 가능하게 해주며, DBD 모듈은 일종의 구동기입니다. 쓰고자 하는 데이터베이스 프로그램에 맞는 DBD 모듈을 사용하시면 됩니다. 지원되는 DBD 모듈은 아래에 주소로 가시면 확인하실 수 있습니다.

DBI, DBD 설치

 물론 최신버전을 설치하셨다면, DBI 모듈이 설치되어 있을수도 있지만, 그렇지 않은 경우가 더 많으므로, DBI 모듈을 먼저 다운 받아 설치합니다.

Win32 사용자

 http://www.activestate.com/packages/zips로 가시면 다운 받으실 수 있습니다.

DBI 모듈은 DBI.zip이란 이름으로 되어 있습니다.

DBD 모듈은..
- Mssql 사용자는 B<DBD-ODBC.zip> 파일을 다운받으시면 되구여, Oracle 사용자는 B<DBD-Oracle.zip> 파일을 다운받으시면 됩니다.

DBD-db명 - 이런 식으로 되어 있으니깐, 자신이 사용하는 DB에 맞는 DBD 모듈을 사용하시면 됩니다.

 설치는 위 파일을 다운 받으신 후 압축을 푸신 후(확장자가 ppd로 있습니다)

ppm install ***.ppd

하시면 설치가 됩니다. DBI 모듈 설치법도 같습니다.

Linux 사용자

 http://www.perl.com/CPAN-local/modules/01modules.index.html으로 가시면 다운 받으실 수 있습니다.

DBI 모듈은 여러가지 있지만, DBI-1.13.tar.gz 를 다운받으시면 됩니다(99/11/15 현재).

DBD 모듈은 윈도용 보다는 훨씬 많은 DBD 모듈이 존재 하구요, DBD 카테고리에 상당히 많은 모듈이 존재함을 보실 수 있습니다.

본인에게 필요한 DBD 모듈을 다운 받으신 후,

% gzip -cd DBD-**.tar.gz | tar xf -
% cd DBD-**
% perl Makefile.PL
% make
% make test
% make install
						

위와 같은 순서로 설치하시면 됩니다. DBI 모듈또한 설치는 같습니다.


DBI 모듈 사용

 DBI 모듈과 본인의 데이타베이스프로그램에 맞는 DBD 모듈을 설치하셨으면, 이제 준비는 끝났습니다.

 우리는 DBD 모듈이 어떻게 생겼는지는 몰라도 됩니다. DBI 모듈의 사용법만 아시면, 어떤 DB 프로그램과도 연동해서 원하는 작업을 하실 수 있습니다. 그럼 지금부터, 이 DBI 모듈을 하나씩 보겠습니다.

 이 DBI 모듈에는 너무나도 많은 메소드들이 있습니다. 이걸 다 보지는 않구여, 우리는 우리가 필요한 것만 보도록 하겠습니다. 더 많은 걸 알고싶으시면 DBI.html 문서를 참조하세요.

 다시 한 번 말씀 드리지만, 어떤 DB를 쓰든지 그건 상관없습니다. 그에 맞는 DBD 모듈을 설치하셨다면, 같은 코드를 사용하시면 됩니다. 프로그램에 들어가면,

#!/usr/local/bin/perl

use DBI; #DBI모듈을 사용한다고 알립니다.
				

connect() 메소드

 그러면 우선 우리가 사용하고자 하는 DB에 접속을 할 수 있어야 합니다. 이 때 사용하는 메소드는 connect()입니다.

$dbh = DBI->connect('DBI:db_driver:db_name', 'user', 'pass') || die $DBI::errstr;

위와 같은 형식으로 사용하게 됩니다.

# Mssql 사용시
$dbh = DBI->connect('DBI:ODBC:db_name', 'sa', '') || die $DBI::errstr;

# mSql 사용시
$dbh = DBI->connect('DBI:mSQL:db_name', 'user', 'pass') || die $DBI::errstr;
					

사용 예

#! /usr/bin/perl

use DBI;

$driver = "mSQL";
$dsn = "DBI:$driver:database=$database;host=$hostname";
$dbh = DBI->connect($dsn, undef, undef);
					

또는

$driver = "mysql";
$dsn = "DBI:$driver:database=$database;host=$hostname;port=$port";
$dbh = DBI->connect($dsn, $user, $password);
					

do(), prepare(), execute()

 접속이 되었구... 그러면 DB로 쿼리를 보내야져. 이 때 사용하는 메소드가 prepare(), execute(), do() 메소드입니다.

 prepare()execute()는 같이 작용을 하는 거니깐, do() 메소드 먼저 살펴보겠습니다.

do() 메소드

$query = "insert into db (idx, name) values (1, 'unicorn')";
$dbh->do($query);
						

이렇게 하시면 됩니다. 쉽죠?

perpare(), execute() 메소드

 prepare()는 어떤 쿼리문을 데이터베이스 프로그램으로 전송하기 전에 미리 준비한다고 생각하시면 됩니다.

execute()prepare()로 준비된 쿼리문을 실행한다고 생각하시면 됩니다.

그럼 예를 보겠습니다.

$sth = $dbh->prepare(q {insert into db (idx, name) values (1, 'unicorn')} );
$sth->execute();
						

위와 같이 하시면 됩니다. 하지만 이 두 메소드는 '?' 를 사용할 수 있습니다. 설명보다는 예를 보시는것이 이해하기 쉬우실 겁니다.

$idx = $input{'idx'};
$name = $input{'name'};

$sth = $dbh->prepare(q {insert into db (idx, name) values (?, ?)} );
$sth->execute($idx, $name);
						

위 소스만 보시더라도 '?'가 어떤 경우에 쓰이는지 아실수 있으실 겁니다.

 그리고 q{} 는 홀 따옴표를 넣어주는 펄의 함수입니다. 위의 do() 메소드 보다는, 아마도 prepare(), execute() 메소드를 더 많이 사용하시게 될 겁니다.

fetchrow_array

 접속도 하고, 쿼리도 보내고 했습니다. 그런데, 입력을 하거나 업데이트를 하는 건 상관없지만, select 쿼리를 써서 DB의 내용을 불러냈다면, 그 값을 사용할 수 있어야 합니다. select으로 불러진 값들을 저장하고 있는 곳이 fetchrow_array 입니다.

 다음은 사용예 입니다.

$dbh = DBI->connect("dbi:DriverName:db_name", $user, $password); # DB 접속
$sth = $dbh->prepare( q{ SELECT idx, name FROM db }); # 쿼리 준비
$sth->execute; # 쿼리 실행

# fetchrow_array 에 있는 값을 불러옴
while (($idx, $name) = $sth->fetchrow_array)
{
	print "$idx: $name\n";
}
					

위의 예처럼 사용하시면 됩니다.

finish, disconnect

finish

여러 번의 prepare()execute()를 사용해야 할 경우, 방금 전에 사용했던 명령을 종료합니다.

$sth = $dbh->prepare(q {insert into db (idx, name) values (?, ?)} );
$sth->execute($idx, $name);
$sth->finish;
$sth = $dbh->prepare(q {select idx, name from db} );
$sth->execute;
$sth->finish;
						

 여러 번의 쿼리를 전송할 경우 반드시 finish를 하신 다음에 하셔야 합니다.

disconnect

 접속되었던 DB와의 연결을 끊습니다.

$dbh = DBI->connect("dbi:DriverName:db_name", $user, $password);
# .....
$dbh->disconnect;
						

 위의 예와 같이 사용합니다.

errstr

 errstr 메소드는 DB 와의 통신 중에 발생하는 에러 메세지를 담고 있습니다.

$dbh = DBI->connect("dbi:DriverName:db_name", $user, $password) || die print "DBI::errstr\n";
$sth = $dbh->prepare(....) || die print "DBI::errstr\n";
$sth->execute || die print "DBI::errstr\n";
					

 errstr 메소드를 적절히 사용하면, 어디서, 왜 에러가 나는지를 알 수 있습니다. 유용하게 쓰입니다.

NOTES

 또한 여러 개의 DBD 모듈을 설치하시면, 여러 개의 DB에 동시에 접근할 수 있습니다.

 이 외에도 많은 메소드가 존재하지만, 꼭 필요한 것만 알아보았습니다. 더 자세히 알고 싶은 분은 DBI.html을 보시면 됩니다. 이번엔 Perl에서 DB를 사용할 수 있는 준비 과정이었습니다. 다음부턴 실제로 Perl 과 DB를 이용해서 프로그램을 작성해 보도록 하겠습니다.


이 문서는 Perl 패키지내의 pod2html를 이용하여 만들었습니다. - Kim Young Soo