diff --git a/ecs/dataimport/dataimport/chk.py b/ecs/dataimport/dataimport/chk.py index 87cdc9f9..91f59d04 100644 --- a/ecs/dataimport/dataimport/chk.py +++ b/ecs/dataimport/dataimport/chk.py @@ -187,7 +187,7 @@ def check(bucket_name, target_data_source, target_file_name, settings_key, log_i raise CheckError( f'E-CHK-03 - 投入データ末尾の項目数が一致しません 個別設定ファイル項目数:{settings_list[SETTINGS_ITEM["csvNumItems"]]} 投入データ項目数:{last_line_count}') print( - f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-09 - C-3 末尾行項目数チェック 正常終了') + f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {INFO} I-CHK-14 - C-3 末尾行項目数チェック 正常終了') # ⑦ チェック処理終了ログを出力する print( diff --git a/ecs/dataimport/dataimport/main.py b/ecs/dataimport/dataimport/main.py index adea2f8e..aa717847 100644 --- a/ecs/dataimport/dataimport/main.py +++ b/ecs/dataimport/dataimport/main.py @@ -480,9 +480,14 @@ def import_data_with_bulk( load_schema_name = settings_list[SETTINGS_ITEM["loadSchemaName"]] has_header = settings_list[SETTINGS_ITEM["headerFlag"]] or int( settings_list[SETTINGS_ITEM["headerFlag"]]) == 1 - settings_db_columu_list = settings_list[SETTINGS_ITEM["dbColumuName"]].rstrip( - ).split(',') enclosed_by = convert_quotechar(settings_list[SETTINGS_ITEM["quotechar"]]) + settings_db_columu_list = settings_list[SETTINGS_ITEM["dbColumuName"]]\ + .rstrip().split(',') + + # データファイル内の空文字をNULLに変換するため、各カラムをパラメータ化 + variables = [f"@{col_name}" for col_name in settings_db_columu_list] + sets = [f"`{col}` = NULLIF(@{col}, '')" + for col in settings_db_columu_list] sql = f""" SET @file_row_cnt = 1; @@ -493,13 +498,14 @@ def import_data_with_bulk( INTO TABLE {load_schema_name} CHARACTER SET {MYSQL_CHARSET_CODE[settings_list[SETTINGS_ITEM["charCode"]]]} - FIELDS TERMINATED BY '{settings_list[SETTINGS_ITEM["delimiter"]]}' - ENCLOSED BY '{enclosed_by if enclosed_by != "'" else "\\'"}' - LINES TERMINATED BY '{LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]]}' + FIELDS TERMINATED BY {repr(settings_list[SETTINGS_ITEM["delimiter"]])} + ENCLOSED BY {repr(enclosed_by)} + LINES TERMINATED BY {repr(LINE_FEED_CODE[settings_list[SETTINGS_ITEM["lineFeedCode"]]])} {'IGNORE 1 LINES' if has_header else ''} - ({','.join([column for column in settings_db_columu_list])}) + ({','.join(variables)}) SET - -- 取込ファイル名 + {','.join(sets)}, + -- 取込ファイル名 file_name = %s, -- 取込ファイル行番号 file_row_cnt = (@file_row_cnt := @file_row_cnt + 1), @@ -528,7 +534,7 @@ def import_data_with_bulk( conn.commit() except Exception as e: print( - f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {ERROR} 一括登録モードのSQL実行に失敗しました。エラー内容: {e}') + f'{datetime.now():%Y-%m-%d %H:%M:%S} {log_info} {ERROR} E-MAIN-02 - 一括登録モードのSQL実行に失敗しました。エラー内容: {e}') error(bucket_name, target_data_source, target_file_name, log_info) # 一括登録の場合、クエリ実行に成功したら、処理件数と成功件数は同じにする