2010년 4월 12일 월요일

linux서버에서 python으로 mysql 사용하는 cgi쉽게 만들기

집필자 : shinmoosung 님이 쓰신 글입니다. 좋은 자료가 될꺼 같아 가지고 왔습니다.


먼저 리눅스 서버를 설치하고,
1. apache 2.0.x이상
2. python최신버전
3. mysql 최신버전
4. MySQLdb(mysql.org의 download에 보면, python 연결용 connector들을 제공한다)

각각의 프로그램의 설치는 이곳에서 설명을 생략한다.

단, apache의 httpd.conf에서는 AddHandler cgi-script .cgi를 설정하는 것과 cgi가 실행될
디렉토리에서 Options +ExecCGI 를 해주어야 cgi가 실행되므로 잊지 않고 설정한다.

이제 python의 라이브러가가 설치된 디렉토리로 간다.
python2.4.x버전에 설치되었다면 보통 /usr/lib/python2.4 폴더가 된다.

이곳에서 dp.py파일을 만들고

import _mysql
class usedb:
def __init__(self,MyDB='test'):
self.db = _mysql.connect(user='mysql',db=MyDB)
def __del__(self):
conn.close()
def query(self, SQLstr=''):
if SQLstr == '':
return "Nothing to execute"
self.db.query(SQLstr)
return self.db.store_result().fetch_row(0)

의 내용을 입력하고 저장한다. 그리고 파일권한은 644로 해둔다.
위의 내용에서 볼 수 있는 것처럼 mysql에는 기본적으로 test데이터 베이스가 있으므로, 데이터베이스를 지정하지 않았을 때는 자동적으로 그것을 사용하게 하였다.

user는 mysql계정으로 사용한다. 이것은 최근의 mysql버전의 설치에서 기본적으로 만들게 되는 계정이므로 그대로 사용한다.

이제 cgi를 실행하도록 된 디렉토리로 가서 아래의 내용으로

test.cgi를 만든다.
#!/usr/bin/python
print "Content-Type: text/html\n"
from db import usedb

s = "show tables;"
d = usedb('information_schema')
print d.query(s)

d = usedb()
print d.query(s)

파일을 저장하고 권하는 755로 한다.

그리고 웹에서 접속해 보면 test.cgi는 python을 이용하여, mysql의 데이터베이스를 사용하는 것을 볼 수 있다.
information_schema는 최신 mysql에서 기본적으로 제공하는 데이터베이스이다.
usedb() 처럼 데이터 베이스를 지정하지 않은 경우 자동적으로 test데이터베이스를 사용한다. SQL문법에 대한 설명은 생략한다.

이상으로 linux의 apache서버에서 python을 사용하여 cgi를 작성한 후, mysql데이터 베이스를 사용할 수 있는 방법을 설명하였다.

이상의 내용은 본인이 밤을 새워가면서, 외국의 자료들을 찾아가면서 얻은 값진 지식입니다. 국내에서는 이러한 지식을 보지 못했네요. 아직까지는요. MySQLdb를 써도 좋기는 합니다.
앞의 내용이 잘못된 부분이 있어서 코드를 완전히 수정해서 다시 올립니다. 신고
shinmoosung (2006-04-10 14:04)출처 : [직접 서술] 앞의 내용처럼 본인이 직접 코딩한 것입니다. 다른 분들이 발전시켜도 좋습니다.

앞의 내용은 제가 약간 이해를 못한 부분이 있어서 약간의 문제를 포함하고 있었음을 사과드립니다.
아래의 내용은 완전히 테스트를 통해 확인한 내용입니다.

먼저 클래스를 정의한 db.py의 내용을 아래처럼 수정합니다.

--------------------------------------------------------------------------------
import _mysql

class usedb:
def __init__(self, MyDB='test'):
self.DBname=MyDB
def do(self, SQLstr=''):
if SQLstr == '':
return "Nothing to do"
self.db=_mysql.connect(db=self.DBname,user='root')
self.db.query(SQLstr)
self.result=self.db.store_result().fetch_row(0)
self.db.close()
return self.result



--------------------------------------------------------------------------------

