manywaypark's Blog
개발, 검색, 함수

cl-sql 사용하기

함수형 언어/Lisp 2007. 5. 29. 14:01 by manywaypark
cl-sql은 common lisp에서 여러 종류의 DB backend에 접근하는데 사용할 수 있는 package이다.
간단히 (asdf-install:install 'clsql)로 될줄 았았는데, 잘 안됐다. library 로딩에 실패하고 어쩌구...
혹시나 하는 마음에 ubuntu(debian) packaging system apt를 이용해보기로 했다.
$ apt-cache search clsql
cl-sql - SQL Interface for Common Lisp
cl-sql-aodbc - CLSQL database backend, AODBC
cl-sql-mysql - CLSQL database backend, MySQL
cl-sql-odbc - CLSQL database backend, ODBC
cl-sql-postgresql - CLSQL database backend, PostgreSQL
cl-sql-postgresql-socket - CLSQL database backend, PostgreSQL
cl-sql-sqlite - CLSQL database backend, SQLite
cl-sql-sqlite3 - CLSQL database backend, SQLite3
cl-sql-tests - Testing suite for CLSQL
cl-sql-uffi - Common UFFI functions for CLSQL database backends
cl-sql-oracle - CLSQL database backend, Oracle
오호라, 필요한건 다 있는 거같다.
$ sudo apt-get install cl-sql cl-sql-mysql
......
sbcl을 실행하고 테스트해봤다.
$ sbcl
......
* (require 'clsql)

; loading system definition from /home/USER/.sbcl/systems/uffi.asd into
; #<PACKAGE "ASDF1">
; registering #<SYSTEM UFFI {10028CA001}> as UFFI
NIL
* (require 'clsql-mysql)
......
Couldn't load foreign libraries "libmysqlclient", "libmysql". (searched CLSQL-SYS:*FOREIGN-LIBRARY-SEARCH-PATHS*)
......
엥? 에러 컨디션?
사실 (require 'clsql-mysql)은 직접 호출하지 않아도 connect류 등의 관련 함수를 부르면 자동으로 올라오는데 그것들도 다 실패했다. 시스템에는 libmysql*이 전부 설치되어있었다.
이 문제는 다음 두가지 방법 중 하나를 선택해서 해결할 수 있다.
해결책1: 직접 uffi를 이용해서 library를 로딩. (참고:http://common-lisp.net/pipermail/cl-debian/2006-May/001287.html)
CL-USER> (uffi:load-foreign-library "/usr/lib/libmysqlclient.so.15")
해결책2: symbolic link 생성.
$ sudo ln -s /usr/lib/libmysqlclient.so.15.0.0 /usr/lib/libmysqlclient.so
(library 버전 번호는 필요한 것으로 선택한다.)

테스트:
CL-USER> (require 'clsql)
......
;;; connect params: host, db, user, password.
CL-USER> (clsql:connect '("localhost" "mysql" "root" "") :database-type :mysql)
#<CLSQL-MYSQL:MYSQL-DATABASE localhost/mysql/root OPEN {1003707EF1}>
CL-USER> (clsql:status)
CLSQL STATUS: 2007-05-28 21:21:31,,0
-----------------------------------------
   DATABASE              TYPE   RECORDING 
-----------------------------------------
*  localhost/mysql/root  mysql  nil       
-----------------------------------------
; No value
CL-USER> (clsql:list-databases '("localhost" "mysql" "root" "") :database-type :mysql)
("information_schema" "mysql")
CL-USER> (clsql:query "select * from user")
......
CL-USER> (clsql:disconnect :database (clsql:find-database "localhost/mysql/root"))
T
CL-USER> (clsql:status)
CLSQL STATUS: 2007-05-28 21:48:23,,0
; No value

참고: apt를 이용해서 lisp 모듈을 설치하면, /usr/share/common-lisp/ 아래에 설치된다. 소스 참고시 유용하다.

2008-04-15 :
oracle을 backend로 쓰려면 instant client download 페이지에서 필요한 파일을 다운로드 받아 특정 디렉토리에 압축을 풀어놓고 그 디렉토리를 LD_LIBRARY_PATH 환경변수에 추가하면 된다. 물론 위의 해결책2에서 처럼 symbolic link를 걸어주는 작업(버전 번호를 떼주는...)이 필요하다.

happy hackin'
분류 전체보기 (306)
잡담 (20)
함수형 언어 (65)
emacs (16)
java (18)
tips & tricks (154)
사랑 (1)
가사 (0)
독서 (4)
mobile (6)
비함수형 언어 (2)

공지사항

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

04-25 13:05