コードの最適化

コードの最適化

以下に私のコード(私が作成したメソッド)の一部を示します。読みやすさを向上させ、より美しくするための提案があるかどうかを尋ねたいです。

だから私がしたことは、Excelファイルを読んでその内容を元にしたことでした。展示する列はデータベースでいくつかのクエリを実行しました。しかし、私の問題は三項演算子にあります。この演算子は多く使用され、ひどいようです。

def add_new_patient_identifier(self, excel_file, sheet):

    patient_identifiers = self.excel_reader.read_excel_sheet(excel_file, sheet)
    header = self.excel_reader.get_header(patient_identifiers)

    self.openmrsclient_db.execute("DELETE FROM  idgen_identifier_source")
    self.openmrsclient_db.execute("DELETE FROM  idgen_seq_id_gen")

    for identifier in patient_identifiers.iter_rows(min_row=2):
        if identifier[header['Display']].value == "Yes":

            field = str(identifier[header['Field']].value) if str(identifier[header['Field']].value) != 'None' else ''
            description = str(identifier[header['Source Description']].value) if str(identifier[header['Source Description']].value) != 'None' else ''
            next_sequence_value = str(identifier[header['Next Sequence Value']].value) if str(identifier[header['Next Sequence Value']].value) != 'None' else ''
            base_character_set = str(identifier[header['Base Character Set']].value) if str(identifier[header['Base Character Set']].value) != 'None' else ''
            first_identifier_base = str(identifier[header['First Identifier Base']].value) if str(identifier[header['First Identifier Base']].value) != 'None' else ''
            suffix = str(identifier[header['Suffix']].value) if str(identifier[header['Suffix']].value) != 'None' else ''
            min_length = str(identifier[header['Min Length']].value) if str(identifier[header['Min Length']].value) != 'None' else ''
            max_length = str(identifier[header['Max Length']].value) if str(identifier[header['Max Length']].value) != 'None' else ''
            type_identifier = str(identifier[header['Type']].value) if str(identifier[header['Type']].value) != 'None' else ''

            identifier_type_id = str(self.openmrsclient_db.fetch(
                "SELECT patient_identifier_type_id FROM patient_identifier_type WHERE name = '" + type_identifier + "'")[0][0])

            self.openmrsclient_db.execute("INSERT INTO idgen_identifier_source (uuid, name, description, identifier_type, date_created, creator) \
                            VALUES (uuid(),'" + field + "', '" + description + "', '" + identifier_type_id + "', now(), '1')")

            identifier_source_id = str(self.openmrsclient_db.fetch("SELECT id FROM idgen_identifier_source WHERE name = '" + field + "'")[0][0])

            self.openmrsclient_db.execute("INSERT INTO idgen_seq_id_gen (id, next_sequence_value, base_character_set, first_identifier_base, prefix, suffix, min_length, max_length) \
                            VALUES (" + identifier_source_id + "," + next_sequence_value + "," + base_character_set+","+first_identifier_base+",'" +
                                          field+"','"+suffix+"'," + min_length + "," + max_length + ")")

ベストアンサー1

まず、2回変換しないでください。

field = str(identifier[header['Field']].value)
field = '' if field == 'None' else field

この三項合計アクセサを別の関数に入れることができます。

def load(identifier, header, field):
    val = str(identifier[header[field]].value)
    rval = '' if val == 'None' else rval

field = load(identifier, header, 'Field')
description = load(identifier, header, 'Source Description')

など。

また、そのSQLステートメントに関して現在実行されている操作は、SQLインジェクションに適しています。 openmrsclient_dbが準備されたステートメントをサポートしている場合は、それを使用することをお勧めします。

たとえば、誰かが「max_length」に「0); DROP TABLE idgen_seq_id_gen」と入力すると、データベースはテーブルを削除できます。私はopenmrsclient_dbを使用したことがないことを認識していますが、削除されていない入力と一緒に使用するとSQLインジェクションに対して脆弱です。

おすすめ記事