python経由でSQLite3を使っているのだが、直接pythonとは関係が無い話だ。
最後にINSERTしたデータの一部をUPDATEしたかったのだが、何だかうまくいっていない。。。
まったく失敗しているというわけでもないようだが、期待したところが更新されていないので、うまくいっていないのだろう。
やっていたのは、どこかのページで見つけたやりかただ。
UPDATE tbl SET data1=? WHERE rowid=last_insert_rowid()
?のところは、pythonだとexecute()の引数に書けるのだが、まあそこは関係ないので省略しよう。
ともかく、これがうまくいかない。
エラーは出ていないので、SQL文は間違えていないのだろう。
検索すると、last_insert_rowid()でうまくいかないというところも見つかったのだが、まずは根っこを探そう。
sqlite.orgのページだ。
WITHOUT_ROWIDしていないなら使える。
返すのは、rowid of the most recent successful INSERT、だ。
INSERTに成功していなかったら0を返す、とある。
でも、INSERTは何度かしているし、データを見ても列はあるから、INSERTしていないはずはないのだが。。。
と思ったら、読み飛ばしていた。
have ever occurred on the database connection D
接続してから、でよいのかな。
だったら、なんとなく納得だ。
どこかでクローズしたりしていた気がするのだ。
コマンドのsqlite3で見ておこう。
SELECT rowid,* FROM tbl
これで、tblに入っているデータがrowidと一緒に出力される。
そうか、rowidは1から始まるから、last_insert_rowid()が0を返すとどれにも引っかからないのだな。
SELECT rowid,* FROM tbl WHERE rowid=last_insert_rowid()
うん、出てこない。
SELECT rowid,* FROM tbl WHERE rowid=last_insert_rowid()+1
うん、1行目が出てきた。
ということは、やはり0が返ってきていたのだろう。
今回の私は、UPDATE文で使いたいので、たぶんWHRER節でやってやらないといかんだろう。
もっと便利なやり方があるのかもしれんが、知らん。
UPDATE tbl SET data1=? WHERE rowid=(SELECT max(rowid) from tbl)
うむ、これでよさそうだ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。