如何使用python lambda函数从s3读取CSV文件并将内容写入RDS数据库表?

如何使用python lambda函数从s3读取CSV文件并将内容写入RDS数据库表?,python,aws-lambda,Python,Aws Lambda,我在S3存储桶中有一个CSV文件Employee.CSV,其中包含有关员工的所有信息:姓名、年龄、工资、职务。 我必须编写一个python lambda函数来读取这个文件并在RDS数据库中写入,比如它应该创建一个表作为Employee,列name、age、salary、designation和rows将包含数据 Employee.csv就是一个例子,实际上它可以是任何csv文件,其中包含任意数量的列。以下是我现在使用的代码: from __future__ import print_functi

我在S3存储桶中有一个CSV文件Employee.CSV,其中包含有关员工的所有信息:姓名、年龄、工资、职务。 我必须编写一个python lambda函数来读取这个文件并在RDS数据库中写入,比如它应该创建一个表作为Employee,列name、age、salary、designation和rows将包含数据


Employee.csv就是一个例子,实际上它可以是任何csv文件,其中包含任意数量的列。

以下是我现在使用的代码:

from __future__ import print_function
import boto3
import logging
import os
import sys
import uuid
import pymysql
import csv
import rds_config


rds_host  = rds_config.rds_host
name = rds_config.db_username
password = rds_config.db_password
db_name = rds_config.db_name


logger = logging.getLogger()
logger.setLevel(logging.INFO)

try:
    conn = pymysql.connect(rds_host, user=name, passwd=password, db=db_name, connect_timeout=5)
except Exception as e:
    logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
    logger.error(e)
    sys.exit()

logger.info("SUCCESS: Connection to RDS mysql instance succeeded")

s3_client = boto3.client('s3')

def handler(event, context):

    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key'] 
    download_path = '/tmp/{}{}'.format(uuid.uuid4(), key)

    s3_client.download_file(bucket, key,download_path)

    csv_data = csv.reader(file( download_path))

    with conn.cursor() as cur:
        for idx, row in enumerate(csv_data):

            logger.info(row)
            try:
                cur.execute('INSERT INTO target_table(name, age, salary, designation)' \
                                'VALUES("%s", "%s", "%s", "%s")'
                                , row)
            except Exception as e:
                logger.error(e)

            if idx % 100 == 0:
                conn.commit()

        conn.commit()

    return 'File loaded into RDS:' + str(download_path)
s3 = boto3.resource('s3')
    file_object=event['Records'][0]
    key=str(file_object['s3']['object']['key'])
    obj = s3.Object(bucket, key)

    content_lines=obj.get()['Body'].read().decode('utf-8').splitlines(True)

    tableName= key.strip('folder/').strip('.csv')

    with conn.cursor() as cur:
        try:
            cur.execute('TRUNCATE TABLE '+tableName)
        except Exception as e:
            print("ERROR: Unexpected error:Table does not exit.")
            sys.exit()        
        header=True
        for row in csv.reader(content_lines):
            if(header):
                numberOfColumns=len(row)
                columnNames= str(row).replace('[','').replace(']','').replace("'",'')
                print("columnNames:"+columnNames)
                values='%s'
                numberOfValues=len(values)
                numberOfValues=1
                while numberOfValues< numberOfColumns:    
                    values=values+",%s"
                    numberOfValues+=1
                print("INSERT into "+tableName+"("+columnNames+") VALUES("+values+")")
                header=False
            else:
                try:
                    cur.execute('INSERT into '+tableName+'('+columnNames+') VALUES('+values+')', row)
                except Exception as e:
                    raise e
        conn.commit()
s3=boto3.resource('s3'))
file_object=event['Records'][0]
key=str(文件对象['s3']['object']['key']))
obj=s3.对象(bucket,key)
content_lines=obj.get()['Body'].read().decode('utf-8')。拆分行(True)
tableName=key.strip('folder/').strip('.csv'))
将conn.cursor()作为cur:
尝试:
cur.execute('TRUNCATE TABLE'+tableName)
例外情况除外,如e:
打印(“错误:意外错误:表未退出”)
sys.exit()
header=True
对于csv.reader中的行(内容行):
如果(标题):
numberOfColumns=len(行)
columnNames=str(行).replace('[','').replace(']','').replace(']','')
打印(“columnNames:+columnNames”)
值='%s'
numberOfValues=len(值)
numberOfValues=1
当numberOfValues
是否需要下载该文件?s3_客户端。下载_文件(bucket、key、download_路径)不,不需要。您可以从本地打开CSV。我还有一个疑问,在插入表格之前是否需要创建表格命令?是的,有。您应该在SQL数据库中创建一个表。例如,在postgress bash中编写以下命令:CREATE TABLE TABLE_name(column_name TYPE column_constraint,TABLE_constraint TABLE_constraint)继承现有的_TABLE_name;获取此错误:格式字符串的参数不足。对于INSERT语句