Accessing RDMBS Using Twisted

Twsited Matrix Framework 상에서 DB에 접속하려면,
해당 DB의 python 모듈이 설치되어 있어야 한다.

예) mysql용 : mySQl for python 모듈 (sourceforge.net에서 다운받는다)

1. 필요한 라이브러리 import

from twisted.enterprise import adbapi
from twisted.internet   import reactor

2. DB에 접속하기
dbpool = adbapi.ConnectionPool('dbmodule', 'mydb', 'id', 'password')
의 형식으로 기록한다.

따라서, 다음의 두 방법과 같이 접속 정보를 기록할 수 있다.
  1) 방법 #1
 dbpool = adbapi.ConnectionPool('MySQLdb', db='test', user='me', passwd = '1234')

  2) 방법 #2
DB_DRIVER = 'MySQLdb'
DB_ARGS = {
        'host' : 'localhost',
        'db'   : 'test',
        'user': 'me',
        'passwd' : '1234',
}

dbpool = adbapi.Connectionpool(DB_DRIVER, **DB_ARGS)

3. 일반 query 실행시키기
def getCount():
    return dbpool.runQuery("SELECT * FROM log")

def printResult(l):
    if l:
        print l[0][0], 'records'

getCount().addCallback(printResult)
위와 같이 하면, SELECT문이 asynchrous하게 실행되고, 결과가 도착하면 printResult 한다.

4. Callable  객체를 실행시키기 (함수, transaction)
def _get10(txn):
    txn.execute(..do something..)
    txn.execute("SELECT * FROM log limit 10")
    result = txn.fetchall()
    
    if result:
        return result[0][0]
    else:
       return None

def get10():
    return dbpool.runInteraction(_get10)

def print10(data):
    if data != None:
        print data, 'data found'
    else:
        print 'no such data'

get10().addCallback(print10)

이와 같이 하면, _get10()을 수행한 결과가 리턴된다.

5. 리턴값 형식 확인
리턴값이 result[0][0]의 형식으로 되는 이유는, 테이블이기 때문이다.
즉, 온전한 데이터는 x * y의 형태이다.

ㅁ len(result) = 결과값의 레코드 수
ㅁ len(result[0]) = 컬럼수
ㅁ len(result[0][0]) - 에러! 왜냐하면 2차원으로 참조하면 실질적인 데이터를
   나타내기 때문이다.


Q) 자동으로 commit이 된다던데, 명시적으로 commit하거나 roll back 하는 함수도 있는지 찾아봐야겠다







댓글

Designed by JB FACTORY