python - 如何避免在 Postgresql 的 INSERT 期间显式转换 NULL

标签 python postgresql psycopg2

我正在编写 python 脚本以将表从 MSSQL 数据库同步到 Postgresql 数据库。原作者倾向于使用超宽表,有很多区域连续NULL他们身上有洞。

为了插入速度,我在execute()之前将记录批量序列化为如下形式的字符串

INSERT INTO A( {col_list} ) 
SELECT * FROM ( VALUES (row_1), (row_2),...) B( {col_list} )

行序列化时,无法确定NULL的数据类型或 None在 python 。这使工作变得复杂。全部NULL timestamp 中的值列,integer列等需要将显式类型转换为正确的类型,否则 Pg 会提示它。

目前我正在检查数据库 API connection.description属性并比较列 type_code,为每一列添加类型转换,如 ::timestamp根据需要。

但这感觉很麻烦,需要额外的工作:驱动程序已经将数据从文本转换为正确的 Python 数据类型,现在我必须为包含那么多 None 的列重做它

有没有更好的方法来优雅和简单地解决这个问题?

最佳答案

如果您不需要SELECT,请使用@Nick's answer .
如果您需要它(例如使用 CTE 多次使用输入行),可以根据您的用例的详细信息找到解决方法。

例如,在处理完整行时:

INSERT INTO A -- complete rows
SELECT * FROM (
   VALUES <b>((NULL::A).*)</b>, (row_1), (row_2), ...
   ) B
<b>OFFSET 1</b>;

{col_list} 在这种特殊情况下是可选的噪声,因为无论如何我们都需要提供完整的行。

详细解释:

关于python - 如何避免在 Postgresql 的 INSERT 期间显式转换 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49027003/

相关文章:

python - 非法指令 : 4 when running Django

python - 从工作进程访问数据库

python - 访问和替换 json 中的子类别对象

python - 获取用户的输入,然后使用子流程启动流程

sql - 通过分组为 View 生成 id 行

linux - 使用 psycopg2 时重新声明游标会创建新连接吗?

javascript - 如何将 Javascript new Date().toUTCString() 转换为 Python

python - 对 Pandas 数据框应用/矢量化/加速按列清理功能

sql - 事件记录 : Find collection based on sum of two associated tables

c# - 在 JSON 中不支持 bigint