2015-09-28 129 views
0

我发现如何只用mysql更新mysql数据库中的空变量的唯一方法。在python中的python sql语句优化

我有这样一种说法:

sql = "INSERT INTO `table` VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)\ 
ON DUPLICATE KEY UPDATE Data_block_1_HC1_sec_voltage=IF(VALUES(Data_block_1_HC1_sec_voltage)IS NULL,Data_block_1_HC1_sec_voltage,VALUES(Data_block_1_HC1_sec_voltage)),\ 
`Data_block_1_TC1_1`=IF(VALUES(`Data_block_1_TC1_1`)IS NULL,`Data_block_1_TC1_1`,VALUES(`Data_block_1_TC1_1`)),\ 
`Data_block_1_TC1_2`=IF(VALUES(`Data_block_1_TC1_2`)IS NULL,`Data_block_1_TC1_2`,VALUES(`Data_block_1_TC1_2`)),\ 
`Data_block_1_TCF1_1`=IF(VALUES(`Data_block_1_TCF1_1`)IS NULL,`Data_block_1_TCF1_1`,VALUES(`Data_block_1_TCF1_1`)),\ 
`HC1_HC1_output`=IF(VALUES(`HC1_HC1_output`)IS NULL,`HC1_HC1_output`,VALUES(`HC1_HC1_output`)),\ 
`Data_block_1_HC1_sec_cur`=IF(VALUES(`Data_block_1_HC1_sec_cur`)IS NULL,`Data_block_1_HC1_sec_cur`,VALUES(`Data_block_1_HC1_sec_cur`)),\ 
`Data_block_1_HC1_power`=IF(VALUES(`Data_block_1_HC1_power`)IS NULL,`Data_block_1_HC1_power`,VALUES(`Data_block_1_HC1_power`)),\ 
`HC1_HC1_setpoint`=IF(VALUES(`HC1_HC1_setpoint`)IS NULL,`HC1_HC1_setpoint`,VALUES(`HC1_HC1_setpoint`))\ 
" 

数据块在DB列。主键是日期时间。现在有8列,但我会有更多的变量(更多列)。我不是很擅长Python,但我不喜欢这种说法,因为它的硬编码。我是否可以在for循环或某事中以某种方式做出这个声明,所以它不需要很长时间,我不必手动编写所有变量。

THX对您有所帮助

+0

所以,你到目前为止尝试过什么? – ewcz

+0

没有什么,因为我写我不是很擅长python,我只是不知道我的选择。我认为我可以在for循环中使用像%s = IF(VALUES(%s)IS NULL,%s,VALUES(%s)) - 将每个列表放入列表中,然后加入它。但我仍然不知道是否有更好的解决方案。这就是为什么我问那些可以使用Python比我更好的人 –

回答

1

让我们假设你的列名存储在一个数组cols。然后,为了生成上面的SQL语句的“有趣”内部,你可以做

',\\\n'.join(map(lambda c: r'`%(col)s` = IF(VALUES(`%(col)s`) IS NULL, `%(col)s`, VALUES(`%(col)s`))' % {'col': c}, cols)) 

这里,map生成的cols SQL语句的相应行和join每个元素然后缝合一切融合在一起。

+0

谢谢你,这是我真正想要的。这对我帮助很大。 –