たぶんこれに興味のある人は日本全国に10人くらいしかいないと思いますが、WordPressを PostgreSQLで使うドライバ、pg4wpのその後です。
プラグインを入れるたびに新たなエラーが発生して、その都度、いろいろと手を入れています。
今回は、Contact Form 7を入れたらエラーになりました。Contact Form 7が auto_increment付きのテーブルをクリエイトしようとしてエラーになりました。WordPressの標準って主キーにオートインクリメントを使ってないのですかね。それはそれでびっくりです。

if(stripos($sql, 'CREATE TABLE') === 0) {
  $sql = str_ireplace('CREATE TABLE IF NOT EXISTS', 'CREATE TABLE', $sql);

  $a   = preg_split("/(CREATE TABLE | \()/", $sql);
  $tbl = $a[1];

  $sql = preg_replace("/DEFAULT CHARACTER SET .+;/", ";", $sql);
  $sql = preg_replace("/,\s*PRIMARY KEY\s\(.+?\)/i", "", $sql);
  $sql = preg_replace("/text\s+NOT\s+NULL/i", "text default ''", $sql);
  if (stripos($sql, 'auto_increment')) {
    $s = "";
    $a = explode("\n", $sql);
    foreach($a as $v) {
      if (stripos($v, 'auto_increment')) {
        $b = explode(" ", trim($v));
        $key = $b[0];
        $v = $key." integer DEFAULT nextval('".$tbl."_seq'),\r\n";
      }
      $s .= $v;
    }
    $sql = $s;
    $sql = "CREATE SEQUENCE ".$tbl."_seq; ".$sql."; CREATE UNIQUE INDEX ".$tbl."_".$key."_key on ".$tbl." (".$key.");";
  }
}

相変わらず力技です。(ここは笑うところか?)
まず、PostgreSQLには “IF NOT EXISTS”がないのでこれを取っ払って(テーブルがすでにあったらエラーになるので、なかったら実行はなくても可)、”PRIMARY KEY(key)”という指定もないみたいなので、これも取っちゃって、あと、これがクリビツテンギョウなんですけど、MySQLは text NOT NULL属性で値を指定しない(INSERT文に含めない)と、空文字を勝手に入れてくれるのに対して、PostgreSQLはエラーになっちゃうんですね。
これは NOT NULL属性をつけてる主旨からいって、PostgreSQLを支持したいです。でも、INSERT文でエラーになるのは仕方ないので、text NOT NULLは、text default “”にして、NOT NULLを外しちゃいました。
 
あと、面倒なところが、auto_incrementの取扱い。そのまま、SERIALにしちゃえばいいようなものなんですけど、そうすると、シーケンシャル・テーブルの名前が、table名_カラム名_seqという名前になって、wp_optionsなんかで使っている table名_seqルールと合わなくなってしまうこと。
で、SERIALが使えなくて、いちいち、CREATE SEQUENCE、CREATE UNIQUE INDEXみたいなことをやってるわけです。(きっとどっかにもっといい方法があるはずだ)
 
参考:PostgreSQL 日本語ドキュメントはよくできています。

5 返信

コメントはクローズされています。