-1
私はデータベースと同じ名前と列を持つ辞書を持っています。もう一度手で入力したすべての列名を使用してINSERT INTO
文を書き直すことなくそのまま挿入できますか?pymysqlで辞書を挿入することはできますか?
UPDATE
質問さは約pymysql
機能です。あなたはコードを書く必要はありません。辞書から文SQL
を作成する必要はありません。
私はデータベースと同じ名前と列を持つ辞書を持っています。もう一度手で入力したすべての列名を使用してINSERT INTO
文を書き直すことなくそのまま挿入できますか?pymysqlで辞書を挿入することはできますか?
UPDATE
質問さは約pymysql
機能です。あなたはコードを書く必要はありません。辞書から文SQL
を作成する必要はありません。
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)
なぜライブラリでは行われませんか? – Dims
@Dims:それはなぜでしょうか?挿入する列が適切であるとは必ずしも思えません。必要な列を省略した場合はどうなりますか? –
SQLの必須列を省略した場合と同じです – Dims