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

Python 将字典作为mysql.connector的参数传递,python,mysql,python-3.x,mysql-python,mysql-connector,Python,Mysql,Python 3.x,Mysql Python,Mysql Connector,我为mysql.connector提供了一组半工作的、不安全的函数,它们可以接受以下格式的数据。它是灵活的,因为我可以设计任何大小的字典我需要 db_data={ "column01" : 'test', "column02" : 51, "column03" : None } columns = db_data.keys() values = db_data.values() tablename = "mytable" 它“工作”很好,但不安全(虽然它只是内部使用,所以我不关心这里的安全性)

我为mysql.connector提供了一组半工作的、不安全的函数,它们可以接受以下格式的数据。它是灵活的,因为我可以设计任何大小的字典我需要

db_data={
"column01" : 'test',
"column02" : 51,
"column03" : None
}
columns = db_data.keys()
values = db_data.values()
tablename = "mytable"
它“工作”很好,但不安全(虽然它只是内部使用,所以我不关心这里的安全性),但我也无法将“无”(Null对象)传递给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(表名,“,”.join(列),“,”.join(['%s']*len(值)))
cursor.execute(查询、值)
更好的是,您可以直接使用dict:

query=“INSERT INTO{}({})VALUES({})”.format(表名,,'.join(列),,'.join(['%({})s'.format(列中colname的colname)))
cursor.execute(查询、数据库数据)

无论如何,我不鼓励这样的字符串格式放在首位。如果您现在预先设置了表名和列名,而这不会改变,那么通过对除值以外的所有内容进行硬编码,您可能会获得更可读、更可靠的代码。

谢谢josoler!第二个建议有效,但第一个是在“%s,%s,%s”附近使用的“正确语法”错误。可能是因为“无”未计算在内???@tmdag
None
也应计算在内。我不知道我遗漏了什么,也许你的驱动程序根本不接受值作为列表,它只能接受dict。您使用的是什么驱动程序?很好,必须将值转换为元组(colvals.get(“values”))。谢谢