当前位置: 首页 > 面试题库 >

将psycopg2与Lambda一起使用以更新Redshift(Python)

白宏放
2023-03-14
问题内容

我正在尝试使用python从Lambda函数更新Redshift。为此,我尝试合并2个代码片段。当我分别运行它们时,这两个片段都起作用。

  1. 从PyDev for Eclipse更新Redshift
        import psycopg2

    conn_string = "dbname='name' port='0000' user='name' password='pwd' host='url'"
    conn = psycopg2.connect(conn_string)

    cursor = conn.cursor()

    cursor.execute("UPDATE table SET attribute='new'")
    conn.commit()
    cursor.close()
  1. 接收上传到S3存储桶的内容(Lambda上提供预构建的模板)
        from __future__ import print_function

    import json
    import urllib
    import boto3

    print('Loading function')

    s3 = boto3.client('s3')


    def lambda_handler(event, context):
        #print("Received event: " + json.dumps(event, indent=2))

        # Get the object from the event and show its content type
        bucket = event['Records'][0]['s3']['bucket']['name']
        key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')

        try:
            response = s3.get_object(Bucket=bucket, Key=key)
            print("CONTENT TYPE: " + response['ContentType'])
            return response['ContentType']

        except Exception as e:
            print(e)
            print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
            raise e

由于这两个段都起作用,因此我尝试将它们组合在一起,以便在将文件上传到s3时可以更新Redshift:

    from __future__ import print_function

    import json
    import urllib
    import boto3
    import psycopg2

    print('Loading function')

    s3 = boto3.client('s3')


    def lambda_handler(event, context):
        #print("Received event: " + json.dumps(event, indent=2))

        # Get the object from the event and show its content type
        bucket = event['Records'][0]['s3']['bucket']['name']
        key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key']).decode('utf8')

        conn_string = "dbname='name' port='0000' user='name' password='pwd' host='url'"

        conn = psycopg2.connect(conn_string)

        cursor = conn.cursor()

        cursor.execute("UPDATE table SET attribute='new'")
        conn.commit()
        cursor.close()

        try:
            response = s3.get_object(Bucket=bucket, Key=key)
            print("CONTENT TYPE: " + response['Body'].read())
            return response['Body'].read()
        except Exception as e:
            print(e)
            print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
            raise e

由于我使用的是外部库,因此需要创建一个部署程序包。我创建了一个新文件夹(lambda_function1)并将我的.py文件(lambda_function1.py)移至该文件夹。我运行以下命令在该文件夹中安装psycopg2:

pip install psycopg2 -t \lambda_function1

我收到以下反馈:

    Collecting psycopg2
      Using cached psycopg2-2.6.1-cp34-none-win_amd64.whl
    Installing collected packages: psycopg2
    Successfully installed psycopg2-2.6.1 

然后,我压缩目录的内容。并将该zip文件上传到我的lambda函数。当我将文档上传到功能监视的存储桶时,我的cloudwatch日志中收到以下错误:

Unable to import module 'lambda_function1': No module named _psycopg

当我在库中查找时,唯一名为“ _psycopg”的是“ _psycopg.pyd”。

是什么导致此问题?当我使用3.4时,Lambda使用Python
2.7是否重要?在Windows计算机上压缩文件内容是否重要?有没有人能够从lambda成功连接到Redshift?


问题答案:

为了使其正常工作,您需要psycopg2使用静态链接libpq.so库进行构建。查看此仓库https://github.com/jkehler/awslambda-
psycopg2
。它已经构建了psycopg2软件包并说明了如何自行构建。

回到您的问题:

是什么导致此问题?

psycopg2 需要使用用于Linux的静态链接库来构建编译器。

当我使用3.4时,Lambda使用Python 2.7是否重要?

是的,lambda仅支持2.7版本。只需创建虚拟环境并在其中安装所有必需的软件包即可。

在Windows计算机上压缩文件内容是否重要?

只要您压缩的所有库都可以在Linux上运行,它就不会

有没有人能够从lambda成功连接到Redshift?

是。



 类似资料:
  • 是否可以在AWS Lambda中构建一个函数来创建websocket并将数据发送到订阅的应用程序? 类似这样: John在他的手机中打开了应用程序SuperPhotoApp,但决定使用桌面浏览器将照片上传到SuperPhotoApp服务(S3 Bucket),此事件执行创建套接字的Lambda函数。io服务器并将更新推送到所有订户,他的手机打开了应用程序,因此应用程序会自动更新新照片。 这可以通过

  • 问题内容: 我有数千万行要从多维数组文件传输到PostgreSQL数据库。我的工具是Python和psycopg2。批量插入数据的最有效方法是使用。但是,我的数据主要是32位浮点数(实数或float4),所以我宁愿不从实数→文本→实数转换。这是一个示例数据库DDL: 这是我在Python中使用字符串(文本)的地方: 是否存在可以使用二进制模式运行的等效项?即,将浮点数保留为二进制?这样不仅可以保持

  • 正如AWS文件所示: 现在我做了: 第一段代码打印在Cloud Watch控制台中,但第二段没有。 我没有看到任何区别,因为这两个代码段使用的是根记录器。

  • 问题内容: 是否可以使用Node.js在服务器端使用jQuery选择器/ DOM操作? 问题答案: 似乎有一个重大更新,导致原来的答案不再起作用。我找到了这个答案,解释了现在如何使用。我已经在下面复制了相关代码。 注意:原始答案没有提及你还需要使用安装

  • 我需要一些目前在JavaFX中找不到的功能。比如机器人或托盘图标。 我知道这些工具确实适用于JavaFx应用程序。但是可以使用它们吗?有什么需要我考虑的吗?

  • aws-lambda-redshift-loader 是在 AWS Lambda 上实现的 Amazon Redshift 数据库装载机。有了 AWS Lambda 这个函数,将文件数据传入 Amazon Redshift 会变得相当容易。你只要简单地将文件推到 Amazon S3 的各个位置上,它就会自动加载到你的 Amazon Redshift 集群上。