2017-09-16 528 views
-1

我有一個與數據庫中的名稱和列相同的字典。我可以按原樣插入它,而不用重新編寫INSERT INTO語句,並重新使用所有列名稱進行鍵入?是否可以使用pymysql插入字典?

UPDATE

的問題是關於pymysql能力。您不需要編寫代碼,從字典中構建SQL聲明。

回答

1

PyMySQL和其他DB-API 2.0 adapter一樣;參數必須放置在SQL查詢中作爲位置或命名佔位符。如果你想避免直接命名列,你必須以編程方式生成佔位符。

當您使用%(name)s參數語法時,PyMySQL支持使用參數字典執行查詢。要從字典中生成插入語句,您可以使用:

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