使用Python字典创建通用MySQL插入语句
我想写一个通用的SQL命令,可以从字典中获取数据。这样我就可以简单地把一个字典传递给一个函数,然后把这些数据发送到MySQL服务器上。
举个例子:
dict = {'table':'test_table','dataA':dataValue1,'dataB':dataValue2, ect}
cursor.execute("""INSERT INTO %(table)s (%(columName1)s,%(columName2)s,ect)
VALUES (%(dataA)s,%(dataB)s)""", dict)
类似这样的。我还需要这个命令支持不同长度的字典。我的想法是,只要相关的表存在,我的所有数据都能被插入,而不需要写一堆SQL查询。
有没有人有简单的方法来实现这个,或者有什么资料可以让我学习解决这个问题?
1 个回答
1
MySQLdb
模块的文档可以在sourceforge上找到。在“函数和属性”这个小节下,讨论paramstyle
属性时,你会看到:
参数占位符只能用来插入列的值。它们不能用于SQL的其他部分,比如表名、语句等。
所以,你不能像你示例中那样使用这个模块的execute
方法。
execute
方法的另一个限制是,你在想插入参数化列值的地方需要有%s
占位符。因此,如果你想插入不定数量的值,就需要不定数量的占位符。你可以写一个这样的函数:
def prepareinsert(mydict):
query = """
INSERT INTO {0} ({1}) VALUES ({2});
"""
d = dict(mydict) # don't modify the input dictionary if you want to reuse it
table = d.pop('table')
columns = ','.join(d.keys())
placeholders = ','.join(['%s'] * len(d))
values = d.values()
return (query.format(table, columns, placeholders), values)
这个函数会给你execute
需要的两个元素——至少一个查询,如果查询中有%s
占位符,还需要一个包含所需参数的序列或映射对象。
注意,只要mydict
没有被改变,它会保证以相同的顺序返回键和值(参见:Python字典:keys()和values()的顺序总是一样吗?)
你可以这样使用这个函数:
input = {'table':'favorite_actors', 'columnA':'Brent', 'columnB':'Spiner'}
query, params = prepareinsert(input)
cursor.execute(query, params)
当然,你还需要确保你的输入是正确的。