Python中的MySQL动态查询语句与字典

时间:2013-04-27 15:39:36

标签: mysql dynamic insert

非常类似于这个问题MySQL Dynamic Query Statement in Python

然而,我想要做的不是两个列表,而是使用字典

假设我有这本词典

instance_insert = {
#    sql column      variable value
    'instance_id'   : 'instnace.id',
    'customer_id'   : 'customer.id',
    'os'            : 'instance.platform',
}

我想用一个insert语句填充一个mysql数据库,使用sql列作为sql列名,使用变量名作为变量,用于保存要插入mysql表的值。

有点丢失,因为我不完全理解这句话的作用,但是从我发布的问题中被拉出来,他在那里使用两个列表来做他想做的事情。

sql = "INSERT INTO instance_info_test VALUES (%s);" % ', '.join('?' for _ in instance_insert)
cur.execute (sql, instance_insert)

此外,我希望它是动态的,我可以在字典中添加/删除列

1 个答案:

答案 0 :(得分:0)

发布之前,您可能想尝试搜索更具体问题的内容。例如,当我用Google搜索“python mysqldb insert dictionary”时,我在第一页http://mail.python.org/pipermail/tutor/2010-December/080701.html找到了一个很好的答案。相关部分:

  

这是我在尝试制作通用版本时想出的   上述内容:

def add_row(cursor, tablename, rowdict):
    # XXX tablename not sanitized
    # XXX test for allowed keys is case-sensitive

    # filter out keys that are not column names
    cursor.execute("describe %s" % tablename)
    allowed_keys = set(row[0] for row in cursor.fetchall())
    keys = allowed_keys.intersection(rowdict)

    if len(rowdict) > len(keys):
        unknown_keys = set(rowdict) - allowed_keys
        print >> sys.stderr, "skipping keys:", ", ".join(unknown_keys)

    columns = ", ".join(keys)
    values_template = ", ".join(["%s"] * len(keys))

    sql = "insert into %s (%s) values (%s)" % (
        tablename, columns, values_template)
    values = tuple(rowdict[key] for key in keys)
    cursor.execute(sql, values)

filename = ...
tablename = ...
db = MySQLdb.connect(...)
cursor = db.cursor()
with open(filename) as instream:
    row = json.load(instream)
add_row(cursor, tablename, row)
     

彼得

如果您知道您的输入始终有效(表名有效,表中存在列),并且您没有像示例那样从JSON文件导入,则可以简化此功能。但它会完成你想要完成的任务。虽然最初看起来像DictCursor会有所帮助,但看起来DictCursor对于返回值的字典很有用,但它无法从字典执行。