如何在sql查询中正确使用字典?我应该预定义sql变量以防止sql注入吗?e、 我在python中尝试用dictionary更新表时遇到了一个错误,但是query在纯sql中使用预定义的变量和值时工作得非常好。 _mysql_connector.MySQLInterfaceError: Incorrect datetime value: '1' for column 'colF' at row 1
我的字典
{'ID': 1, 'colA': 'valA1', 'colB': 'valB1', 'colC': 'valC1',
'colD': 'valD1', 'colE': 'valE1', 'colF': datetime.datetime(2017, 12, 23, 0, 0),
'colG': datetime.datetime(2018,
7, 11, 0, 0), 'colH': datetime.datetime(2018, 9, 1, 0, 0)}
sql语句
UPDATE table1
SET
colA = CASE \
WHEN %(valA1)s IS NOT NULL THEN %(valA1)s
END,\
colB = CASE \
WHEN %(valB1)s IS NOT NULL THEN %(valB1)s
END,\
colC = CASE \
WHEN %(valC1)s IS NOT NULL THEN %(valC1)s
END,\
colD = CASE \
WHEN %(valD1)s IS NOT NULL THEN %(valD1)s
END,\
colE = CASE \
WHEN %(valE1)s IS NOT NULL THEN %(valE1)s
END,\
colF = CASE\
WHEN %(valF)s IS NOT NULL THEN %(valF)s
END,\
colG = CASE\
WHEN %(valF1)s IS NOT NULL THEN %(valF1)s
END,\
colH = CASE\
WHEN %(valH1)s IS NOT NULL THEN %(valH1)s
END\
WHERE %(ID)s = Id """
格式化查询字符串时
colF1 = CASE
WHEN 2018-07-11 00:00:00 IS NOT NULL THEN 2018-07-11 00:00:00
END,
colH1 = CASE
WHEN 2018-09-01 00:00:00 IS NOT NULL THEN 2018-09-01 00:00:00
END
WHERE Id = 1
还有另一个问题 when value is not null
. 我想语法是错的。
1条答案
按热度按时间z0qdvdin1#
尝试参数化查询时出现了几个问题:
如mysqldb docs所述,参数占位符中不能使用列或表标识符。此类占位符仅用于文字值。另外,考虑多行的三引号字符串以避免
\
换行符:要使用命名占位符方法,字典键必须与占位符名称匹配。目前,您需要反转字典中的大多数键/值顺序,而您只需要正确地为
ID
. 但是,如上#1所述,删除所有列标识符:大多数数据库(包括mysql)中的日期时间必须采用字符串形式
YYYY-MM-DD HH:MM:SS
. mysql引擎无法执行python的datetime()
物体。但是,某些dbiapi可能能够转换此对象类型。