2017-09-16 56 views
-1

私はデータベースと同じ名前と列を持つ辞書を持っています。もう一度手で入力したすべての列名を使用してINSERT INTO文を書き直すことなくそのまま挿入できますか?pymysqlで辞書を挿入することはできますか?

UPDATE

質問さは約pymysql機能です。あなたはコードを書く必要はありません。辞書から文SQLを作成する必要はありません。

答えて

1

PyMySQLは他のものと同じですDB-API 2.0 adapter;パラメータは、位置または名前付きプレースホルダとしてSQLクエリに配置する必要があります。明示的に列の名前を付けたくない場合は、プログラムでプレースホルダを生成する必要があります。

PyMySQLは、パラメータ構文の%(name)sを使用すると、パラメータ辞書でクエリを実行することをサポートしています。辞書から挿入文を生成するには、次のようにします。

def escape_name(s): 
    """Escape name to avoid SQL injection and keyword clashes. 

    Doubles embedded backticks, surrounds the whole in backticks. 

    Note: not security hardened, caveat emptor. 

    """ 
    return '`{}`'.format(s.replace('`', '``')) 

names = list(dict_of_params) 
cols = ', '.join(map(escape_name, names)) # assumes the keys are *valid column names*. 
placeholders = ', '.join(['%({})s'.format(name) for name in names]) 

query = 'INSERT INTO TABLENAME ({}) VALUES ({})'.format(cols, params) 
cursor.execute(query, dict_of_params) 
+0

なぜライブラリでは行われませんか? – Dims

+0

@Dims:それはなぜでしょうか?挿入する列が適切であるとは必ずしも思えません。必要な列を省略した場合はどうなりますか? –

+0

SQLの必須列を省略した場合と同じです – Dims

関連する問題