我正在编写 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/