在python中建立mysql查询时,最初我使用的是python3样式格式:
db_data={
"column1" : 'value01',
"column2" : 5,
"column3" : None
}
columns = db_data.keys()
values = db_data.values()
query = "INSERT INTO {0:s} ({1:s}) VALUES ({2:s})".format(tablename, ', '.join(map(str, columns)), ','.join(map(repr, values)))
cursor.execute(query)
这是不安全的,容易受到注入的影响,但是我可以轻松地通过一个带有x个元素的字典以column:value的形式传递。 不幸的是,使用这种不安全的方法,我无法通过“无”,并且得到了
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))) )
但是看起来mysql不喜欢这种格式:
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' ('\'column1\', \'column2\', \'column3\'') VALUES ('\'value01\', ' at line 1
我也尝试过将join(map(repr,columns))作为join(map(str,columns))传递,但这没有帮助。
实现它的正确方法是什么,同时又能够像我以前使用python3格式设置样式一样推送不同大小的字典?