使用Python dict获取SQL INSERT语句

Dav*_*542 37 python mysql sql

我正在尝试使用a dict来做SQL INSERT.逻辑基本上是:

INSERT INTO table (dict.keys()) VALUES dict.values()
Run Code Online (Sandbox Code Playgroud)

但是,我很难确定正确的语法/流程来执行此操作.这就是我目前拥有的:

# data = {...}
sorted_column_headers_list = []
sorted_column_values_list = []
for k, v in data.items():
    sorted_column_headers_list.append(k)
    sorted_column_values_list.append(v)
sorted_column_headers_string = ', '.join(sorted_column_headers_list)
sorted_column_values_string = ', '.join(sorted_column_values_list)

cursor.execute("""INSERT INTO title (%s) 
            VALUES (%s)""", 
            (sorted_column_headers_string, sorted_column_values_string))
Run Code Online (Sandbox Code Playgroud)

从这里我得到一个SQL异常(我认为与逗号也包含在我拥有的一些值中这一事实相关).做上述事情的正确方法是什么?

小智 57

我认为使用MySQL的评论并不完全.MySQLdb不在列中进行参数替换,只是值(IIUC) - 所以可能更像

placeholders = ', '.join(['%s'] * len(myDict))
columns = ', '.join(myDict.keys())
sql = "INSERT INTO %s ( %s ) VALUES ( %s )" % (table, columns, placeholders)
cursor.execute(sql, myDict.values())
Run Code Online (Sandbox Code Playgroud)

你没有在列上逃脱,所以你可能想先检查它们....

有关更完整的解决方案,请参阅http://mail.python.org/pipermail/tutor/2010-December/080701.html

  • 关于dict有任何订购问题吗? (6认同)
  • 行`cursor.execute(qry,columns,myDict.values())`有一个语法错误.`cursor.execute(qry,myDict.values())`是正确的形式. (4认同)
  • @zs1986 根据 [python 的文档](https://docs.python.org/2/library/stdtypes.html#dictionary-view-objects),字典不应该有排序问题:如果`items() `、`keys()`、`values()`、`iteritems()`、`iterkeys()` 和`itervalues()` 被调用而不会对字典进行干预修改,列表将直接对应。 (2认同)

g.d*_*d.c 20

您想要向查询添加参数占位符.这可能会得到你所需要的:

qmarks = ', '.join('?' * len(myDict))
qry = "Insert Into Table (%s) Values (%s)" % (qmarks, qmarks)
cursor.execute(qry, myDict.keys() + myDict.values())
Run Code Online (Sandbox Code Playgroud)

  • 对于MySQL:`format =','.join(['%s']*len(data))` (10认同)
  • @PatrikIselind - 不正确。请参阅 /sf/ask/58456471/。只要没有任何干预性的变化(上面的情况不可能出现这种情况),它们就会_总是_以相同的顺序返回。 (2认同)
  • 这个字段会出错,因为它会将其检测为字符串,尽管 SQL 将其作为变量 (2认同)

Bla*_*ard 18

这里总是很好的答案,但在Python 3中,你应该写下面的内容:

placeholder = ", ".join(["%s"] * len(dict))
stmt = "insert into `{table}` ({columns}) values ({values});".format(table=table_name, columns=",".join(dict.keys()), values=placeholder)
cur.execute(stmt, list(dict.values()))
Run Code Online (Sandbox Code Playgroud)

不要忘记转换dict.values()为列表,因为在Python 3中,dict.values()返回视图而不是列表.

另外,不要倒入dict.values(),stmt因为它会join通过它从字符串中撕掉引号,这会导致MySQL插入错误.所以你应该总是cur.execute()动态地把它放进去.