使用 rds-data 增加来自 execute_sql 的 aws lambda 结果计数的 1000 限制或使用不同的包?

Posted

技术标签:

【中文标题】使用 rds-data 增加来自 execute_sql 的 aws lambda 结果计数的 1000 限制或使用不同的包?【英文标题】:Increase the 1000 limit for aws lambda results count from execute_sql using rds-data or use a different package? 【发布时间】:2020-10-02 13:01:36 【问题描述】:

我一直在使用带有 python lambda 函数的 AWS aurora 来为我们的应用程序执行查询。 lambda 函数效果很好,但只返回前 1000 个结果而不是全部。我尝试使用分页器将限制增加到 5000,但找不到合适的解决方案:

import boto3
def lambda_handler(event, context):

   client = boto3.client('rds-data')
   readParam = event['query'] # readParam = 'select * from table;'
   database1 = event['database'] # Database name

   response = client.execute_sql(
      awsSecretStoreArn='arn:aws:secretsmanager:us-east-1:xxxxx:secret:abc/read-XXXX',
      database=database1,
      dbClusterOrInstanceArn='arn:aws:rds:us-east-1:xxxxx:cluster:abcd-abc',
      sqlStatements=readParam
   )

   return 
      'statusCode': 200,
      'headers': 
          'Content-Type': 'application/json',
          "Access-Control-Allow-Origin": "*",
          "Access-Control-Allow-Headers": "Content-Type",
          "Access-Control-Allow-Methods": "OPTIONS,POST"
       ,
      'body': response
  

`

我尝试过使用 SQLAlchemy 和 pydataapi 并将 AWS 开发包部署到 lambda,但不起作用。 lambda 函数不会读取具有 lambda_handler 的相应 python 文件。代码如下:

import pymysql.cursors
from sqlalchemy.engine import create_engine
  def lambda_handler(event, context):
    readParam = event['query']
    database1 = event['database']

    engine = create_engine(
       'mysql+pydataapi://',
        connect_args=
           'resource_arn': 'arn:aws:rds:us-east-1:xxxx:cluster:abcd-abc',
           'secret_arn': 'arn:aws:secretsmanager:us-east-1:xxxx:secret:abc/read-XXXX',
        'database': 'mimic_dev'
    
)

result: ResultProxy = engine.execute(readParam)

return 
    'statusCode': 200,
    'headers': 
        'Content-Type': 'application/json',
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Headers": "Content-Type",
        "Access-Control-Allow-Methods": "OPTIONS,POST"
    ,
    'body': result.fetchall

有没有比我一直在尝试的更好的替代解决方案? 任何帮助表示赞赏。谢谢你

【问题讨论】:

【参考方案1】:

这个问题已经解决了。 资源:AWS lambda deployment Package in Python

还有如下代码:

import pymysql.cursors
import json

from sqlalchemy.engine import create_engine

def lambda_handler(event,context):
   engine = create_engine(
       'mysql+pydataapi://',
        connect_args=
        'resource_arn': 'arn:aws:rds:us-east-1:xxxxx:cluster:xxxx',
        'secret_arn': 'arn:aws:secretsmanager:us-east-1:xxxx:secret:decima/abcd-abc',
        'database': 'mimic_dev'
    
)
   result: ResultProxy = engine.execute("select * from person limit 10000")
   resultValue = result.fetchall()
   return json.dumps([dict(r) for r in resultValue])

【讨论】:

以上是关于使用 rds-data 增加来自 execute_sql 的 aws lambda 结果计数的 1000 限制或使用不同的包?的主要内容,如果未能解决你的问题,请参考以下文章

Python_Executing 来自 Pandas 数据帧的所有值的特定行

为啥即使在增加执行时间之后,我在本地的 Word press 中也会出现 max_execution_time 错误?

在 s-s-rS Report Builder Execute(@Query) 中对列标题使用动态 SQL - 使用来自 1 个表的值作为来自不同表的值的列标题

REMOTE EXECUTION

在多线程程序中使用 Executer 服务

pymssql INSERT 不会自动增加 ID