多数の似たようなSQLを実行したい場合pythonでSQLを出力するといい

多くの似たようなSQLを発行したい場合、例えばプログラムのfor文で回せば処理できるような場合どうすればいいか。一般にSQLはfor文はないから、pythonなどでスクリプトを書くのもいいかもしれない。がスクリプトでDBを開いてとか書くのが面倒。そこでpythonでSQLだけを出力して、それを実行してしまえばいい。

jupyter

こういうときのちょっとしたpythonスクリプトを書くにはjupyterが便利。
まずは1個のSQLをpythonのprintで出力してみる

次にfor文で回す。SQLはformatで置換する。

文字列中の{0:03}はformat引数の0番目の値を3桁で0で埋めることを指定している。これを実行すると以下のようなSQLが得られる。

あとはこれはphpMyAdminにコピペしたり、mysqlに直接流し込んでもいいかもしれない。DBの変更は間違うと大変なのでよくチェックしてから行おう。

MySQLのデータベースが派手に壊れた場合の修復覚書

ここではデータベースが派手に壊れた場合の話。ハードディスクが壊れたり、自分の場合はVMWAREで保存状態にしたまま、VirtualBoxで開いて操作したあとに、保存していたVMWAREで起動してしまったためハードディスクが派手に壊れてしまって普通のrepairでは直らなかった。

MySQLのデータにはMyISAM方式とINNODB方式があってここではMYISAMの場合、こっちのほうが修復が効きやすいらしい。

当然だがバックアップはとっておく。

どのように壊れたのかの記録

ユーザデータベースや特権データが壊れていると起動もできないので、以下で起動できるか確かめる。

このオプションはログインをスキップするので、特権データが壊れていても動くと思われる。

起動もしない場合

起動もしない場合は直接ファイルを触って直す。今回はMYISAM形式のファイルなので、myisamchkをつかう。MYISAMかどうかは、ファイルの拡張子がMYDやMYIならこの形式で、ibdの場合はINNODB。

以下の順番で試す。

これで直ればいいのだが、直らない場合はMYIを作り直す。MYDが実際のデータが入っているのでこのファイルがサイズが0だったり存在しない場合は復旧は無理だと思われる。

上記のmysqld –skip-grant-tablesでも起動できない場合は、すべてを初期化してから、MYDを復活するしかないが、ここではmysqldは動くものとする。

ここからmysqlでMYIを空にしてから、保存してあるMYDをもとに戻してから、復旧をすることになる。

テーブルを空にする

これで空の正常のMYIができてサイズ0のMYDができるので、保存してあるMYDを上書きコピーしてから上記のmyisanchkで復旧する。

MySQLのdatetimeに0000-00-00 00:00:00を設定できない

wordpressの昔のデータベースのデータスキームでdatetimeのデフォルト値がユーザ設定の’0000-00-00 00:00:00’になっていたのだが、MySQLの新しいバージョンではこの値は無効になったらしく、データの操作がうまくできなくなったので、この値を’1970-01-01 08:00:00’に変える。

sqlで以下を実行、post_dateは対象のコラム

この方法以外にも、sql_modeを設定したり、他の方法もあるようだがスルー