使用pythons字典';s创建一个通用的MySQL插入字符串

使用pythons字典';s创建一个通用的MySQL插入字符串,python,mysql,sql,dictionary,insert,Python,Mysql,Sql,Dictionary,Insert,我想编写一个通用的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

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


任何人都有一个干净的方法来解决这个问题,或者我可以做一些阅读来解决这个问题吗?

MySQLdb模块的文档就在这里。在“功能和属性”子标题下,在讨论
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)
这为您提供了
执行
所需的两个元素-至少是一个查询,如果查询有
%s
占位符,则是一个包含所需参数的序列或映射对象

请注意,
mydict
保证以相同的顺序返回键和值,只要在此期间不进行更改(请参阅:)

您可以按以下方式使用此函数:

input = {'table':'favorite_actors', 'columnA':'Brent', 'columnB':'Spiner'}
query, params = prepareinsert(input)
cursor.execute(query, params)

当然,您仍然需要知道您的输入是正确的。

您知道列名吗?是的,如果表不存在,我可以编写一些代码来创建表,但这不是我在这里得到的,因此我不想使问题复杂化。为了举例说明,让我们假设数据库已全部设置,列名为'dataA和'dataB',我也希望能够传入列名。因此,假设下一个dict只有'dataC'和'dataD',我希望它仍然有效。(假设dataC和D也已经存在)好的,我知道您希望以编程方式构建该查询?到目前为止,您尝试了什么?您在上面看到的几种变体。我很难确定传递所有变量的正确语法,以便SQL接受它。我可以做这根绳子,但我尝试的东西似乎都不管用。谢谢。这给我树立了正确的思路。只需使用函数一点一点地构建字符串,直到得到正确的查询。我可以完全控制我的输入,这样我也可以对这些输入进行排序。@user3482234它可以满足您的要求,但我不能断言这是否是您所做的任何事情的最佳方法目前我只需要它来工作。我可以担心以后会不会想出聪明的方法来优化代码。