如何使用python lambda函数从s3读取CSV文件并将内容写入RDS数据库表?
我在S3存储桶中有一个CSV文件Employee.CSV,其中包含有关员工的所有信息:姓名、年龄、工资、职务。 我必须编写一个python lambda函数来读取这个文件并在RDS数据库中写入,比如它应该创建一个表作为Employee,列name、age、salary、designation和rows将包含数据如何使用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
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语句