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

时间:2019-07-09 06:15:21

标签: 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"

它“可以正常”运行,但是不安全(尽管它仅用于内部使用,因此我在这里不关心安全性),但是我也无法将“ 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 Null对象正常工作。理想情况下,是进行一个正确,安全的查询,但这对我来说不是最重要的问题。

1 个答案:

答案 0 :(得分:1)

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

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

更好的是,您可以直接使用dict:

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

无论如何,我首先不鼓励这样的字符串格式。如果您现在已经预先设置了表名和列名,并且不会改变,那么通过硬编码除值之外的所有内容,您可能会拥有一个更具可读性和可靠性的代码。