从aws s3 bucket

时间:2018-03-01 03:42:30

标签: python pandas amazon-web-services amazon-s3

我在s3存储桶中有一个zip文件。我将该zip文件解压缩到内存中(不解压缩)并将.csv中的数据转储到我的数据库中的表中。但是在转储表时,我得到了外部约束,因为程序按顺序转储csvs,所以一些表在其他表示例之前被转储 - 我有两个表'dealer_master'和'billing_master',两个表的结构:

1)dealer_data

  • dealer_id:主键
  • 国家
  • pin码
  • 地址
  • CREATE_DATE

2)billing_data

  • bill_id:primary-key
  • dealer_id:foreign_key
  • bill_amount
  • bill_date

在zip文件中,我在dealer_data之前获得了billing_data。因此得到'外键约束错误'。对于上述问题的解决方案,我在连接数据库时关闭了外键约束。有没有其他方法,我可以按正确的顺序将表转储到我的数据库中? 我可以将表存储在内存中一段时间​​,然后以我想要的方式转储它们吗?

我的代码是这样的:

def etl_job():

`data = json.load(open('path_to_json'))`

 `logger = helpers.setup_logging()`

 `s3_client = boto3.client('s3',aws_access_key_id=data['aws_access_key_id'],
                    aws_secret_access_key=data['aws_secret_access_key'])`  

`s3_resource = boto3.resource('s3',aws_access_key_id=data['aws_access_key_id'],
                    aws_secret_access_key=data['aws_secret_access_key'])`  

`keys = []`  
`resp = s3_client.list_objects_v2(Bucket=bucket_name)`
`for obj in resp['Contents']:`        
   `keys.append(obj['Key'])
 for key in keys:
   names =  key.split("/")
   obj = s3_resource.Bucket(bucket_name).Object(helpers.zip_file_name())
 buffer = io.BytesIO(obj.get()["Body"].read())
 zip_file = zipfile.ZipFile(buffer,'r')
 logger.info("Name of csv in zip file :%s",zip_file.namelist())
 logs = ""
 dataframe = pd.DataFrame()
 for name_of_zipfile in zip_file.namelist():
    zip_open = pd.read_csv(zip_file.open(name_of_zipfile))
    zip_open = zip_open.dropna()
    table_name = "{name}".format(name=name_of_zipfile.replace('.csv',''))
    try :
        zip_open.to_sql(name=name_of_zipfile.replace('.csv',''), con=database.db_connection(), if_exists = 'append', index=False)
    except SQLAlchemyError as sqlalchemy_error:
        print sqlalchemy_error
 database.db_connection().execute('SET FOREIGN_KEY_CHECKS=1;')`

0 个答案:

没有答案