Archive for October 2008
[Twisted] adpapi – Query 실행하기/ CallBack 함수에 argument 전달하기
일단, Query를 실행하는 방법은 크게 두 가지를 쓸 수 있겠다.
runQuery()를 사용하는 방법과, runInteraction()을 사용하는 방법이다.
주어진 table에서 10개의 row를 가져오고자 한다고 했을때,
1) runQuery() 사용하기
print l[0][0], ” records”
getCount().addCallback(printResult)
reactor.run()
2) runInteraction() 사용하기
def _get10(txn):
result = txn.fetchall()
if result:
def print10(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()의 경우
그러나, 이 경우는 에러가 발생한다. runQuery의 파라미터로 쿼리문과 함께 사용자 정의 파라미터를 전달하고 싶지만, printResult callback 문으로 전달될 수 없다. (물론 방법이 있겠지만, 나는 모르겠다. 아직은 ^^;)
한편, 이 상황을 runInteraction()을 사용하는 경우에는 해결 가능한 문제가 된다.
2. runInteraction()의 경우
txn.execute(“select * from test”)
result = txn.fetchall()
if result:
record = data[1] # result from _get10
get10()이나 _get10()에 다른 형태로 param_lsit를 곧바로 넘기려고 하면, tuple에 addCallback할
수 없다는 에러가 뜨거나, 원하는 형태로 전달할 수 없음을 확인했다.
따라서, 위의 방법과 같이, result와 넘겨주려는 데이터를 함께 리스트로 넘겨서 직접 확인하는
방법을 구상해보았다. (리스트 또는 dict 형태로 하면 좋을 것 같다.) 더 좋은 방법이 떠오르면,
추가로 기록해야겠다.
내 VIM이 설치된 곳은 어디?
linux에서 vi를 쓰다보면, 어디에 설치되었는지 모르는 웃지 못할 상황이 생기곤 한다.
type/ which 명령어를 써도 명확히 알기 어렵다.
이럴 때!!
vi를 실행시킨 상태에서 확인이 가능하다는 사실!
공공요금?
택시요금 : taxi fare
버스요금 : bus fare
지하철 요금 : subway fare
수도요금 : water rate
전기세 : electric charge
헷갈릴 때는 charge만 써도 된다~~~
Python
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
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): getCount().addCallback(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(): def print10(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 하는 함수도 있는지 찾아봐야겠다
테이블 내용을 파일로 출력하기
mysql> select * into outfile ‘파일명’ fields terminated by ‘구분자’ from 테이블명
OptionParser를 활용한 commandline parsing 하기
Optik (aka optarse) 를 사용하면, pytthon 애플리케이션 개발시 커맨드라인 옵션/
파라미터를 파싱하기 쉬워진다.
예를 들어서,
“실행파일명 –config 파일명” 으로 구성되는 형태의 옵션을 만들고 싶다면,
다음과 같이 간단하게 구성할 수 있다.
from optik import OptionParser def main(): (options, args) = parser.parse_args() 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: |
와 같이 결과가 나온다.
여기에서 참고할 만한 내용은, 대쉬의 개수에 따라 동작이 다르게 될 수도 있다는 점.
동일한 결과를 내려면.
-c FILENAME –config=FILENAME –config FILENAME |
의 형태로 활용할 수 있다.
보다 자세한 설명 및 활용 방법은
http://optik.sourceforge.net/ 에서 확인할 수 있다.