everydayminder

learn something everyday

Archive for October 2008

[Twisted] adpapi – Query 실행하기/ CallBack 함수에 argument 전달하기

leave a comment »

일단, Query를 실행하는 방법은 크게 두 가지를 쓸 수 있겠다.

runQuery()를 사용하는 방법과, runInteraction()을 사용하는 방법이다.

주어진 table에서 10개의 row를 가져오고자 한다고 했을때,

1) runQuery() 사용하기


def getCount():

return dbpool.runQuery(“select * from test”)


def printResult(l):

if l:

result = l[0][0]
print l[0][0], ” records”

else:


print “no rows fetched”


dbpool = adbapi.ConnectionPool(‘MySQLdb’, db=’abcd’, user=’abcd’, passwd=’abcd’)
getCount().addCallback(printResult)
reactor.run()


2) runInteraction() 사용하기


def get10():

return dbpool.runInteraction(_get10)


def _get10(txn):

txn.execute(“select * from test”)
result = txn.fetchall()

if result:


return result


else:

return None


def print10(data):

if data != None:

print data, ‘ data found’


else:

print ‘no data’


 


dbpool = adbapi.ConnectionPool(‘MySQLdb’, db=’abcd’, user=’abcd’, passwd=’abcd’)
getCount().addCallback(printResult)

get10().addCallback(print10)
reactor.run()



위와 같은 서로 다른 방법으로 구성할 수 있다. 이때, runInteraction을 사용하면, function에 대해 실행할 수 있고, transaction 단위로 실행시킬 수 있다는 점이다. 

또한, 별도의 메타정보가 함께 결과에 포함되지 않는 것 같으므로, 메타 정보를 query를 실행할 때 미리 주고 싶다면??
 
이렇게 하는 수도 있겠다. 실행이 synchronous 하지 않으므로, 어떤 필드가 어떻게 매핑되어야 할지는 query와 함께 움직여야 하지 않을까? 그래서, Callback 함수에 테이블의 메타 정보를 한번 심어봤다. runQuery()와, runInteraction()에 각각. 동작이 하는 경우는 runInteraction()의 경우이다.

예를 들어, 넘기고자 하는 파라미터가 list l = (‘a’,’b’,’c’,’d’)라고 하면, 각각의 함수는 다음과 같이 바뀔 것이다.

1. runQuery()의 경우


def getCount(param-list):

return dbpool.runQuery(“select * from test”, param_list)


def printResult(l, param_list):

# 동일

그러나, 이 경우는 에러가 발생한다. runQuery의 파라미터로 쿼리문과 함께 사용자 정의 파라미터를 전달하고 싶지만, printResult callback 문으로 전달될 수 없다. (물론 방법이 있겠지만, 나는 모르겠다. 아직은 ^^;)

한편, 이 상황을 runInteraction()을 사용하는 경우에는 해결 가능한 문제가 된다.

2. runInteraction()의 경우


def get10(param_list):

return dbpool.runInteraction(_get10, param_list)   # _get10 파라미터로 param_list 지정


def _get10(txn, param_list):

# param_list로 하고 싶은 작업을 할 수 있다
txn.execute(“select * from test”)
result = txn.fetchall()
if result:

return [param_list, result]

else:

return [param_list, None]

# 결과를 list로 return 한다.


def print10(data):

if data != None:

meta = data[0]      # param_list from _get10
record = data[1]    # result from _get10

get10()이나 _get10()에 다른 형태로 param_lsit를 곧바로 넘기려고 하면, tuple에 addCallback할
수 없다는 에러가 뜨거나, 원하는 형태로 전달할 수 없음을 확인했다.

따라서, 위의 방법과 같이, result와 넘겨주려는 데이터를 함께 리스트로 넘겨서 직접 확인하는
방법을 구상해보았다. (리스트 또는 dict 형태로 하면 좋을 것 같다.) 더 좋은 방법이 떠오르면,
추가로 기록해야겠다.



 



 

Written by everydayminder

October 31, 2008 at 04:02

Posted in python

