2017-09-08 4 views
1

列と値をハードコードすることなくupdateステートメントを生成するメソッドを作成したいとします。この文にはオプションのwhere句が含まれ、executemanyに渡されます。この句には列と値のみが含まれ、そこにはselectはありません。例:ステートメントをハードコーディングせずにupdate where節でnullを処理する

update TABLE 
set 
    Col1 = 'a', 
    Col2 = 'b', 
    Col3 = 'c' 
where 
    Col4 = 'd' 
     and Col5 = 'e' 
     and Col1 is null; 

私がこれまでに書いた何を:今

def update(self, table_name, update_columns, values, where_columns=None, where=True): 
    update_columns_and_values = self.generator.generateColumnsAndPlaceholders(update_columns) 
    if where: 
     where_clause = self.generator.generateWhereClause(where_columns) 
    else: 
     where_clause = '' 
    query = ''' 
      update {t} 
      set 
       {cv} 
      {w} 
     '''.format(t=table_name, cv=update_columns_and_values, w=where_clause) 
    self.cursor.executemany(query, values) 
    self.connection.commit() 

def generateColumnsAndPlaceholders(columns): 
    if type(columns) is str: 
     columns = columns.split(', ') 
    return ', \n'.join([str(c) + ' = ' + "'%s'" for c in columns]) 

、どのように私は、任意の数の列を取り、ヌルの両方ではないために調整プレースホルダwhere句を返す関数generateWhereClauseを書く必要があります値(=と表示されます)とヌル値(is nullと表示されます)? また、の場合、プレースホルダの周りに一重引用符があるため、generateColumnsAndPlaceholdersによって返された文字列が準備されていないと思います。もしそうなら、どうすれば変更できますか?

通常、特定のステートメントをハードコードせずに、更新ステートメントでnullをどのように扱いますか?

答えて

1

クエリを生成する関数 - 制約としてNoneを尊重しないことは、列{column: value}および制約の辞書の値の辞書テーブル名を受け取り、{column: constraint}

def update_query(table_name, values, constraints): 
    v_list = [k + '=' + '"' + v + '"' for k, v in values.iteritems()] 
    v_query = ', '.join(v_list) 
    c_list = [k + (' IS NULL' if c is None else '=' + '"' + c + '"') for k, c in constraints.iteritems()] 
    c_query = ' AND '.join(c_list) 
    return 'UPDATE ' + table_name + ' SET ' + v_query + ' WHERE ' + c_query 

テストコード:

tn = "table" 
vl = {"Col1":"a","Col2":"b","Col3":"c"} 
cn = {"Col4":"d","Col5":"e","Col":None} 

結果:

UPDATE table SET Col2="b", Col3="c", Col1="a" WHERE Col6 IS NULL AND Col4="d" AND Col5="e" 

h opeオーダーは問題ではありません。

関連する問題