0

我编写了这个简单的脚本来更新 MySQL 中的表。为此,我创建了一个 for 循环并尝试了以下操作(键盘链接):

sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  sOldDate = "2009-"..tostring(i).."-10"
  sNewDate = "2010-09-"..tostring(i)
  sUpdate = string.format( sUpdate, sNewDate, sOldDate )
  print( sUpdate )
end

输出如下:

1
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
2
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
3
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
4
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
5
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
6
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
7
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
8
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
9
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
10
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
11
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000
12
UPDATE `latest`
SET `date` = '2010-09-1'
WHERE `date` = '2009-1-10'
AND `fid` > 50000

如您所见,print(i)打印效果很好,但是 thesOldDatesNewDatehave i 都被视为1。然后我改变了sOldDatesNewDate如下:

sOldDate = string.format("2009-%d-10", i)
sNewDate = string.format("2010-09-%d", i)

而且我仍然得到两个日期的输出:2009-1-102010-09-1如此处所示

这个循环可能有什么问题。我在这样的循环上工作了很长时间,直到今天他们从未让我失望过。

我认为这只是我无法识别的一些愚蠢的错误。任何帮助表示赞赏。

4

2 回答 2

4

如前所述,您需要在循环内重命名 sUpdate 以避免覆盖外部的并破坏 string.format()。然后,您可以在 string.format() 中使用 %02d 将数字零填充到长度至少为两位数:

local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = string.format("2010-%02d-10", i)
  local sNewDate = string.format("2010-09-%02d", i)
  local update = string.format( sUpdate, sNewDate, sOldDate )
  print( update )
end
于 2012-07-19T08:49:13.447 回答
4

是的,问题是你sUpdate每次都在覆盖。

第一次,您将覆盖字符串占位符%s,之后,字符串将不再更改。

尝试重命名内部sUpdate。而且我认为您希望所有变量都为local?

local sUpdate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdate, sNewDate, sOldDate )
  print( sUpdate )
end

编辑:正如你在上面看到的,我保留了你的变量名,但内部sUpdate不会影响外部,因为它是声明的local。Lua 中的所有变量默认都是全局变量,因此最好确保使用声明局部变量和local. 我会选择使用不同的变量名称,例如:

local sUpdateTemplate = [[UPDATE `latest`
SET `date` = '%s'
WHERE `date` = '%s'
AND `fid` > 50000]]

for i = 1, 12 do
  print( i )
  local sOldDate = "2009-"..tostring(i).."-10"
  local sNewDate = "2010-09-"..tostring(i)
  local sUpdate = string.format( sUpdateTemplate, sNewDate, sOldDate )
  print( sUpdate )
end
于 2012-07-19T08:39:57.097 回答