내 VIM이 설치된 곳은 어디?

leave a comment »

linux에서 vi를 쓰다보면, 어디에 설치되었는지 모르는 웃지 못할 상황이 생기곤 한다.

type/ which 명령어를 써도 명확히 알기 어렵다.
이럴 때!!

vi를 실행시킨 상태에서 확인이 가능하다는 사실!
 


:!echo $VIMRUNTIME

Written by everydayminder

October 29, 2008 at 13:08

Posted in vim

공공요금?

leave a comment »

택시요금 : taxi fare
버스요금 : bus fare
지하철 요금 : subway fare
수도요금 : water rate
전기세 : electric charge

헷갈릴 때는 charge만 써도 된다~~~

Written by everydayminder

October 21, 2008 at 23:57

Posted in Life/English

Python

leave a comment »

XML
ElementTree   : XML Library

External Library
Optik : optparse (Option Parser for Python)
logging : logging facility for Python

Framework
Medusa : Medusa Framework
TwistedMatrix : Twisted Matrix Framework

Basic Knowledge
Understanding Threading in Python : Let’s read this article on threading

Written by everydayminder

October 17, 2008 at 06:13

Accessing RDMBS Using Twisted

leave a comment »

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 하는 함수도 있는지 찾아봐야겠다

Written by everydayminder

October 15, 2008 at 04:12

Posted in python

테이블 내용을 파일로 출력하기

leave a comment »

mysql> select * into outfile ‘파일명’ fields terminated by ‘구분자’ from 테이블명

Written by everydayminder

October 14, 2008 at 11:44

Posted in mySQL

OptionParser를 활용한 commandline parsing 하기

leave a comment »

Optik (aka optarse) 를 사용하면, pytthon 애플리케이션 개발시 커맨드라인 옵션/
파라미터를 파싱하기 쉬워진다.

예를 들어서,

“실행파일명 –config 파일명” 으로 구성되는 형태의 옵션을 만들고 싶다면,
다음과 같이 간단하게 구성할 수 있다.





from optik import OptionParser


def main():
    usage = “usage: %prog [options] arg”
    parser = OptionParser(usage)
    parser.add_option(“-c”, “–config”, action=”store”, type=”string”, dest=”filename” )


    (options, args) = parser.parse_args()
   
    if options.filename:
        print “cfg : %s” % options.filename


main()

add_option() 내에 사용된 옵션에 대해 첨언하자면,
ㅁ -c : 한개의 대쉬 문자 뒤에 지정되는 문자는 1 캐릭터여야 한다
ㅁ –config : 풀로 표기하는 옵션은 두개의 대쉬 문자뒤에 표기한다.
   (두 개의 위치는 바뀌어도 상관없다. 표기만 제대로 한다면)
ㅁ action=”store” : c/config  옵션 뒤에 오는  argument를 활용하기 위해 지정함.
ㅁ type=”string” : 문자열을 받도록 해줌
ㅁ dest=”filename” : 나중에 c/config 등등 다양한 형태로 지정된 옵션을 통합하여,
  호출할 때 사용됨. 즉, c/config 옵션은 “filename”이라는 옵션으로 통합하여
  인지한다.
  action = “store” 로 저장한 파일이름은 options.filename의 속성값으로 활용한다.

기본적으로 -h/ –help 옵션은 deploy된다. 즉 테스트파일에 –help 옵션을 줘서
실행하면,





 Usage: OptionTester.py [options] arg


Options:
  -h, –help            show this help message and exit
  -c FILENAME, –config=FILENAME


와 같이 결과가 나온다.
여기에서 참고할 만한 내용은, 대쉬의 개수에 따라 동작이 다르게 될 수도 있다는 점.

동일한 결과를 내려면.




-c FILENAME
–config=FILENAME
–config FILENAME

의 형태로 활용할 수 있다.

보다 자세한 설명 및 활용 방법은
http://optik.sourceforge.net/ 에서 확인할 수 있다.

Written by everydayminder

October 2, 2008 at 06:38

Posted in python