Python 如何使用AWS Lambda从mysql数据库返回大量列?

Python 如何使用AWS Lambda从mysql数据库返回大量列?,python,mysql,amazon-web-services,aws-lambda,pymysql,Python,Mysql,Amazon Web Services,Aws Lambda,Pymysql,简单的背景:我有一个连接到AWS RDS的无服务器mysql数据库,它由70列和7000多行组成。此RDS中定义的许多列的数据类型为VARCHAR(2000),BIGINT 我试图使用AWS Lambda api返回此数据库中的所有详细信息,下面是我用于实现相同目的的处理函数的代码片段: def handler(event, context): try: #Storing data to be returned dataReturn=[]

简单的背景:我有一个连接到AWS RDS的无服务器mysql数据库,它由70列和7000多行组成。此RDS中定义的许多列的数据类型为
VARCHAR(2000),BIGINT

我试图使用AWS Lambda api返回此数据库中的所有详细信息,下面是我用于实现相同目的的处理函数的代码片段:

def handler(event, context):
    try:

        #Storing data to be returned
        dataReturn=[]



        #Insert Data into Database
        with conn.cursor() as cur:
            cur.execute("SELECT <names of all 70 columns> FROM <table_name>" ) 
            row_headers=[x[0] for x in cur.description] #this will extract row headers
            rv = cur.fetchall()
            json_data=[]
            for result in rv:
                json_data.append(dict(zip(row_headers,result)))
            #print(json.dumps(json_data))
            conn.commit()



        return {
            'statusCode': 200,
            'headers': {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": 'GET, POST, PUT, DELETE, OPTIONS'
            },
            'body': json.dumps(json_data, cls=DecimalEncoder)
        }
    except Exception: 
        print(traceback.format_exc())
        return {
            'statusCode': 502,
            'headers': {
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": 'GET, POST, PUT, DELETE, OPTIONS'
            },
            'body': json.dumps("Server Error Occured", cls=DecimalEncoder)
        }
作为旁注,我可以使用以下命令从该表返回24列:
中选择,但如果尝试显示超过24列,则失败

这是否与AWS Lambda可以从RDS读取/返回的内存量有关? 请对此问题提出适当的解决方案


谢谢

我怀疑问题不在于列数,而是在24列之后,您的第25列是十进制类型-至少,这是错误消息实际报告的内容

您的返回函数指定了一个编码器,但您的print语句没有指定-它在上面的代码中被注释掉,但您显示的错误消息没有编码器:

Traceback (most recent call last):
  File "/var/task/getInstrumentsDetails.py", line 55, in handler
    print(json.dumps(json_data))

我看不出上面对您的十进制编码的定义,但您应该能够使用以下简单的方法:

class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        elif isinstance(obj, bytes):
            if len(obj) == 1:
                return ord(obj)
            else:
                return obj.decode()
        return json.JSONEncoder.default(self, obj)
请注意,如果要打印json.dumps的结果,还需要将自定义编码器传递到那里:
print(json.dumps(json_数据),cls=DecimalEncoder)

关于内存问题:Lambda可以使用128MB到3008MB,增量为64mb;拥有7000+行和许多
varchar
列会导致大量内存被使用;首先在查询中使用
LIMIT
子句来确保代码正确,然后尝试对整个数据运行它

注意:您有一个未使用的
dataReturn
变量,还有一个
conn.commit()
语句,在读取(SELECTing)数据时不需要该语句

更新:根据新数据,您的问题似乎是
字节
数据不是
十进制
类型错误:字节类型的对象不是JSON可序列化的


例如,
列是\u Record\u Day\u Wrkng
是一个值为
\x00
的字节;如果这些字节值实际上应该是数字,您可以使用
ord
在JSON中对它们进行编码,但如果不是,您应该使用类似
字节的内容。解码
-请参阅上面更新的编码。

Lambda函数默认情况下会传输的数据量有上限,但您可以在aws控制台的API网关中更改它

感谢您的输入,但我的第9列也是十进制的,它可以显示出来。而且,即使我取消对print语句的注释,它也会显示相同的错误谢谢!我尝试增加lambda的内存,也尝试使用LIMIT 1显示1行,但它仍然给出相同的错误。此外,我定义了完全相同的十进制编码器,该编码器正在我的返回体中使用。尝试打印
json\u data
而不打印
json.dumps
,这样我们就可以看到它包含哪些类型;第一行应该足够了。它显示了所有70个键值对,包括以下内容:
Traceback(最近一次调用):File”/var/task/.py,第106行,在处理程序“body”中:json.dumps(json_data,cls=DecimalEncoder)
没有任何异常抛出的指示;使用pastebin之类的工具粘贴完整的输出。
class DecimalEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, decimal.Decimal):
            return float(obj)
        elif isinstance(obj, bytes):
            if len(obj) == 1:
                return ord(obj)
            else:
                return obj.decode()
        return json.JSONEncoder.default(self, obj)