2011-02-24 3 views
1

나는이 사이트를 인터넷 검색하고 검색했지만 구체적인 것은 나타나지 않으며이 기능을 사용할 수 없다. 여기 코드는 다음과 같습니다MySQLdb에 바이너리 데이터 저장하기 - 파이썬

binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll)) 

    sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment) \ 
    VALUES ('%s','%s','%s','%s','%s','%s') ON DUPLICATE KEY UPDATE filename='%s',fileextension='%s'""", attach.attno,\ 
attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension 

    try: 
     cursor.execute(MySQLdb.escape_string(sql_stmt)) 
     conn.commit() 

attach.attcoll는 클라이언트 측에서 SQLite는 BLOB 및 자바 코드에서 JSON을 통해 들어오는 데이터입니다. 그럼 MySQLdb와 MySQL에 binData를 쓰고 싶지만 계속 TypeError와 500의 리턴 코드를 얻고 싶습니다. 이것을 고치는 방법에 대한 아이디어. binlob을 MySQL blob에 저장하려고합니다. 여기 가지의

답변

1

무리 :

binData = ''.join(map(lambda x: chr(x % 256), attach.attcoll)) 
sql_stmt = """INSERT INTO attachments (attno,filename,fileextension,projNo,procNo,wpattachment) 
VALUES (%s,%s,%s,%s,%s,%s) ON DUPLICATE KEY UPDATE filename=%s,fileextension=%s""" 

params = (attach.attno,attach.filename,attach.fileextension,attach.projNo,attach.procNo,binData,attach.filename,attach.fileextension) 

cursor.execute(sql_stmt, params) 
conn.commit() 

요약 :

  1. 당신은이 작업을 수행하는 방법을 모르는 경우 (먼저 DB에 연결되어 있는지 확인의 MySQLdb 설명서를 읽어)
  2. 전체 쿼리를 이스케이프하지 않으려면 데이터 부분 만 문과 데이터를 cursor.execute()에 개별적으로 전달하면 커서가 이스케이프 처리합니다.
  3. 귀하의 '%s'을 인용하지 마십시오. MySQLdb에서도 귀하를 대신해드립니다.
  4. 데이터베이스가 트랜잭션 (예 : InnoDB)이므로 conn.commit()을 사용하는 이유는 트랜잭션 엔진을 사용하지 않는 경우 필요하지 않습니다.
  5. DB 테이블을 어떻게 구성했는지 보지 않고도 정상적으로 작동하는지 보장 할 수 없습니다. 연습으로, 정말로 간단한 데이터베이스 테이블을 생성하고 MySQLdb로 삽입하는 연습을 해본 적이 있습니까? 그렇다면 API를 익히십시오.
+0

1. 연결 ... 2. 흥미로운 ... 3. 작은 따옴표가 없으면 실행되지 않습니다. 다시 시도 할 것입니다. 4. 그 이상으로 ... 질문은 '최적의 BLOB/이진 데이터 저장 방법'에 매우 구체적입니다. 스크립트에서 binData를 제거하면 연결되어 있습니다. 모두 작은 따옴표를 사용해도 올바르게 작동합니다. 다른 모든 요인들이 설명되기 때문에 혼자만의 질문입니다. 도움을 주시면 감사하겠습니다. – kirtcathey

+0

확인 중입니다. 당신의 질문에 많은 잘못된 것이있어서 MySQLdb에 익숙하고 내가 생각할 수있는 모든 기반을 다룰 수 있기를 바랬다 –

+0

나는 당신이 당신의 전체 쿼리를 탈출 할 때 어떻게 작동하는지 이해하지 못한다. 코드 sql_stmt는 문자열이 아니며, 튜플이며, MySQLdb.escape_string()은 튜플이 주어지면 예외를 발생시킵니다. –

관련 문제