2017-11-21 13 views
0

私はPythonスクリプトを使用してMySQLデータベースにデータをインポートしています。 MySQLdbを使用してクエリを実行します。Python MySQLdbクエリパラメータ "= NULL"ではなく "IS NULL"

私はまた、クエリや名前付きパラメータとそのデータを設定する機能を使用

は自動的になど、要求の内側に交換する:私は、同じデータを使用していますので、私は本当にこのようような

req = "SELECT * FROM sample WHERE `id` = %(id)s and `param1` = %(param1)s" 
data = {'id': 15, 'param1': None} 
cursor.execute(req, data) 

3または4クエリの場合はdictです。

問題は、私はNone値でWHERE条件を作るしようとすると、それはNULLで私のNoneを置き換えるんが、私は条件が真と評価されるように、`param1` IS NULLによって`param1` = NULLを交換できるようにしたいと思います。

この問題を直接解決する方法はありますか?または、パラメータの置換だけを使用して(クエリを実行せずに)、自分で置換を行い(= NULLIS NULL)、クエリを実行します。

答えて

2

次のようなことができます。

def query(params): 
    # Make sure it's hardcoded and malicious user can't overwrite it 
    param_whitelist = 'id', 'param1' 

    sql = ''' 
     SELECT * 
     FROM sample 
     WHERE {placeholders} 
    ''' 
    placeholders = ' AND '.join(
     '`{field}` {op} %s'.format(field=k, op='IS' if params[k] is None else '=') 
     for k in param_whitelist) 
    sql = sql.format(placeholders=placeholders) 

    cursor.execute(sql, params) 
    return cursor 


data = {'id': 15, 'param1': None} 
print([r for r in query(data)]) 
+1

@ m.nachury最初に、 'param_whitelist'が使われていない最新のバージョンのスニペットを貼り付けました。アップデートで修正されました。 – saaj