user='root' 부분은 각자의 mysql설정에 따라서 실행이 가능한 계정이면 됩니다.
즉, user='mysql'일 수도 있고, mysql설정에 따라서 아주 생략해도 되기도 합니다.
이제는 cgi가 실행되는 디렉토리에 test.cgi를 생성해서 다음의 내용을 입력합니다.

--------------------------------------------------------------------------------

#!/usr/bin/python
print "content-type:text/html\n"



from db import *
import cgitb; cgitb.enable()


d = usedb('mysql')
s= d.do("show tables;")
print s
print "

"

d = usedb('information_schema')
print d.do('show tables;')
--------------------------------------------------------------------------------

import cgitb; cgitb.enable()은 코드 디버깅을 위한 것이므로, 디버깅이 끝나면 삭제합니다.
이 예제 cgi에서는 mysql데이터베이스와 information_schema데이터베이스의 테이블목록을 보여주는 단순한 쿼리를 실행합니다.

일단 이것이 성공하면, 다른 SQL쿼리들도 된다는 이야기이지요.

웹에서 http://서버/test.cgi 로 실행합니다.

(리눅스)linux apache에서 python을 사용해서 mysql사용하기 신고
shinmoosung (2006-04-10 15:24)출처 : [직접 서술] 제가 직접!!! 연구하고 작성한 코드들입니다. 부족한 부분은 다른 사람들이 고쳐서 쓰세요. 이로써 리눅스의 아파치 서버에서 파이썬(python)으로 mysql데이터베이스 프로그래밍이 아주~~ 쉽게 가능해졌네요... php, jsp, asp 모두 물렀거라! 가장 쉬운 파이썬 나가신다~

앞에서 작성된 db.py 클래스 코드에 데이터베이스를 생성하는 createdb 메서드와 dropdb 메서드를 추가하여 완성한 코드를 올립니다.


db.py

--------------------------------------------------------------------------------
import _mysql

class usedb:

def __init__(self, MyDB='test'):
self.DBname=MyDB

def do(self, SQLstr=''):
if SQLstr == '':
return "Nothing to do"
self.db=_mysql.connect(db=self.DBname,user='root')
self.db.query(SQLstr)
self.result=self.db.store_result().fetch_row(0)
self.db.close()
return self.result

def createdb(self, MyDB):

"""db이름이 지정되지 않았으면 오류"""
if MyDB == '':
return "Specify the Database name to be created."

self.db=_mysql.connect(db='test',user='root')

"""같은 이름의 db가 있으면 오류"""
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
self.db.close()
return "Database already exits!"

"""db 생성 및 결과 반환"""
self.db.query("create database " + MyDB + ";")
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
return "Database successfully created!"
self.db.close()

def dropdb(self, MyDB):

"""db이름이 지정되지 않았으면 오류"""
if MyDB == '':
return "Specify the Database name to drop."

self.db=_mysql.connect(db='test',user='root')

"""삭제할 db가 있으면 삭제 실행"""
self.db.query("show databases;")
self.result=self.db.store_result().fetch_row(0)
for i in self.result:
if i[0] == MyDB:
self.db.query("drop database " + MyDB + ";")
self.db.close()
return "Database successfully droped!"
self.db.close()
return "Specified database not exits!"



--------------------------------------------------------------------------------

자세한 사용설명은 위의 내용을 참고하시고,
실제 사용 코드는 다음과 같습니다.

--------------------------------------------------------------------------------
#!/usr/bin/python
print "content-type:text/html\n"

from db import *
import cgitb; cgitb.enable()

#데이터 베이스 생성

d = usedb()
s = d.createdb("mydb")
print s
print "

" # -->그냥 줄넘기기 *^^*


#데이터 베이스 삭제
s = d.dropdb("mydb")
print s
print "

"
--------------------------------------------------------------------------------

출처 : [직접 서술] 이상의 내용은 본인이 밤을 새워가면서, 외국의 자료들을 찾아가면서 얻은 값진 지식입니다. 국내에서는 이러한 지식을 보지 못했네요. 아직까지는요. MySQLdb를 써도 좋기는 합니다.

댓글 없음:

댓글 쓰기