2011-11-16 5 views
8

나는 장고에서 Python Objects를 pickling하고 MySQL DB에 저장한다. 지금까지 내가 따랐다 이러한 간단한 규칙 :MySQL 데이터베이스에 Python Pickled 객체 저장

  1. cPickle.dumps(object) 절인 된 객체에 파이썬 개체를 변환 #됐다

  2. cPickle.loads(pickled_object) #

  3. 내 장고 Model Field 절인 개체에서 파이썬 객체를 다시로드 is Text Field

  4. MySQL 데이터베이스 필드 유형은 longblob입니다. Attrib 백인 군대가 binary

  5. MySQL의 DB 인코딩은 파이썬 객체를 다시로드하는 동안 불행하게도 나는 다음과 같은 오류를 얻고있다 utf8_unicode_ci

입니다.

Type Error: ('an integer is required', <type 'datetime.date'>, ('x07xb6x0bx06',)) 

이것이 인코딩 문제가 오류 값 x07xb6x0bx06 찾고 나에게 보인다. 나는 중요한 단계를 놓치니 ?? 어느 누구도이 문제를 해결할 수 있습니까 ??

+1

당신이 피클을 사용하는 특별한 이유가 있나요? 바이너리 형식이며 파이썬에서만 사용할 수 있습니다. 선택의 여지가있는 경우 JSON을 사용하지 않는 것이 좋을까요? –

+0

JSON은 내 용도를 서버하지 않고'json.dumps'를 사용하려고 시도하지만'some_object가 JSON 직렬화가 가능하지 않습니다. '라는 오류가 발생했습니다. 그리고 그 대상은 순수한 Pythonic입니다. –

+2

그 객체를 직렬화 할 수 있도록 노력해야합니다. 버그를 찾으려고 할 때 DB에 인간이 읽을 수있는 내용을 저장하는 것은 큰 도움이됩니다. –

답변

5

cPickle.dumps의 출력을 VARCHAR 열에 저장하려는 경우 문자 열에 바이트 문자열을 저장하려고합니다. 이 경우 픽스는 개체를 unicode(base64.encode(cPickle.dumps(myobject)))으로 인코딩 한 다음 저장하는 것입니다.

또는 :

object2varchar = lambda obj: unicode(base64.encode(cPickle.dumps(obj))) 
store(object2varchar([1, 'foo'])) 
1

하나 더 규칙이 있습니다 : 옵션 charset=utf8으로 mysql에 연결 하시겠습니까?

UPD1 : 때때로는 완전한 SQL 쿼리를보고하는 것이 좋습니다, 나는 보통 그런 식으로 수행

이 Newtover의 대답은 아마 올바른입니다
>>> conn = MySQLdb.connect(**db_params) 
>>> "INSERT INTO tbl VALUES (%s)" % conn.literal((your_pickled_item,)) 
+0

아니요. 도움이되지 않습니다. 다시 같은 오류. –

+0

@ aamir-adnan, 이미 저장된 것을 읽는 대신 새 항목을 저장하고 읽으려고 했습니까? – newtover

+0

좋은 질문입니다. 예, 코드에서 파이썬 개체를 변환하고 복원 할 때 제대로 작동합니다. 읽거나 읽는 동안 DB에 문제가 있습니다. 어떻게해야합니까? 도와주세요. –

관련 문제