2017-03-18 4 views
0

PostgreSQL을 처음 사용했습니다. Psycopg2와 PostgreSQL 9.5.6을 함께 사용하고 있습니다. 내 업데이트 SQL은 지금이 모양입니다. Psycopg2를 사용하여 튜플의 파이썬 목록으로 여러 열을 업데이트하려고합니다.Psygopg2 파이썬 튜플 목록으로 복수 열 바꾸기

update_sql = ''' 
      UPDATE my_table 
      SET size = n, mean = m, std_pop = std 
      FROM unnest(%s) s(my_id integer, n integer, m double precision, std double precision) 
      WHERE my_table.id = s.my_id; 
     ''' 

예를 들어, 나는 파이썬 튜플 (ID, new_size, new_mean, new_std)의 다음과 같은 파이썬 목록을 가지고 : 나는 테이블에 넣고 3 열을 업데이트 할

new_column_values =[(0,10,9.0,8.0),(1,10,9.0,8.0),(2,10,9.0,8.0)] 

동시에 :

+----+------+------+---------+ 
| id | size | mean | std_pop | 
+----+------+------+---------+ 
| 0 | 0 | 0 |  0 | 
| 1 | 0 | 0 |  0 | 
| 2 | 0 | 0 |  0 | 
+----+------+------+---------+ 

여러 열을 업데이트하는 것이 가장 좋은 방법일까요? 지금은 오류를 반환합니다 :

psycopg2.ProgrammingError: function return row and query-specified return row do not match 
DETAIL: Returned type numeric at ordinal position 3, but query expects double precision. 

이중 정밀도를 기대하지만 숫자 유형은 나와 있습니다. 해결 방법을 모르겠습니다. 내 이고 입니다. std_pop 열은 배정도 열입니다. 무슨 일 이니?

+0

관련 Python 코드를 게시하십시오. –

+0

@ClodoaldoNeto 파이썬 코드는 많은 의존성을 가지고 있지만, 실제로 그것을 해결하는 방법을 찾는다. 나는 'double precision'을 'numeric'으로 바꾼다. 그러나 나는 그 컬럼을 'double precision'이라고 선언했기 때문에 반 직관적이다. – Dobob

답변

0

나는이 문제를 해결했다.

난 그냥 숫자 내 업데이트 쿼리에 배정 밀도을 변경하고 그 문제를 해결했다. 그러나 숫자double precision으로 열을 선언했을 때을 사용해야하는 이유는 이해가 가지 않습니다.

update_sql = ''' 
     UPDATE my_table 
     SET size = n, mean = m, std_pop = std 
     FROM unnest(%s) s(my_id integer, n integer, m numeric, std numeric) 
     WHERE my_table.id = s.my_id; 
    ''' 

어쩌면 누군가는 숫자하지 배정 밀도 수 있습니다 이유를 설명 할 수 있습니까?