将字典作为参数传递给 mysql.connector

passing dictionary as parameter for mysql.connector

我为 mysql.connector 设置了半工作的、不安全的函数集,可以接受如下形式的数据。它很灵活,因为我可以设计我需要的任何大小的字典。

db_data={
"column01" : 'test',
"column02" : 51,
"column03" : None
}
columns = db_data.keys()
values = db_data.values()
tablename = "mytable"

它"works"很好但是它不安全(虽然它只供内部使用所以我不关心这里的安全性)但我也无法通过"None"(空对象)至 mysql.

unsafe_query = "INSERT INTO {0:s} ({1:s}) VALUES ({2:s})".format(tablename, ', '.join(map(str, columns)), ','.join(map(repr, values)))
cursor.execute(unsafe_query)

我会得到一个错误:

Something went wrong: 1054 (42S22): Unknown column 'None' in 'field list'

根据关于如何正确设计它的建议,我已经尝试过这种方式,但我无法再让字符串格式以相同的方式传递字典,我几乎被困在这里:

safe_query = "INSERT INTO %s (%s) VALUES (%s)"
cursor.execute(safe_query, (tablename, ', '.join(map(repr, columns)), ', '.join(map(repr, values))) )
# cursor.execute(safe_query, (tablename, ', '.join(map(str, columns)), ', '.join(map(str, values))) ) # this won't work either

获取错误:

Something went wrong: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''mytable' ('\'column01\', \'column02\', \'column03\'') VALUES ('\'test\', ' at line 1

也许有人可以建议如何绕过它并让 mysql 空对象工作。理想情况下是进行适当、安全的查询,但这对我来说不是最重要的问题。

您可能希望您的值由驱动程序处理,而其他所有内容都由字符串组成:

query = "INSERT INTO {} ({}) VALUES ({})".format(tablename, ', '.join(columns), ','.join(['%s']*len(values)))
cursor.execute(query, values)

更好的是,你可以直接使用字典:

query = "INSERT INTO {} ({}) VALUES ({})".format(tablename, ', '.join(columns), ','.join(['%({})s'.format(colname) for colname in columns]))
cursor.execute(query, db_data)

无论如何,我一开始就不鼓励这种字符串格式。如果您现在预先指定了表名和列名并且这不会改变,您可能会通过硬编码除值以外的所有内容来获得更具可读性和可靠性的代码。