2013-11-25 2 views
2

방금 ​​hstore 확장자 에 대해 => 연산자를 읽었습니다. 이것은 내가 R에 여러 함수를 가지고 있기 때문에 나쁜 소식이다. hstore 필드를 포함하는 Postgres 테이블에 저장할 때이 연산자를 사용하는 것에 의존한다.Postgres : 폐기 된 hstore 연산자를 다루는 방법 : "=>"

데이터베이스에 쓰기 전에 data.frame 또는 data.table을 메모리 (R 세션)에 준비합니다. 다음은 편리한 함수 dbWriteTable을 사용하여 메모리에있는 전체 테이블을 데이터베이스에 씁니다. 따라서 postgres 함수 hstore (text, text)를 사용하는 것은 불편할 것입니다.

이러한 발표를 처리하기위한 좋은 전략은 무엇입니까? 나는 꽤 많은 사람들이 다른 타입의 필드들과 함께 hstore에 글을 써야하기 때문에 그들이 연산자를 제거하는 것에 상당히 놀랐다. 또한 이것은 실제로 R 특정 적이 아닙니다.

내가 R의 사람들과의 재현 예를 추가 : 그것은 내가 지금까지 몇 가지 유용한 통찰력을 가지고 있지만 ..

많은 언어에 대해 동일한 문제가 될 수있다, 어쩌면 이건 내 문제가 무엇인지 명확하게하는 데 도움이 세계의 나머지 부분에 대한 스크린 샷은 ... enter image description here 나는 이런 식으로 (기본적으로 메모리에 테이블 표현) R에 data.frame을 구축 :

mydf <- structure(list(ts_key = c("somekey", 
         "somekey"), ts_language = c("de", "en" 
        ), ts_labels = c("\"Kurztitel\" => \"Wohlbefinden\",\"mögliche_Antworten\" => \"fantastisch,so lala,total fertig\",\"Wortlaut\" => \"Wie geht es?\"", 
             "\"available_items\" => \"awesome,somewhat ok,wasted\",\"short_title\" => \"well being\",\"wording\" => \"How are you?\"" 
        )), .Names = c("ts_key", "ts_language", "ts_labels"), row.names = c(NA, 
                          -2L), class = "data.frame") 

그래서 메모리 테이블/data.frame이 같은 hstore을 포함 문자를 열의 하나로 사용합니다.

dbWriteTable(myconnection,"somePostgresTableWithTheRightStructure",mydf,append=T) 

를 그냥 쿼리 또는 명시 적 루프를 구축 할 필요없이 DB에 전체 data.frame 쓰기 : I 행 많이 가진 data.frame을 가지고 단순히 사용할 수 있기 때문에 이 매우 편리합니다. 나는 이것을 지키고 싶지만 단지 dbWriteTable에 hstore (text, text)를 어떻게 사용 하는지를 모르겠습니다.

+2

'=>'에 대한 래퍼를 작성하여 코드를 마이그레이션 할 수있을 때까지 패키지에 임시 방편으로 포함시킬 수 있습니까? –

+0

현재 모든 것이 작동합니다. 나는이 기능을 가지고있다 : https://github.com/mbannert/pgsqltsmap/blob/master/R/create_hstore.R 문자 표현을 생성하므로 데이터를 가질 수있다.프레임은 (다른 것들 중에서) hstore 열을 포함합니다. 너가 말하는게 이거니? 나는 단지 dbWriteTable을 사용하지 않고 단일 INSERT를 많이 만들지 않고 싶지 않다. –

+0

필자는 기본적으로 패키지에'=>'함수를 가져 오는 것을 의미했지만, @ Denis의 설명에 따르면 SQL에 문제가있는 것처럼 보입니다. –

답변

2

실제로 hstore에만 해당되는 것은 아니며 다른 사용자 지정 연산자에도 영향을줍니다. 그 removal in 9.2에 대한 추론은 the SQL standard now reserves that token입니다.

이러한 발표를 처리하는 좋은 전략은 무엇입니까?

json으로 전환하는 것을 고려하십시오. 유사한 -> 연산자와 유사한 함수 세트를 가지고 있습니다. 객체에서 json으로 돌아갈 수있는 R 라이브러리가 있다고 상상해보십시오. 데이터베이스 수준에서 변경 내용은 cast from hstore to json과 관련됩니다 (json 문서의 마지막 페이지 참조).

+0

+1 나를 이해하고 제거가 곧 사라질 지 여부를 판단 할 수 있도록 도와주세요. 사실 R은 json과 back에서 꽤 잘 작동합니다. 아직도 얻지 못하는 것은 : 대량 가져 오기 기능을 사용하려면 데이터베이스에 data.table을 써야합니다 (여러 개의 INSERT 쿼리). 그래서 만약에'=>'를 사용하는 hstore의 문자 표현 대신에'json'을 포함하고 있다면, 이후에 제안한 것처럼 캐스트를 트리거 할 때 데이터베이스에 저장할 수 있습니까? –

+0

테이블에 json 열이있는 경우 json의 텍스트 표현을 직접 삽입 할 수 있습니다 (물론 잘 만들어진 경우). 날짜 또는 타임 스탬프와 매우 흡사합니다. ''str = ''와 같은 hstore 문자열을 만드는 대신에'db.query ("foo (bar) values?)", str)'와 같은 것을 실행할 때, 'a => 1''이라면'str = JSON.new (a : 1) .to_s'와 같은 json 객체를 만들 수 있습니다. –

+0

설명해 주셔서 감사합니다. 방금'dbWriteTable'으로 문제를 설명하기 위해 스 니펫과 스크린 샷을 추가했습니다. 어쩌면 실제로 JSON 문자열을 작성하고, pg에 저장 한 다음 변환을 트리거하는 것이 해결책 일 수 있습니다. –

3

운영자 만 제거되며 기본 기능은 제거되지 않습니다. 그래서 그 대신

a => b 

쓰기

hstore(a, b) 

의이 완벽하게 호환됩니다. 이제 코드를 변경하고 완료하십시오.

+0

이것은 단지 문제 일뿐입니다. 나는 dbWriteTable을 사용함으로써 많은 이점을 가지므로 명시 적으로 INSERT 문을 실행하고 싶지 않습니다. 가능한 경우 메모리에 문자열을 준비해야합니다. –

+0

그리고 그 일을 막으려는 것이 무엇입니까? –