我试图创建一个快速的导入脚本,我发现了一些很奇怪的东西。
我做以下
print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)
我希望结果是正常的,结果看起来很难
,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8
任何人都可以解释为什么Timestamp值在前面而不是后面?
答案 0 :(得分:1)
您的字符串值包含\r
回车符。该字符指示打印位置到行的开头。您可以通过打印repr()
function的输出来验证这一点,Change style and/or conditional style of the selection button的输出对任何不是可打印ASCII字符的字符使用Python转义序列。
从TimeStamp
值中删除字符;您可以使用str.replace()
来执行此操作,例如:
TimeStamp = TimeStamp.replace('\r', '')
演示:
>>> value, TimeStamp = 41, '8\r,15-08-2015 20:28:47'
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)
,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8
>>> TimeStamp = TimeStamp.replace('\r', '')
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp)
insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8,15-08-2015 20:28:47)
请注意,您的值仍包含逗号!您可能在早些时候从某个文件或其他来源解析此数据时出错了。
另外,使用字符串格式化将数据插入到SQL语句中不是一个好主意。请改用SQL参数。这取决于您的数据库适配器,这意味着您在查询中使用?
或%s
作为占位符,然后数据库适配器将正确引用值以防止SQL注入攻击并允许在查询处理中进行优化:
cursor.execute(
"insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,?,?)",
(value, TimeStamp))
有关详细信息,请参阅数据库适配器文档。