이 강좌는 bonkora님께서 작성해 주셨습니다.
데이터베이스 프로그램 중 널리 쓰이는 것 중 하나가 MySQL입니다. 이 강좌에서는 MySQL을 사용하기 위하여 만들어진 확장패키지 mysqltcl의 기본적인 사용방법에 대하여 설명합니다. MySQL의 설치와 사용법에 대해서는 따로 설명하지 않습니다. 사용한 Tcl/Tk 배포판은 ActiveTcl입니다. mysqltcl의 설치는 매우 간단합니다.
mysqltcl-3.03.zip을 다운로드한 후 이것을 AcitveTcl이 설치된 폴더에 있는 lib 폴더 아래에 풀어 넣습니다. 예를 들어 ActiveTcl이 설치되어 있는 폴더가 C:\Tcl이라고 가정하면 C:\Tcl\lib\mysqltcl-3.03 이렇게 폴더가 배치됩니다. 이제 Wish의 콘솔에서 대화식으로 새로운 데이터베이스를 만들고 레코드를 편집하는 과정을 공부해 보겠습니다. 당연히 MySQL 서버가 작동 중이어야 합니다. "%" 이후는 명령문이고 "=>" 이후는 인터프리터의 응답입니다.
% package require mysqltcl
=> 3.03
패키지를 사용한다고 선언합니다.
% set db [mysqlconnect -user root]
=> mysql0
다음엔 사용자명 root로 MySQL 서버에 연결합니다. mysqlconnect 명령은 실행결과를 핸들로 돌려주는데 이것을 db라는 변수에 저장합니다. -user 외에 사용할 수 있는 옵션은 -password, -db, -port, -socket 등이 있습니다. 이미 만들어져 있는 데이터베이스가 있을 경우 -db 옵션을 "-db filename"의 형식으로 사용하면 다음에 나올 mysqluse 명령을 사용할 필요가 없어집니다.
% mysqlexec $db "CREATE DATABASE phone"
=> 1
SQL 명령을 사용하여 phone이라는 이름의 데이터베이스를 만듭니다. 인터프리터는 만든 데이터베이스의 개수를 돌려줍니다.
% mysqluse $db phone
데이터베이스 phone을 사용한다고 선언합니다.
% mysqlexec $db "CREATE TABLE phone ( name CHAR(10) NOT NULL, phoneno CHAR(11) NOT NULL)"
=> 0
이제 그 데이터베이스에 테이블을 만들 차례입니다. 10자 길이의 문자자료형 자료룰 담을 name과 11자 길이의 문자자료형 자료가 들어갈 phoneno라는 필드가 들어가는 테이블을 만들었습니다.
% mysqlinfo $db tables
=> phone
mysqlinfo 명령으로 현재 열려있는 데이터베이스에 어떤 테이블이 포함되어 있는지 볼 수 있습니다.
% mysqlcol $db phone {name type length}
=> {name string 10} {phoneno string 11}
mysqlcol 명령으로 테이블 phone에 포함된 필드의 이름, 데이터유형, 길이를 출력합니다.
% mysqlexec $db "INSERT INTO phone VALUES ('홍길동', '12312341234')"
=> 1
% mysqlexec $db "INSERT INTO phone VALUES ('심순애', '34534563456')"
=> 1
% mysqlexec $db "INSERT INTO phone VALUES ('이수일', '67867896789')"
=> 1
이제 테이블에 레코드를 입력해 넣습니다. "SELECT" 외의 SQL 명령을 쓸 때에는 mysqlexec 명령을 사용합니다.
% mysqlsel $db "SELECT * FROM phone"
=> 3
이제 만든 레코드를 출력해 봅니다. SQL 명령 중 "SELECT" 명령을 사용할 때는 mysqlsel 명령을 사용하고 "SELECT" 외의 SQL 명령을 쓸 때에는 mysqlexec 명령을 사용합니다. 위 명령으로는 phone 테이블에 포함된 모든 자료의 개수를 알 수 있습니다. 자료의 내용을 알려면 다음과 같은 명령을 사용해야 합니다.
% mysqlsel $db "SELECT * FROM phone" -list
=> {홍길동 12312341234} {심순애 34534563456} {이수일 67867896789}
옵션 "-list"를 붙여서 자료를 리스트의 형태로 볼 수 있습니다.
% mysqlsel $db "SELECT * FROM phone" -flatlist
=> 홍길동 12312341234 심순애 34534563456 이수일 67867896789
"-flatlist" 옵션은 전체 레코드를 하나의 리스트로 합쳐서 출력합니다. 이런 형태의 자료는 foreach 명령을 사용할 때 쓰기 좋습니다. 다음으로는 레코드를 편집하는 명령어를 살펴봅니다.
% mysqlexec $db "UPDATE phone SET name = '이순신', phoneno = '34534563456' WHERE name = '심순애'"
=> 1
"SELECT" 외의 SQL 명령을 쓸 때에는 mysqlexec 명령을 사용한다고 앞서 언급되었습니다. 위의 명령은 WHERE 구의 조건에 맞는 레코드를 찾아 내용을 수정할 때 사용하는 것입니다. 명령은 수정된 레코드의 개수를 돌려줍니다.
% mysqlsel $db "SELECT * FROM phone" -list
=> {홍길동 12312341234} {이순신 34534563456} {이수일 67867896789}
수정된 레코드를 볼 수 있습니다.
% mysqlexec $db "INSERT INTO phone VALUES ('강감찬', '78978907890')"
=> 1
이번에는 레코드를 추가하는 명령입니다.
% mysqlsel $db "SELECT * FROM phone" -list
=> {홍길동 12312341234} {이순신 34534563456} {이수일 67867896789} {강감찬 78978907890}
추가된 레코드가 보입니다.
% mysqlsel $db "DELETE FROM phone WHERE name = '이순신'"
=> -1
조건에 맞는 레코드를 삭제하는 명령입니다. 하나의 레코드가 줄었다고 인터프리터가 응답합니다.
% mysqlsel $db "SELECT * FROM phone" -list
=> {홍길동 12312341234} {이수일 67867896789} {강감찬 78978907890}
삭제가 되었음을 알 수 있습니다. 지금부터는 실제 프로그래밍 시 데이터베이스의 자료를 변수와 엔트리로 주고받는 것을 실습해 봅니다.
% set var "11122223333"
=> 11122223333
변수 var에 11122223333이라는 값을 저장합니다.
% mysqlexec $db "UPDATE phone SET phoneno = $var WHERE name = '홍길동'"
=> 1
이 변수의 값을 데이터베이스의 레코드에 넣으려면 위와 같이 합니다.
% mysqlsel $db "SELECT * FROM phone" -list {홍길동 11122223333} {이수일 67867896789} {강감찬 78978907890}
그 결과입니다.
% set var [mysqlsel $db "SELECT phoneno FROM phone WHERE name = '홍길동'" -list]
=> 11122223333
그 역으로 레코드의 한 필드에서 값을 빼내서 변수에 저장하는 명령입니다. 이제 레코드의 내용을 엔트리 위젯에 주고받는 것을 실습합니다.
% entry .e; pack .e;
위와 같이 명령하여 Wish 창에 엔트리를 하나 만듭니다. 그 엔트리에 55566667777이라는 값을 입력합니다. 그림이 없어도 쉽게 이해될 수 있는 내용이라 그림을 넣지 않았습니다.
% mysqlexec $db "UPDATE phone SET phoneno = '[.e get]' WHERE name = '홍길동'"
=> 1
그 후 위와 같이 엔트리의 값을 레코드로 가져옵니다.
% mysqlsel $db "SELECT * FROM phone" -list
=> {홍길동 55566667777} {이수일 67867896789} {강감찬 78978907890}
위와 같이 그 작업의 결과가 반영됩니다.
% .e delete 0 end
다음으로는 엔트리의 값을 위와 같이 하여 지웁니다.
% .e insert end [mysqlsel $db "SELECT phoneno FROM phone WHERE name = '홍길동'" -list]
그 후 레코드의 값을 엔트리에 넣습니다.
% mysqlclose $db
열려있는 데이터베이스를 닫습니다.