symfony1.4.6、doctrineで、migrateしつつ開発、のテスト中。思いの外はまりどころが多いので個人的メモ。誤解している、使い方がオカシイなどありましたらご指摘ください。ちなみに、正しい使い始めのための手順はこちらが詳しい。
型にtextだとかdatetimeだとか書いておくとはまる
型にtype: textだとか書いておいても、普通に使う分には使えてしまう。ただ、doctrine:migrateすると、syntax errorが出てしまう。どうも、textとだけ書いておくと、hoge: { type: text } をSQLにするとき、hoge text()と構築してしまってエラーになる模様。string(長さ)と指定しておけばOK。
同様に、datetimeもmigrateを使わないかぎり通るのだけど、migrate使うとエラー。timestampとしておく必要がある。
トランザクション使ってないのでエラー出たら面倒 migrateタスクの中でトランザクション処理を行っていない模様(嘘。ちゃんと書いてあった)。そのせいで、上記のようなエラーがでると中途半端にクエリが通った状態になってしまう。運用データがなければ(開発サーバであれば)、doctrine:drop-dbしてdoctrine:create-dbして、doctrine:migrateすればいいが、そうでない場合は結構注意が必要。つうかトランザクションくらい走らせてください>中の人
お気軽に使えそうで思ったよりはまる。ただ、継続的に開発し続ける手合いにはこれがないと困るので、はまらないように使ってみようと思う。
追記:
sfDoctrineMigrateTaskとMigrateを読んでみると、beginTransactionがちゃんと書いてあった。クエリログを見てみると確かにトランザクションは掛けている。なんでdry-runするだけで問題が起こったのかちょっとわからず。
100716 20:30:38 2 Connect shell@localhost on shell 2 Query SET NAMES utf8 2 Query SET NAMES 'UTF8' 2 Query CREATE TABLE migration_version (version INT) ENGINE = INNODB 2 Query SELECT version FROM migration_version 2 Query START TRANSACTION 2 Query SELECT version FROM migration_version 2 Query CREATE TABLE (略 2 Query ALTER TABLE (略 2 Query CREATE INDEX (略 2 Query commit 2 Query SELECT version FROM migration_version 2 Query UPDATE migration_version SET version = 12 2 Quit
追記:
おそらく、MySQLのautocommitを殺していないからだと推測していて、接続時にまずautocommitをオフにするクエリを投げる方法を調査中。symfonyそのもののソース書き換えちゃうのが早いのだけどそれはちょっとねぇ。
追記:
もっと根本的な話だった。MySQLはCREATE TABLE的なDDLをrollbackできない。なんだそれ。あほかい。テンポラリテーブルこさえるような実装だったりするとgdgdになるってわけで。