CodeIgniterでsqlite2系を使うと必ずハマるであろう2つのこと

CodeIgniterでsqlite2系を使うと必ずハマるであろう2つのこと
CodeIgniter徹底入門

仕事でちっちゃいプログラムを作ることになったのでいい機会だからCodeIgniterでやろうと思って存外はまったのでメモメモ
sqliteを使ったのがほぼほぼ原因なんだけどね・・・DB使えないって言われたから仕方がない。。。。

最終的にはこれで動くように

~~~
$this->load->database();

if (!$this->db->table_exists(‘table_name’)) {
$this->load->dbforge();

$fields = array(
‘id’ => array(
‘type’ => ‘INTEGER’,
‘auto_increment’ => TRUE
),
‘create_date’ => array(
‘type’ => ‘DATETIME’,
‘NULL’ => false
),
);

$this->dbforge->add_field($fields);
$this->dbforge->create_table(‘table_name’, true);
}
~~~

ハマった点 1

~~~
‘auto_increment’ => TRUE
~~~

これを書くと必ずエラーになる

sqliteははじめて使ったのでauto_incrementってものがそもそもないのかな〜と調べてたらこんな記事を見つけました

PHP のマニュアルの sqlite_last_insert_rowid の項目を見ていたら
Tip: You can create auto-increment fields in SQLite by declaring them as INTEGER PRIMARY KEY in your table schema.
つまり,SQLite で auto-increment なフィールドを作りたければ,
INTEGER PRIMARY KEY
を指定してあげればいいらしい.

cl.pocari.org – SQLite で auto-increment なフィールドを作成する方法

system/database/drivers/sqlite/sqlite_forge.php を見てみる

~~~
if (array_key_exists(‘AUTO_INCREMENT’, $attributes) && $attributes[‘AUTO_INCREMENT’] === TRUE)
{
$sql .= ‘ AUTO_INCREMENT’;
}
~~~

そりゃだめだよね、ってことで面倒なのでここを書き換えてしまう

~~~
if (array_key_exists(‘AUTO_INCREMENT’, $attributes) && $attributes[‘AUTO_INCREMENT’] === TRUE)
{
$sql .= ‘ PRIMARY KEY’;
}
~~~

これで無事にAUTO_INCREMENTなカラムを作ることが出来た

ハマった点 2

~~~
$this->dbforge->create_table(‘table_name’, true);
~~~

第二引数をtrueにすると”IF NOT EXISTS” を定義に追加します。とあるがこれが効かない
参考:データベースフォージクラス : CodeIgniter ユーザガイド 日本語版

system/database/drivers/sqlite/sqlite_forge.php を見るとこんな感じ

~~~
function _create_table($table, $fields, $primary_keys, $keys, $if_not_exists)
{
$sql = ‘CREATE TABLE ‘;

// IF NOT EXISTS added to SQLite in 3.3.0
if ($if_not_exists === TRUE && version_compare($this->db->_version(), ‘3.3.0’, ‘>=’) === TRUE)
{
$sql .= ‘IF NOT EXISTS ‘;
}
~~~

sqlite3.3.0以上だけだってさ・・・
という訳でこっちを使うことにする
内部的にやってくれればいいのに。。

~~~
if (!$this->db->table_exists(‘table_name’)) {
~~~

参考:テーブルの情報 : CodeIgniter ユーザガイド 日本語版

ちなみにこれを見つけるのにも結構時間が必要だったけど、きっとあるだろうと思って探してたから見つけられた

バージョン情報

CodeIgniter V 2.0.3
sqlite 2.8 (MAMP標準)