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になるってわけで。

Something to say?