我为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对象正常工作。理想情况下,是进行一个正确,安全的查询,但这对我来说不是最重要的问题。
答案 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)
无论如何,我首先不鼓励这样的字符串格式。如果您现在已经预先设置了表名和列名,并且不会改变,那么通过硬编码除值之外的所有内容,您可能会拥有一个更具可读性和可靠性的代码。