2016-12-18 10 views
1

パラメータリストを含むexecute文を使用して値リストからデータを一括更新すると、値リストのnull値がデータ型varcharとみなされ、非varchar列、たとえば倍精度です。例は次のようになります。このクエリからnull値の値リストから更新するときのpostgresqlデータ型エラー

create table mytable (mykey varchar, myvalue double precision); 
cur.execute("""update mytable t set (myvalue)=(v.myvalue) from (values %s, %s) v (mykey, myvalue) where t.mykey = v.mykey""", ([('key1', None),('key2', None)])) 

エラーは次のとおりです。

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
psycopg2.ProgrammingError: column "myvalue" is of type double precision but expression is of type text 
LINE 1: update mytable t set (myvalue)=(v.myvalue) from (values ('ke... 
            ^
HINT: You will need to rewrite or cast the expression. 

どのように私は、値リストでNULL値のデータ型を指定することができますか?

+0

無関係が、 –

答えて

1

説明は非常に明確です。あなたは値をキャストする必要があります。

問題はnullが型なしであるということですが、列の型を持っている必要があります。 Postgresは最も一般的な型を選択し、明示的に数値に変換する必要があります。

+0

私は値リストのキャストを考えていましたが、これは値リストとクエリパラメータタプルでは不可能です。更新式のキャストは可能です。 – user1578065

1

あなたは@Gordonの答えのようにset句でそれをキャストするか、それを最初の値のタプルのデータ型のヒントを与える次のいずれか: `括弧`(myvalue)の間の列を置く:

query = ''' 
    update mytable t 
    set myvalue = v.myvalue 
    from (values ('impossible key', 1.0), %s, %s) v (mykey, myvalue) 
    where t.mykey = v.mykey 
''' 
data = [('key1', None),('key2', None)] 

cursor.execute(query, data) 
関連する問題