2011-12-17 2 views
4

포스트그레스 DB에 JSON과 유사한 객체를 저장해야합니다. 원래 직렬화 된 필드를 사용하고 있었지만, 너무 많은 공간을 사용하는 것은 입니다. 그래서 간단한 사용자 지정 압축 체계를 작성했으며 이제 데이터에 액세스하기 위해 Marshal.dump/load를 사용하고 있습니다. 하지만 postgres의 bytea 필드 유형에 걸렸습니다. 모든 보이지 않는 바이트는 3 자리 8 진수로 인코딩되어야합니다. '\ 377'.Ruby on Rails를 사용하여 포스트그레스에 바이너리 객체 저장하기

http://www.postgresql.org/docs/8.1/static/datatype-binary.html

나는 이것을 달성하는 쉬운 방법을 볼 수 없습니다. s.pack ("m # s.size") 은 '\'가 하나 인 문자열을 생성하는 것으로 보이지만 postgres는 '\'를 원합니다. 끝 부분에 gsub (/ \ /, '\\\\')를 추가해도 문제가 해결되지 않는 것 같습니다.

누구보다 우아하고 (작동하는) 솔루션이 있습니까?

답변

10

아마도 ActiveRecord가 이진 열의 인코딩 및 디코딩을 자체적으로 처리하므로이 bytea 값을 조작하기 위해 원시 SQL을 사용하고있을 것입니다. 절대로 SQL에서 사용할 데이터를 인용하지 마십시오. 항상 드라이버의 인용 및 이스케이프 메소드를 사용하십시오. 이 경우 escape_bytea를 사용해야합니다 : 데이터베이스의 탈출 bytea 값의 출력을 얻을 경우

encoded = ActiveRecord::Base.connection.escape_bytea(raw_bytes) 

마찬가지로, 당신이 bytea를 디코딩 unescape_bytea을 사용하십시오.

+0

그 트릭을했습니다. 고맙습니다! –

관련 문제