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