【问题标题】:Trouble uploading csv file to Postgres from S3 using COPY command使用 COPY 命令将 csv 文件从 S3 上传到 Postgres 时遇到问题
【发布时间】:2019-12-25 01:02:47
【问题描述】:

我在 lambda 中使用 python 脚本将 CSV 文件从 S3 上传到位于 Postgres RDS 中的 SQL 表。

我正在尝试将数据从 csv 文件上传到这样的表中 -

sqlstr = "COPY mrr.{0} (\"{1}\") FROM STDIN DELIMITER ',' CSV HEADER".format(table_name, columns)  #copy from csv file to table
ss3 = boto3.client('s3')
obj = ss3.get_object(Bucket=bucket_name, Key=namefile) #namefile is the csv file name
contenttotable = obj['Body'].read().decode('utf-8')
cur.copy_expert(sqlstr, contenttotable)

观察日志说 - TypeError: file must be a readable file-like object for COPY FROM; a writable file-like object for COPY TO.

如何使脚本像 s3 中的 file-like 对象一样读取它? (最好没有外部模块,因为它在 AWS lambda 中)。

【问题讨论】:

  • 我认为问题在于您实际上不能将文件放到您的 lambda 实例中,并且 COPY FROM 采用文件名,而不是实际文件或文件本身的内容。您的 contenttotable 定义是文件内容,与 COPY FROM 期望的不匹配。也许您可以尝试只使用本地机器上的psql 而不是 lambda 实例?这是一个选择吗?
  • 我想使用 Lambda,因为它是全自动化的,我不需要任何本地机器。从新文件的 s3 触发器到在 s3 上创建 csv 文件的所有过程都有效。这是我需要完成的最后一部分。
  • 我试图了解使用 with open 和按原样读取内容之间的区别(因为在本地机器中使用 with open 命令它正在工作。

标签: postgresql amazon-web-services aws-lambda rds


【解决方案1】:

当您调用 .read() 时,您会将整个“文件”读入内存,读入一个字符串。所以 contenttotable 不是类文件对象。

您可以使用 StringIO 将其转换回类似文件的对象,但最好避免一开始就将整个内容读入内存。

【讨论】:

  • 那么您建议如何提高效率?
  • (考虑到文件不是很大,我不太想把整个东西放在内存中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多