python - 使用 psycopg2 复制到带有 ARRAY INT 列的表
问题描述
我创建了一个结构类似于以下的表:
create table some_table (
id serial,
numbers int []
);
我想以一种有效的方式复制熊猫数据框,所以我不想使用慢速to_sql
方法,所以,按照https://stackoverflow.com/a/41876462/754176和https://stackoverflow.com/a /29125940/754176我尝试了以下方法:
import pandas as pd
import psycopg2
# Create the connection, and the cursor (ommited)
# Function from the second link
def lst2pgarr(alist):
return '{' + ','.join(alist) + '}'
df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
import io
f = io.StringIO()
df.to_csv(f, index=False, header=False, sep="|")
f.seek(0)
cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
cursor.close()
此代码不会引发错误,但不会向表中写入任何内容。
所以,我将代码修改为
import csv
df = pd.DataFrame({'numbers': [[1,2,3], [4,5,6], [7,8,9]]})
df['numbers'] = df.numbers.apply(lambda x: lst2pgarr([str(y) for y in x]))
f = io.StringIO()
df.to_csv(f, index=False, header=False, sep="|", quoting=csv.QUOTE_ALL, quotechar="'"))
f.seek(0)
cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
cursor.close()
此代码引发以下错误:
---------------------------------------------------------------------------
DataError Traceback (most recent call last)
<ipython-input-40-3c58c4a64abc> in <module>
----> 1 cursor.copy_from(f, 'some_table', columns=["numbers"], sep='|')
DataError: malformed array literal: "'{1,2,3}'"
DETAIL: Array value must start with "{" or dimension information.
CONTEXT: COPY some_table, line 1, column numbers: "'{1,2,3}'"
我该怎么办 ?
另外,知道为什么第一个代码没有抛出错误会很有趣。
解决方案
此代码不会引发错误,但不会向表中写入任何内容。
如果您提交事务,该代码运行良好:
cursor.close()
connection.commit()
推荐阅读
- python - 使用 Python 的图同态
- jquery - 使用 jQuery 将鼠标悬停在 div 上时如何在所有内容上创建 div
- javascript - 在浏览器上播放警报声音不会立即发生
- python - 仅给定范围的索引时索引数组列的范围
- rust - Rust:如何固定 rust 编译器工具链版本?
- python - 如何使用 Python 将日期和列表写入文本文件?
- flutter - 如何在颤动中检测屏幕上列表项的索引
- electron - 在所有屏幕上全屏显示窗口
- python - float('25') 有效,但 int('25.2') 无效。为什么?
- javascript - 在处理程序中应用 React useState 后如何获取新更改的值?