我正在尝试使用psycopg2和一些数据在Python语言中编写一个insert语句。这个查询在postgresql控制台上运行得很好,但是当我在psycopg2中尝试它的时候,我得到了一个错误。
这是我想要插入的表
create_test_table = """CREATE TABLE persons(
name VARCHAR,
age INT,
dob DATE,
sex VARCHAR);"""
下面是我想要插入的数据
d_ = {"name":"Gino", "age": "", "dob": "na", "sex": "M"}
下面是我的问题:
cur.execute("""INSERT INTO persons (age,dob,sex,name)
VALUES (CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END,
CASE WHEN cast(%(dob)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(dob)s END,
CASE WHEN cast(%(sex)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(sex)s END,
CASE WHEN cast(%(name)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(name)s END)""", d_)
错误消息:
----> 5 CASE WHEN cast(%(name)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(name)s END)""", d_)
ProgrammingError: column "age" is of type integer but expression is of type text
LINE 2: VALUES (CASE WHEN cast('' as text) IN ('', '#...
^
HINT: You will need to rewrite or cast the expression.
也许在psycopg2中不可能做到这一点。如有任何帮助,我们将不胜感激:)
发布于 2019-05-23 06:02:48
错误是由于CASE
表达式(即您试图插入的值)是文本的结果,而age
列是整数。
要直接解决这个错误,可以简单地将表达式转换为INTEGER
CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END::INTEGER
或
CAST(CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE %(age)s END AS INTEGER)
但是,除非当该字段不是整数,并且不是您特别排除的('', '#', '-', '--', '??')
值之一时,您实际上想要一个无效的强制转换异常,否则您可能希望将此特定语句重写为:
CASE WHEN age::TEXT ~ '^[\d]+$' THEN age ELSE NULL END::INTEGER
因此,在尝试转换它之前,请检查它是否确实是一个数字,如果它不是一个数字,则将其设为空。但无论哪种方式,您只需转换结果即可。注您可能需要对dob
列执行相同的操作。
发布于 2019-05-22 23:44:14
您的参数替换不正确。例如,而不是这样:
%(CASE WHEN cast(age as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE age END)s
你应该有:
(CASE WHEN cast(%(age)s as text) IN ('', '#', '-', '--', '??') THEN NULL ELSE age END)
https://stackoverflow.com/questions/56260366
复制相似问题