社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Caritas • 3 年前 • 1587 次点击  

我在理解正确的语法方面有点困难 psycopg3 Python中的库。我想复制一本书的内容。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.')

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

另外,我有没有办法通过考试 mock_idea_info 直接进入 复制 陈述

我们将不胜感激。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/133495
 
1587 次点击  
文章 [ 3 ]  |  最新文章 3 年前
rd_nielsen
Reply   •   1 楼
rd_nielsen    3 年前

你可能应该包括 with (format csv) 第条(见 https://www.postgresql.org/docs/current/sql-copy.html )或者显式指定引号和分隔符字符。

Thomas Kutsch
Reply   •   2 楼
Thomas Kutsch    3 年前

我看不到您在输入数据后承诺将数据持久化到数据库中。尝试添加以下内容:

conn.commit()
Adrian Klaver
Reply   •   3 楼
Adrian Klaver    3 年前

看见 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

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