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 문자열로 신뢰성있게 직렬화 할 수있는 방법은 무엇입니까?
그래, 16 진수로 인코딩하거나 base64합니다. 크기는 늘어나지 만 상대방에서 쉽고 안정적으로 디코딩됩니다. 첫 번째로 비 Python 클라이언트를 추가하면이 디자인을 후회하게됩니다. 개인적으로 JSON 또는 기타 구조화 된 다소 휴대용 데이터를 보낼 수 있다면 직접 할 수 있습니다. –
물론 주목할만한 문제 중 하나는 NOTIFY 및 LISTEN에 보안이 거의 없다는 것입니다. 이렇게하면 누구나 소프트웨어에 절인 개체를 보낼 수 있으며 누구나 스트림에서 절인 개체를 가져올 수 있습니다. 리스너 (예 : 테이블)에 대한 권한을 제어 할 수있는 어딘가에있는 것이 바람직하다고 생각합니다. –
감사합니다. base64 인코딩은 좋은 해결책입니다. 필 클 문서에서 '필레 데이터 형식은 인쇄 가능한 ASCII 표현을 사용합니다'라고 오해했습니다. 추가 인코딩 없이도 작동해야합니다. –