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)は問題なく印刷されていますが、sOldDateとの両方が1sNewDateとして扱われています。次に、とを次のように変更しました。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の名前を変更して、外側のsUpdateを上書きしたり、string.format()を壊したりしないようにする必要があります。次に、string.format()で%02dを使用して、数値を少なくとも2桁の長さにゼロパディングできます。

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 に答える