def _save_web_tmp_db(self, sql, tpl): try: with DBConnect.get_connection() as con: with con.cursor() as cur: cur.execute(sql, tpl) except: Util.put('_save_web_tmp_db エラー', traceback.format_exc() + '\r\n\r\n' + sql)
def lambda_handler(event, context): reload(sys) sys.setdefaultencoding("utf-8") Util.put('lambda_handler', str(event)) # イベントで振る舞いを変える for event_record in event['Records']: if 's3' in event_record: # S3イベントの場合 key = Util.url_decode(event_record['s3']['object']['key']) Util.put('key', key) import s3_main s3_main.data_import(key) else: # cronイベントの場合 pass
def save(cls, org_file_name, arr_csv_container, str_collaborator): u"csv_containerの配列をもらって、ファイルに保存、S3にUP、そのパスを返す" tmp_csv_file_name = org_file_name.replace('_org.', '.') tmp_csv_zip_file_name = tmp_csv_file_name.replace('.csv', '.zip') tmp_csv_file_path = '/tmp/' + tmp_csv_file_name tmp_csv_zip_file_path = tmp_csv_file_path.replace('.csv', '.zip') with open(tmp_csv_file_path, 'ab') as f: # aでファイルが無ければ作る # 改行やカンマ、コーテーションなどのCSVフォーマットを崩す文字列がある場合だけ、ダブルコーテーションでくくられる csv_writer = csv.writer(f, quoting=csv.QUOTE_MINIMAL) # ヘッダーを書く header_row_data = [] header_row_data.append('店舗名') header_row_data.append('店舗電話番号') csv_writer.writerow(header_row_data) for i, csv_container in enumerate(arr_csv_container): # indexつきで処理 try: row_data = [] row_data.append(csv_container.name) row_data.append(csv_container.telephone) csv_writer.writerow(row_data) except: Util.put('CsvController.save', traceback.format_exc()) with zipfile.ZipFile(tmp_csv_zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipFile: zipFile.write(tmp_csv_file_path, tmp_csv_file_name) s3 = boto3.resource('s3') bucket = s3.Bucket(Settings.get_s3_bucket()) # 変換結果をバックアップの意味でUP with open(tmp_csv_zip_file_path, 'rb') as csv_up_data: bucket.put_object(Key=str_collaborator + '/' + tmp_csv_zip_file_name, Body=csv_up_data) return tmp_csv_file_name
def data_import(csv_path): reload(sys) sys.setdefaultencoding("utf-8") Util.put('変換開始', csv_path) with open(csv_path) as f: reader = csv.reader(f) next(reader) # ヘッダーを読み飛ばす場合 arr_csv_cnt = [] # 一行ずつ処理 for row in reader: # indexつきで処理 # CSVフォーマットのクラスへ保持する csv_cnt = CsvContainer() csv_cnt.name = row[0] csv_cnt.telephone = row[1] # …ホントは続く arr_csv_cnt.append(csv_cnt) return arr_csv_cnt
def data_import(key): u'S3トリガのメイン関数' try: reload(sys) sys.setdefaultencoding("utf-8") Util.put('s3_main.data_import 開始', key) # S3からDL 別名で保存 s3 = boto3.resource('s3') bucket = s3.Bucket(Settings.get_s3_bucket()) code = 'netmarketing' # とりあえず決め打ち 本来は判別する org_csv_file_name = '{cd}_{dt}_{hs}_org.csv'.format( cd=code, dt=datetime.now().strftime('%Y%m%d_%H%M%S'), hs=hashlib.sha224(key).hexdigest()[0:10] # 複数ファイル更新時にも被らないように ) org_csv_file_path = '/tmp/' + org_csv_file_name bucket.download_file(key, org_csv_file_path) # CSVを各提供元の仕様に則って変換、CSVデータの配列を返す arr_csv_container = [] import collaborator.netmarketing as collabo # 本来は提携先によって取得処理を違わせる arr_csv_container = collabo.data_import(org_csv_file_path) # S3にCSVファイルとしてUP、ファイル名を返す csv_file = CsvController.save(org_csv_file_name, arr_csv_container, code) # データをサービス用DBに保存 CsvController.insert_web_tmp_db(arr_csv_container, csv_file) # S3のファイルをバックアップしてから削除 org_zip_file_name = org_csv_file_name.replace('.csv', '.zip') org_zip_file_path = org_csv_file_path.replace('.csv', '.zip') with zipfile.ZipFile(org_zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipFile: zipFile.write(org_csv_file_path, org_csv_file_name) with open(org_zip_file_path, 'rb') as org_up_data: bucket.put_object(Key=code + '/' + org_zip_file_name, Body=org_up_data) s3.Object(Settings.get_s3_bucket(), key).delete() Util.put('s3_main.data_import 終了', '[name] : ' + code) except: # エラー書き込み import traceback Util.put('s3_main.data_import エラー', traceback.format_exc())