2013-04-27 47 views
1

非常相似,这个问题MySQL Dynamic Query Statement in PythonMySQL的动态查询语句在Python与字典

但是我所希望做的,而不是两个列表是使用字典

比方说,我有这个词典

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

我想使用sql列作为sql列名和变量名作为变量来存储要插入到mysql表中的值的插入语句来填充mysql数据库。

一种失落,因为我不明白这个声明究竟做了什么,但是从我发布的问题中拉出来,他使用两个列表来做他想做的事情。

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

此外,我想这是我可以添加/删除列到字典

回答

0

您发布之前感的动态,你可能想尝试寻找更具体到你的问题的东西。例如,当我谷歌搜索“python mysqldb插入字典”时,我在第一页找到了一个很好的答案,在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对于返回值有用,但它不能从字典中执行。

+0

谢谢pswaminathan,我会尽力使用它并返回代码中的内容。对于没有做足够广泛的研究感到抱歉,我尝试过搜索,但是对于python来说是如此的新鲜事,我很难完全了解它并确定我在寻找什么。 – lawless 2013-04-29 14:43:50

+0

没问题。只是想指出你可以搜索的东西。没什么大不了的。祝你好运! – pswaminathan 2013-05-03 14:19:21