当使用带参数元组的执行语句从值列表中批量更新数据时,值列表中的空值将被视为数据类型 varchar,因此在插入非 varchar 列(例如 double )时会导致问题。一个例子是:
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.
如何指定值列表中空值的数据类型?
最佳答案
说明非常清楚。您需要转换该值:
. . .
set myvalue = (v.myvalue::double precision)
问题是 null
是无类型的,但列必须有类型。 Postgres 选择最通用的类型,您需要显式转换回数字。
关于从具有空值的值列表更新时 postgresql 数据类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41210663/