使用Python字典创建通用MySQL插入语句

1 投票
1 回答
1470 浏览
提问于 2025-04-18 01:45

我想写一个通用的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)

当然,你还需要确保你的输入是正确的。

撰写回答