태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

방법당하다 by python-mysqldb 1.2.1_p2

Tech 2008. 6. 11. 18:38
할일이 좀 있어서 python-mysqldb 모듈을 가지고 간단한 프로그램을 만들었다. 사용법은 참 간단했다.

import MySQLdb
db = MySQLdb.connect(host="localhost", user="deisys", db="deisys", passwd="xxxxxx")
cursor = db.cursor()

여기서부터는 cursor 를 가지고 놀면 된다. cursor.execute("show tables"), cursor.execute("create table test (id int)") 뭐 이런 식으로 ... 그래서 테스트를 위해서 엔트리 1억개를 insert 하는 코드를 만들었다. 대충 이런 모양이다.

 ...
 29 # Generate a bunch of (from, to) pairs and insert into the table
 30 values = []
 31 for x in xrange(0, VN):
 32     from = x
 33     digest.update(str(x))
 34     to = hash(digest.hexdigest()) % CN
 35     values.append( (from, to) )
 36     if from % CHUNK_SIZE == CHUNK_SIZE-1:
 37         query = "INSERT INTO info_test (from, to) VALUES " + ", ".join([str(x) for x in values])
 38         cursor.execute(query)
 39         values = [ ]
 ...

그런데... 몇분쯤은 걸리겠지 하는 생각에 엔터를 눌렀는데, 실행이 순식간에 끝난다. 엉? 엔트리 1억개를 넣는건데 1초도 안걸리다니, 요즘 DB가 졸 짱쎄졌구나! 라는 생각에 터미널 창에서 select * from info_test limit 1000; 을 때려 보았다.

mysql> select * from info_test limit 1000;
Empty set (0.00 sec)

mysql> _

엉? 뭐지? -_-; 그리고 삽질 시작. (cursor.close(), db.close() 도 밑에서 잘 해 주었다)

한시간쯤 뇌가 날아갔다가, 군것질을 하고 돌아오셨다. 그동안 몇몇 테스트를 해보면서 내린 결론은,

insert만 안된다

는 것. 왜 그럴까... insert는 쓰기 작업이고, 자주 일어나고, 연속적으로 일어나는 경우가 많으니까 아마도 어댑터가 나름 캐싱했을것 같은데 ... -> 빙고!

썅썅봐 -_-; db.close() 앞에 db.commit() 을 넣어주니까 제대로 들어간다. API에 보면,

commit(...)

Commits the current transaction


라고 달랑 한줄 나와있고, 나는 트랜잭션을 쓴 적이 없다. -_-; 아니 저게 없으면 방법당한다고 어디 한마디라도 써놓던가... ㅠㅠ 그리고 예의상(매너?) cursor.close() 나 db.close() 에서 들고 있는 캐시는 다 처리해 주어야 하는것 아님? -_-+

예전에 하둡님도 close 할때 flush 안해주셔서 초큼 난감했었는데, 이거 요즘 유행인가보다.

'Tech' 카테고리의 다른 글

Statement vs Expression  (4) 2008.07.22
emacs: switch indentation  (0) 2008.07.18
방법당하다 by python-mysqldb 1.2.1_p2  (5) 2008.06.11
Troubleshooting: apt-get update -> Dynamic MMap out of room  (0) 2008.06.05
스팸폭탄 맞았음  (0) 2008.05.23
Chunker's rolling out!  (3) 2008.03.27
Trackbacks 0 : Comments 5
  1. Favicon of http://rein.upnl.org rein 2008.06.12 00:10 Modify/Delete Reply

    DB 쿼리가 기본적으로 트랜잭션인건 MySQL빼고는 다 그런...듯한 것 같아요;

    일종의 dry-run이 되어주기도하고 (먼산)

    + db.auto_commit 인가를 True로 해주면 모든 쿼리가 바로바로 실행됩니다(아마)

  2. Favicon of http://deisys.net deisys 2008.06.12 09:31 Modify/Delete Reply

    rein // autocommit 쓰고 있음 ...ㅎㅎ

  3. Favicon of http://deisys.net deisys 2008.06.12 10:06 Modify/Delete Reply

    rein // 아니, autocommit 을 쓰면 졸라 느려지네? =_=/

  4. Favicon of http://www.waityet.net waityet 2008.06.14 09:40 Modify/Delete Reply

    ㅋ..저 코드라면 autocommit 하면 짱 느려지시겠지 =_=;;
    근데..확실히
    cursor나 connection을 close할때 commit을 안해주심은..
    뭔가 아리송하네...

  5. Favicon of http://deisys.net dgoon 2008.06.14 09:59 Modify/Delete Reply

    waityet // 좀 해주면 오죽 좋음!?

Write a comment