我对云和数据工程都是新手。
我有一个很大的csv文件存储在GCS bucket中。我想写一个python脚本,使用COPY语句将数据批量插入到我本地机器上的postgresql数据库中。但我无法弄清楚身份验证。
我想这样做:
import psycopg2
conn = psycopg2.connect(database=database,
user=user,
password=password,
host=host,
port=port)
cursor = conn.cursor()
file = 'https://storage.cloud.google.com/<my_project>/<my_file.csv>'
sql_query = f"COPY <MY_TABLE> FROM {file} WITH CSV"
cursor.execute(sql_query)
conn.commit()
conn.close()
我收到此错误消息:
psycopg2.errors.UndefinedFile:无法打开文件"www.example.com/"进行读取: https://storage.cloud.google.com/<my_project>COPY FROM指示PostgreSQL服务器进程读取文件。您可能需要一个客户端工具,如psql的\copy。<my_file.csv>" for reading: No such file or directory HINT: COPY FROM instructs the PostgreSQL server process to read a file. You may want a client-side facility such as psql's \copy.
当我在psql中运行查询时也会发生同样的情况。
我假设问题出在身份验证上。我已经用Google Cloud CLI设置了Application Default Credentials,当我作为经过身份验证的用户时,我可以很容易地使用wget下载文件。当我切换到postgres用户时,我得到"拒绝访问"错误。
ADC似乎只能与客户端库和命令行工具一起工作。
我使用Ubuntu 22.04.1 LTS。
谢谢你的帮助。
1条答案
按热度按时间y4ekin9u1#
这对你来说是行不通的。文件需要在服务器进程允许的位置,并且不能通过http获取(这是一个它期望的本地文件路径)。
You can supply a program/script,它将为您获取文件并将其打印到服务器可以使用的STDOUT。
或者-按照错误消息的建议做,用psycopg的复制支持在本地处理它。