在 Python 中使用 Psycopg3 将 CSV 复制到 PostgreSQL 数据库

Copying CSV to PostgreSQL database using Psycopg3 in Python

我在理解 Python 中 psycopg3 库的适当语法时遇到一点困难。我正在尝试将 .csv 文件的内容复制到我的数据库中。 The PostgreSQL documentation表示copy应该这样写:

COPY table_name [ ( column_name [, ...] ) ]
    FROM { 'filename' | PROGRAM 'command' | STDIN }
    [ [ WITH ] ( option [, ...] ) ]
    [ WHERE condition ]

所以我写了我的python语句如下:

import psycopg


with psycopg.connect('dbname=ideatest user=postgres password=password') as conn: 
        with conn.cursor() as cur:
            mock_idea_info = open(r'C:\dir\filename.csv')
            cur.copy('public.ideastorage FROM C:\dir\filename.csv;')

print('Copy successful.')

问题是脚本打印 'Copy successful,' 但没有将数据插入数据库。不会生成任何错误消息。我在文件路径中复制了 \ 字符,所以这不是问题所在。我一直在四处寻找解决方案和可能的故障排除方法,但还没有找到任何我理解的似乎相关的东西。

此外,有什么方法可以将 mock_idea_info 直接传递到 copy 语句中吗?

如有任何帮助,我们将不胜感激。

Copy from:

cat data.out 
1       2
2       1

\d csv_test 
              Table "public.csv_test"
 Column |  Type   | Collation | Nullable | Default 
--------+---------+-----------+----------+---------
 col1   | integer |           |          | 
 col2   | integer |           |          | 


with open("data.out", "r") as f:
     with cur.copy("COPY csv_test FROM STDIN") as copy:
         while data := f.read(100):
            copy.write(data)
con.commit()

select * from csv_test ;
 col1 | col2 
------+------
    1 |    2
    2 |    1

--Add format options
cat data.out 
1,2
2,1
with open("data.out", "r") as f:
     with cur.copy("COPY csv_test FROM STDIN WITH (FORMAT CSV)" ) as copy:
         while data := f.read(100):
            copy.write(data)
con.commit()

select * from csv_test ;
 col1 | col2 
------+------
    1 |    2
    2 |    1
    1 |    2
    2 |    1

以上改编自 link 中的示例。此 while data := f.read(100) 使用海象 (:=) 仅在 Python 3.8+

中可用

我没有看到您在输入后承诺将数据保存在数据库中。尝试添加:

conn.commit()

您可能应该包括 with (format csv) 子句(参见 https://www.postgresql.org/docs/current/sql-copy.html)或明确指定引号和分隔符。