如何解决AWS Lambda中StringIO对象无getValue属性的报错问题
故障修复方案
你遇到的报错由两个底层问题导致,修改后即可正常运行:
- COPY命令方向配置错误:你要将查询结果从PostgreSQL导出到本地内存,需要使用
TO STDOUT参数,你当前写的TO STDIN是用于向PostgreSQL写入数据的方向,无法输出查询结果 - StringIO方法调用错误:Python 3标准库的
io.StringIO类没有getValue()方法,正确的获取缓冲区内容的方法是全小写的getvalue()
修正后的完整代码如下:
import psycopg2 from io import StringIO import boto3 bucket = 'my_s3_bucket' filename = 'test_data' s3_resource = boto3.resource('s3') conn = psycopg2.connect( host='localhost', port='5432', dbname='billing_test', user='postgres', password='password!' ) cur = conn.cursor() sql_query = "SELECT * from public.customers limit 1" # 修正COPY命令方向为STDOUT query = '''COPY ({}) TO STDOUT csv header'''.format(sql_query) file = StringIO() cur.copy_expert(query, file) # 修正方法名为全小写的getvalue() s3_resource.Object(bucket, f'{filename}.csv').put(Body=file.getvalue()) cur.close() conn.close()
补充说明:如果你的查询结果数据量较大,也可以在调用cur.copy_expert后执行file.seek(0),直接将文件对象传入put方法的Body参数,避免一次性加载全部内容到内存。
内容的提问来源于stack exchange,提问作者cocktail Enthusiast
相关产品推荐
相关产品推荐

