在 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
语句中吗?
如有任何帮助,我们将不胜感激。
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)或明确指定引号和分隔符。
我在理解 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
语句中吗?
如有任何帮助,我们将不胜感激。
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)或明确指定引号和分隔符。