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
Exemple #5
0
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())