1

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

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

假设我有这本字典

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

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

有点迷失,因为我不完全理解这个声明的作用,但是我从我发布的问题中提取了他使用两个列表来做他想做的事情。

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

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

4

1 回答 1

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 对于返回值字典很有用,但它不能从 dict 执行。

于 2013-04-27T17:40:22.263 回答