2013-03-06 2 views
0

Postgres NOTIFY은 문자열 리터럴 (이진 데이터 없음) 만 지원합니다. 나는 다음과 같은 방법으로 절인 객체와 함께 사용하기 위해 관리했습니다 :피클 링 된 객체를 Postgres 문자열로 안전하게 인코딩 할 수 있습니까 (NOTIFY와 함께 전송됩니까?).

message = cPickle.dumps(objectFoo) 
cursor = connection.cursor() # this is psycopg2 connection 
cursor.execute("NOTIFY channelFoo, %s", [message]) 

그러나, 나는 몇 가지 까다로운 바이트 (예 : '\ X80'문자열) 인코딩 된 객체에 넣어 경우. execute()에서 오류가 반환되었습니다.

psycopg2.DataError: invalid byte sequence for encoding "UTF8": 0x80

이 방법이 있습니까? 객체가 어떤 데이터를 가지고 있더라도 pickled 객체를 Postgres 문자열로 신뢰성있게 직렬화 할 수있는 방법은 무엇입니까?

답변

3

파이썬 피클은 바이너리 시퀀스입니다. 피클을 문자열에 넣어야한다면 인코딩하십시오. 일반적인 기술에는 base64 또는 uuencode 사용이 포함됩니다. 그런 다음 수신 측에서 디코딩하십시오.

+0

그래, 16 진수로 인코딩하거나 base64합니다. 크기는 늘어나지 만 상대방에서 쉽고 안정적으로 디코딩됩니다. 첫 번째로 비 Python 클라이언트를 추가하면이 디자인을 후회하게됩니다. 개인적으로 JSON 또는 기타 구조화 된 다소 휴대용 데이터를 보낼 수 있다면 직접 할 수 있습니다. –

+0

물론 주목할만한 문제 중 하나는 NOTIFY 및 LISTEN에 보안이 거의 없다는 것입니다. 이렇게하면 누구나 소프트웨어에 절인 개체를 보낼 수 있으며 누구나 스트림에서 절인 개체를 가져올 수 있습니다. 리스너 (예 : 테이블)에 대한 권한을 제어 할 수있는 어딘가에있는 것이 바람직하다고 생각합니다. –

+0

감사합니다. base64 인코딩은 좋은 해결책입니다. 필 클 문서에서 '필레 데이터 형식은 인쇄 가능한 ASCII 표현을 사용합니다'라고 오해했습니다. 추가 인코딩 없이도 작동해야합니다. –

관련 문제