gpt4 book ai didi

python - 执行值您将需要重写或转换表达式

转载 作者:行者123 更新时间:2023-11-29 14:31:48 27 4
gpt4 key购买 nike

我正在尝试对具有模式的表执行批量插入

CREATE TABLE IF NOT EXISTS test (symbol VARCHAR(16), ts timestamp)

我有一个要插入的值数组

[('AAPL',1528004700), ('AAPL', 1528005600)]

我的插入查询如下所示

insert into test VALUES %s

我执行插入的 python 代码看起来像

psycopg2.extras.execute_values(cursor, insert_stmt, [('AAPL',1528004700), ('AAPL', 1528005600)])

我遇到了一个错误

ProgrammingError: column "ts" is of type timestamp without time zone but expression is of type integer
LINE 1: insert into test VALUES ('AAPL',1528004700),('AAPL',15280056...
^
HINT: You will need to rewrite or cast the expression.

我知道 to_timestamp 可以在插入时解决这个问题,但是 execute_values 不允许我添加多个占位符,我需要每次都执行批量插入。时间戳应该没有时区。我该如何解决这个错误

谢谢!

更新 1

execute_batch() 完美运行,因为我可以在占位符部分添加 to_timestamp

insert = "insert into test VALUES (%s, to_timestamp(%s))"

其次是

psycopg2.extras.execute_batch(cur, insert, [('AAPL',1528004700), ('AAPL', 1528005600)])

但是我想使用 execute_values,因为它比 execute_batch() 稍快

最佳答案

这应该有效:

from datetime import datetime
psycopg2.extras.execute_values(cursor, insert_stmt, [('AAPL',datetime.fromtimestamp(1528004700)), ('AAPL', datetime.fromtimestamp(1528005600))])

编辑:通常,Postgres 无法猜测您的 1528004700 是时间戳,您需要以某种方式显式声明它。您使用 to_timestamp 的解决方案将“这是一个时间戳”放在 Postgres 端,上面的代码将它放在 python 端。从信息的角度来看它们是等价的,我没有检查哪个效率更高。

关于python - 执行值您将需要重写或转换表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50665565/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com