从具有空值的值列表更新时 postgresql 数据类型错误

标签 postgresql list null psycopg2

当使用带参数元组的执行语句从值列表中批量更新数据时,值列表中的空值将被视为数据类型 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/

相关文章:

python - 用另一个列表遍历字典列表,并找到关联的键值

sql - 在 sql join 中合并部分重复的行

postgresql - 如何使用变量作为 node-pg 中的表名?

r - 如何创建具有变量名称的未知深度列表?

c - 为什么在 C 的 if-else 条件中传递 (!NULL) 为真?

android - 在有 Intent 的 Activity 之间传递 int[] 数组时为空

sql-server - 案例 null SQL Server 2008

postgresql 多个子查询

postgresql - 将 PostgreSQL 9.0 注册并运行为 Windows 服务

c# - 在类中存储不同泛型类型的列表