From f5eb9a18c62db34c542beef0ad4588d0dd74c7f0 Mon Sep 17 00:00:00 2001 From: Pierre-Antoine Rouby Date: Mon, 10 Mar 2025 17:04:31 +0100 Subject: [PATCH] SQL: Fix empty/partiel study save #12. --- Model/create_table_for_save_as.py | 435 ++++++++++++++++++------------ 1 file changed, 267 insertions(+), 168 deletions(-) diff --git a/Model/create_table_for_save_as.py b/Model/create_table_for_save_as.py index c4170f0..dbab7df 100644 --- a/Model/create_table_for_save_as.py +++ b/Model/create_table_for_save_as.py @@ -210,11 +210,22 @@ class CreateTableForSaveAs: # Create database cursor to execute SQL statements and fetch results from SQL queries. cur = cnx.cursor() - # -------------------------------------------------------------------------------------------------------------- - # +++++++++++++++++++++++++++ - # --- Table Acoustic File --- - # +++++++++++++++++++++++++++ + self.create_table_acoustic_file(cnx, cur) + self.create_table_measure(cnx, cur) + self.create_table_BSRawData(cnx, cur) + self.create_table_settings(cnx, cur) + self.create_table_sediments_file(cnx, cur) + self.create_table_sediments_data(cnx, cur) + self.create_table_calibration(cnx, cur) + self.create_table_inversion(cnx, cur) + cnx.commit() + + # Close database + cur.close() + cnx.close() + + def create_table_acoustic_file(self, cnx, cur): start_table_File = time.time() cur.execute("DROP TABLE if exists AcousticFile") @@ -222,28 +233,42 @@ class CreateTableForSaveAs: cur.execute(self.create_AcousticFile) for i in stg.acoustic_data: - print("stg.acoustic_data ", stg.acoustic_data[i]) - print("stg.filename_BS_raw_data ", stg.filename_BS_raw_data[i]) - print('stg.ABS_name', stg.ABS_name) - print("stg.path_BS_raw_data ", stg.path_BS_raw_data[i]) + logger.debug(f"stg.acoustic_data: {stg.acoustic_data[i]}") + logger.debug("stg.filename_BS_raw_data: " + + f"{stg.filename_BS_raw_data[i]}") + logger.debug(f"stg.ABS_name: {stg.ABS_name}") + logger.debug(f"stg.path_BS_raw_data: {stg.path_BS_raw_data[i]}") - cur.execute(''' INSERT into AcousticFile(acoustic_data, acoustic_file, ABS_name, path_BS_noise_data, - filename_BS_noise_data, noise_method, noise_value, data_preprocessed) - VALUES(?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], stg.filename_BS_raw_data[i].split('.')[0], stg.ABS_name[i], - stg.path_BS_noise_data[i], stg.filename_BS_noise_data[i], stg.noise_method[i], - stg.noise_value[i], stg.data_preprocessed[i]) - ) + cur.execute( + ''' + INSERT into AcousticFile( + acoustic_data, + acoustic_file, + ABS_name, + path_BS_noise_data, + filename_BS_noise_data, + noise_method, + noise_value, + data_preprocessed) + VALUES(?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.acoustic_data[i], + stg.filename_BS_raw_data[i].split('.')[0], + stg.ABS_name[i], + stg.path_BS_noise_data[i], + stg.filename_BS_noise_data[i], + stg.noise_method[i], + stg.noise_value[i], + stg.data_preprocessed[i] + ) + ) cnx.commit() - print(f"table File : {time.time() - start_table_File} sec") - - # -------------------------------------------------------------------------------------------------------------- - # +++++++++++++++++++++ - # --- Table Measure --- - # +++++++++++++++++++++ + logger.info(f"table File : {time.time() - start_table_File} sec") + def create_table_measure(self, cnx, cur): start_table_Measure = time.time() # Drop Table if exists @@ -251,35 +276,52 @@ class CreateTableForSaveAs: # Execute the CREATE TABLE statement cur.execute(self.create_Measure) - print("stg.date ", stg.date, "stg.hour ", stg.hour) - # Fill the table Measure + + logger.debug(f"stg.date: {stg.date}, stg.hour: {stg.hour}") + for i in stg.acoustic_data: - for j in range(stg.freq[i].shape[0]): - - cur.execute(''' INSERT into Measure(acoustic_data, Date, Hour, frequency, sound_attenuation, kt_read, kt_corrected, - NbProfiles, NbProfilesPerSeconds, NbCells, CellSize, PulseLength, - NbPingsPerSeconds, NbPingsAveragedPerProfile, GainRx, GainTx - ) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], #stg.date[i], stg.hour[i], - str(stg.date[i].year) + str('-') + str(stg.date[i].month) + str('-') + str(stg.date[i].day), - str(stg.hour[i].hour) + str(':') + str(stg.hour[i].minute), - stg.freq[i][j], stg.water_attenuation[i][j], stg.kt_read[j], stg.kt_corrected[j], - stg.nb_profiles[i][j], stg.nb_profiles_per_sec[i][j], stg.nb_cells[i][j], - stg.cell_size[i][j], stg.pulse_length[i][j], stg.nb_pings_per_sec[i][j], - stg.nb_pings_averaged_per_profile[i][j], stg.gain_rx[i][j], stg.gain_tx[i][j])) + cur.execute( + ''' + INSERT into Measure( + acoustic_data, + Date, Hour, + frequency, + sound_attenuation, + kt_read, kt_corrected, + NbProfiles, NbProfilesPerSeconds, + NbCells, CellSize, + PulseLength, + NbPingsPerSeconds, + NbPingsAveragedPerProfile, + GainRx, GainTx + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.acoustic_data[i], #stg.date[i], stg.hour[i], + str(stg.date[i].year) + str('-') + + str(stg.date[i].month) + str('-') + + str(stg.date[i].day), + str(stg.hour[i].hour) + str(':') + str(stg.hour[i].minute), + stg.freq[i][j], + stg.water_attenuation[i][j], + stg.kt_read[j], stg.kt_corrected[j], + stg.nb_profiles[i][j], stg.nb_profiles_per_sec[i][j], + stg.nb_cells[i][j], stg.cell_size[i][j], + stg.pulse_length[i][j], + stg.nb_pings_per_sec[i][j], + stg.nb_pings_averaged_per_profile[i][j], + stg.gain_rx[i][j], stg.gain_tx[i][j] + ) + ) # Commit the transaction after executing INSERT. cnx.commit() - print(f"table Measure : {time.time() - start_table_Measure} sec") - - # -------------------------------------------------------------------------------------------------------------- - # +++++++++++++++++++++++++ - # --- Table BSRawData_i --- - # +++++++++++++++++++++++++ + logger.info(f"table Measure : {time.time() - start_table_Measure} sec") + def create_table_BSRawData(self, cnx, cur): start_table_BSRawData = time.time() cur.execute('DROP TABLE if exists BSRawData') @@ -288,105 +330,140 @@ class CreateTableForSaveAs: cur.execute(self.create_BSRawData) for i in stg.acoustic_data: + cur.execute( + ''' + INSERT into BSRawData( + acoustic_data, + time, depth, + BS_raw_data, + time_reshape, + depth_reshape, + BS_raw_data_reshape, + time_cross_section, depth_cross_section, + BS_cross_section, BS_stream_bed, + depth_bottom, val_bottom, ind_bottom, + time_noise, depth_noise, BS_noise_raw_data, + SNR_raw_data, SNR_cross_section, SNR_stream_bed, + BS_raw_data_pre_process_SNR, BS_raw_data_pre_process_average, + BS_cross_section_pre_process_SNR, BS_cross_section_pre_process_average, + BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average, + BS_mean + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, ?) + ''', + ( + stg.acoustic_data[i], stg.time[i].tobytes(), + stg.depth[i].tobytes(), stg.BS_raw_data[i].tobytes(), + stg.time_reshape[i].tobytes(), stg.depth_reshape[i].tobytes(), + stg.BS_raw_data_reshape[i].tobytes(), + stg.time_cross_section[i].tobytes(), + stg.depth_cross_section[i].tobytes(), + stg.BS_cross_section[i].tobytes(), stg.BS_stream_bed[i].tobytes(), + stg.depth_bottom[i].tobytes(), np.array(stg.val_bottom[i]).tobytes(), + np.array(stg.ind_bottom[i]).tobytes(), + stg.time_noise[i].tobytes(), stg.depth_noise[i].tobytes(), + stg.BS_noise_raw_data[i].tobytes(), + stg.SNR_raw_data[i].tobytes(), stg.SNR_cross_section[i].tobytes(), + stg.SNR_stream_bed[i].tobytes(), + stg.BS_raw_data_pre_process_SNR[i].tobytes(), + stg.BS_raw_data_pre_process_average[i].tobytes(), + stg.BS_cross_section_pre_process_SNR[i].tobytes(), + stg.BS_cross_section_pre_process_average[i].tobytes(), + stg.BS_stream_bed_pre_process_SNR[i].tobytes(), + stg.BS_stream_bed_pre_process_average[i].tobytes(), + stg.BS_mean[i].tobytes() + ) + ) - cur.execute(''' INSERT into BSRawData(acoustic_data, time, depth, BS_raw_data, - time_reshape, depth_reshape, BS_raw_data_reshape, - time_cross_section, depth_cross_section, - BS_cross_section, BS_stream_bed, - depth_bottom, val_bottom, ind_bottom, - time_noise, depth_noise, BS_noise_raw_data, - SNR_raw_data, SNR_cross_section, SNR_stream_bed, - BS_raw_data_pre_process_SNR, BS_raw_data_pre_process_average, - BS_cross_section_pre_process_SNR, BS_cross_section_pre_process_average, - BS_stream_bed_pre_process_SNR, BS_stream_bed_pre_process_average, - BS_mean) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], stg.time[i].tobytes(), - stg.depth[i].tobytes(), stg.BS_raw_data[i].tobytes(), - stg.time_reshape[i].tobytes(), stg.depth_reshape[i].tobytes(), stg.BS_raw_data_reshape[i].tobytes(), - stg.time_cross_section[i].tobytes(), stg.depth_cross_section[i].tobytes(), - stg.BS_cross_section[i].tobytes(), stg.BS_stream_bed[i].tobytes(), - stg.depth_bottom[i].tobytes(), np.array(stg.val_bottom[i]).tobytes(), np.array(stg.ind_bottom[i]).tobytes(), - stg.time_noise[i].tobytes(), stg.depth_noise[i].tobytes(), stg.BS_noise_raw_data[i].tobytes(), - stg.SNR_raw_data[i].tobytes(), stg.SNR_cross_section[i].tobytes(), stg.SNR_stream_bed[i].tobytes(), - stg.BS_raw_data_pre_process_SNR[i].tobytes(), stg.BS_raw_data_pre_process_average[i].tobytes(), - stg.BS_cross_section_pre_process_SNR[i].tobytes(), stg.BS_cross_section_pre_process_average[i].tobytes(), - stg.BS_stream_bed_pre_process_SNR[i].tobytes(), stg.BS_stream_bed_pre_process_average[i].tobytes(), - stg.BS_mean[i].tobytes() - ) - ) + logger.debug(f"stg.ind_bottom: {stg.ind_bottom[i]}") + logger.debug(np.array([stg.ind_bottom[i]]), + np.array(stg.ind_bottom[i]).shape) - print("stg.ind_bottom ", stg.ind_bottom[i]) - print(np.array([stg.ind_bottom[i]]), np.array(stg.ind_bottom[i]).shape) - # Commit the transaction after executing INSERT. + # Commit the transaction after executing INSERT. cnx.commit() - print(f"table BSRawData : {time.time() - start_table_BSRawData} sec") - - # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++++++ - # --- Table Settings --- - # ++++++++++++++++++++++ + logger.info(f"table BSRawData : {time.time() - start_table_BSRawData} sec") + def create_table_settings(self, cnx, cur): start_table_Settings = time.time() cur.execute("DROP TABLE if exists Settings") cur.execute(self.create_Settings) - print(stg.acoustic_data, stg.temperature, stg.rmin, stg.rmax, stg.tmin, stg.tmax) + logger.debug(f"acoustic_data: {stg.acoustic_data}") + logger.debug(f"temperature: {stg.temperature}") + logger.debug(f"rmin: {stg.rmin}, rmax: {stg.rmax}") + logger.debug(f"tmin: {stg.tmin}, tmax: {stg.tmax}") for i in stg.acoustic_data: - cur.execute('''INSERT into Settings(acoustic_data, temperature, - tmin_index, tmin_value, tmax_index, tmax_value, - rmin_index, rmin_value, rmax_index, rmax_value, - freq_bottom_detection_index, freq_bottom_detection_value, - SNR_filter_value, Nb_cells_to_average_BS_signal - ) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.acoustic_data[i], stg.temperature, - stg.tmin[i][0], stg.tmin[i][1], stg.tmax[i][0], stg.tmax[i][1], - stg.rmin[i][0], stg.rmin[i][1], stg.rmax[i][0], stg.rmax[i][1], - stg.freq_bottom_detection[i][0], stg.freq_bottom_detection[i][1], - stg.SNR_filter_value[i], stg.Nb_cells_to_average_BS_signal[i] - ) - ) + cur.execute( + ''' + INSERT into Settings( + acoustic_data, temperature, + tmin_index, tmin_value, tmax_index, tmax_value, + rmin_index, rmin_value, rmax_index, rmax_value, + freq_bottom_detection_index, freq_bottom_detection_value, + SNR_filter_value, Nb_cells_to_average_BS_signal + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.acoustic_data[i], stg.temperature, + stg.tmin[i][0], stg.tmin[i][1], + stg.tmax[i][0], stg.tmax[i][1], + stg.rmin[i][0], stg.rmin[i][1], + stg.rmax[i][0], stg.rmax[i][1], + stg.freq_bottom_detection[i][0], + stg.freq_bottom_detection[i][1], + stg.SNR_filter_value[i], + stg.Nb_cells_to_average_BS_signal[i] + ) + ) cnx.commit() - print(f"table Settings : {time.time() - start_table_Settings} sec") - - # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++++++++++++ - # --- Table Sediments File --- - # ++++++++++++++++++++++++++++ + logger.info(f"table Settings : {time.time() - start_table_Settings} sec") + def create_table_sediments_file(self, cnx, cur): start_table_SedimentsFile = time.time() cur.execute("DROP TABLE if exists SedimentsFile") cur.execute(self.create_SedimentsFile) - cur.execute('''INSERT into SedimentsFile(path_fine, filename_fine, radius_grain_fine, - path_sand, filename_sand, radius_grain_sand, - time_column_label, distance_from_bank_column_label, - depth_column_label, Ctot_fine_column_label, D50_fine_column_label, - Ctot_sand_column_label, D50_sand_column_label) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.path_fine, stg.filename_fine, stg.radius_grain_fine.tobytes(), - stg.path_sand, stg.filename_sand, stg.radius_grain_sand.tobytes(), - stg.columns_fine[0], stg.columns_fine[1], stg.columns_fine[2], - stg.columns_fine[3], stg.columns_fine[4], stg.columns_sand[3], stg.columns_sand[4])) + if stg.path_fine != "" and path_sand != "": + cur.execute( + ''' + INSERT into SedimentsFile( + path_fine, filename_fine, radius_grain_fine, + path_sand, filename_sand, radius_grain_sand, + time_column_label, distance_from_bank_column_label, + depth_column_label, Ctot_fine_column_label, + D50_fine_column_label, + Ctot_sand_column_label, D50_sand_column_label + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.path_fine, stg.filename_fine, + stg.radius_grain_fine.tobytes(), + stg.path_sand, stg.filename_sand, + stg.radius_grain_sand.tobytes(), + stg.columns_fine[0], stg.columns_fine[1], + stg.columns_fine[2], stg.columns_fine[3], + stg.columns_fine[4], + stg.columns_sand[3], stg.columns_sand[4] + ) + ) cnx.commit() - print(f"table SedimentsFile : {time.time() - start_table_SedimentsFile} sec") + logger.info(f"table SedimentsFile : {time.time() - start_table_SedimentsFile} sec") - # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++++++++++++ - # --- Table Sediments Data --- - # ++++++++++++++++++++++++++++ + def create_table_sediments_data(self, cnx, cur): start_table_SedimentsData = time.time() cur.execute("DROP TABLE if exists SedimentsData") @@ -394,59 +471,79 @@ class CreateTableForSaveAs: cur.execute(self.create_SedimentsData) for f in range(len(stg.sample_fine)): - cur.execute('''INSERT into SedimentsData(sample_fine_name, sample_fine_index, distance_from_bank_fine, - depth_fine, time_fine, Ctot_fine, Ctot_fine_per_cent, D50_fine, - frac_vol_fine, frac_vol_fine_cumul, - sample_sand_name, sample_sand_index, distance_from_bank_sand, - depth_sand, time_sand, Ctot_sand, Ctot_sand_per_cent, D50_sand, - frac_vol_sand, frac_vol_sand_cumul - ) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.sample_fine[f][0] , stg.sample_fine[f][1], - stg.distance_from_bank_fine[f], stg.depth_fine[f], stg.time_fine[f], stg.Ctot_fine[f], - stg.Ctot_fine_per_cent[f], stg.D50_fine[f], - stg.frac_vol_fine[f].tobytes(), stg.frac_vol_fine_cumul[f].tobytes(), - stg.sample_sand[f][0], stg.sample_sand[f][1], - stg.distance_from_bank_sand[f], stg.depth_sand[f], stg.time_sand[f], stg.Ctot_sand[f], - stg.Ctot_sand_per_cent[f], stg.D50_sand[f], - stg.frac_vol_sand[f].tobytes(), stg.frac_vol_sand_cumul[f].tobytes())) + cur.execute( + ''' + INSERT into SedimentsData( + sample_fine_name, sample_fine_index, + distance_from_bank_fine, + depth_fine, time_fine, Ctot_fine, + Ctot_fine_per_cent, D50_fine, + frac_vol_fine, frac_vol_fine_cumul, + sample_sand_name, sample_sand_index, + distance_from_bank_sand, + depth_sand, time_sand, Ctot_sand, + Ctot_sand_per_cent, D50_sand, + frac_vol_sand, frac_vol_sand_cumul + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, + ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.sample_fine[f][0] , stg.sample_fine[f][1], + stg.distance_from_bank_fine[f], stg.depth_fine[f], + stg.time_fine[f], stg.Ctot_fine[f], + stg.Ctot_fine_per_cent[f], stg.D50_fine[f], + stg.frac_vol_fine[f].tobytes(), + stg.frac_vol_fine_cumul[f].tobytes(), + stg.sample_sand[f][0], stg.sample_sand[f][1], + stg.distance_from_bank_sand[f], stg.depth_sand[f], + stg.time_sand[f], stg.Ctot_sand[f], + stg.Ctot_sand_per_cent[f], stg.D50_sand[f], + stg.frac_vol_sand[f].tobytes(), + stg.frac_vol_sand_cumul[f].tobytes() + ) + ) cnx.commit() - print(f"table SedimentsData : {time.time() - start_table_SedimentsData} sec") - - # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++++++++++++++ - # --- Table Calibration --- - # ++++++++++++++++++++++++++++++ + logger.info(f"table SedimentsData : {time.time() - start_table_SedimentsData} sec") + def create_table_calibration(self, cnx, cur): start_table_Calibration = time.time() cur.execute("DROP TABLE if exists Calibration") cur.execute(self.create_Calibration) - cur.execute('''INSERT into Calibration(path_calibration_file, filename_calibration_file, - range_lin_interp, M_profile_fine, - ks, sv, X_exponent, alpha_s, zeta, - FCB, depth_real, lin_reg) - VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)''', - (stg.path_calibration_file, stg.filename_calibration_file, - stg.range_lin_interp.tobytes(), stg.M_profile_fine.tobytes(), - np.array(stg.ks).tobytes(), np.array(stg.sv).tobytes(), np.array(stg.X_exponent).tobytes(), - np.array(stg.alpha_s).tobytes(), np.array(stg.zeta).tobytes(), - stg.FCB.tobytes(), stg.depth_real.tobytes(), np.array(stg.lin_reg).tobytes()) - ) + if len(stg.range_lin_interp) != 0: + cur.execute( + ''' + INSERT into Calibration( + path_calibration_file, filename_calibration_file, + range_lin_interp, M_profile_fine, + ks, sv, X_exponent, alpha_s, zeta, + FCB, depth_real, lin_reg + ) + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ''', + ( + stg.path_calibration_file, stg.filename_calibration_file, + stg.range_lin_interp.tobytes(), + stg.M_profile_fine.tobytes(), + np.array(stg.ks).tobytes(), np.array(stg.sv).tobytes(), + np.array(stg.X_exponent).tobytes(), + np.array(stg.alpha_s).tobytes(), + np.array(stg.zeta).tobytes(), + stg.FCB.tobytes(), stg.depth_real.tobytes(), + np.array(stg.lin_reg).tobytes() + ) + ) cnx.commit() - print(f"table Calibration : {time.time() - start_table_Calibration} sec") - - # -------------------------------------------------------------------------------------------------------------- - # ++++++++++++++++++++++++++++++ - # --- Table Inversion --- - # ++++++++++++++++++++++++++++++ + logger.info(f"table Calibration : {time.time() - start_table_Calibration} sec") + def create_table_inversion(self, cnx, cur): start_table_Inversion = time.time() cur.execute("DROP TABLE if exists Inversion") @@ -454,21 +551,23 @@ class CreateTableForSaveAs: cur.execute(self.create_Inversion) for i in range(len(stg.SSC_fine)): - cur.execute('''INSERT into Inversion(J_cross_section_freq1, J_cross_section_freq2, - VBI_cross_section, SSC_fine, SSC_sand) - VALUES(?, ?, ?, ?, ?)''', - (stg.J_cross_section[i][0].tobytes(), stg.J_cross_section[i][1].tobytes(), - stg.VBI_cross_section[i].tobytes(), stg.SSC_fine[i].tobytes(), stg.SSC_sand[i].tobytes()) - ) + cur.execute( + ''' + INSERT into Inversion( + J_cross_section_freq1, J_cross_section_freq2, + VBI_cross_section, SSC_fine, SSC_sand + ) + VALUES(?, ?, ?, ?, ?) + ''', + ( + stg.J_cross_section[i][0].tobytes(), + stg.J_cross_section[i][1].tobytes(), + stg.VBI_cross_section[i].tobytes(), + stg.SSC_fine[i].tobytes(), + stg.SSC_sand[i].tobytes() + ) + ) cnx.commit() - print(f"table Inversion : {time.time() - start_table_Inversion} sec") - - # -------------------------------------------------------------------------------------------------------------- - - # Close database cursor - cur.close() - - # Close database connection - cnx.close() + logger.info(f"table Inversion : {time.time() - start_table_Inversion} sec")