我已经开始研究CodeIgniter迁移,以提高我新工作的开发标准。
但是,由于某种原因,我无法在数据库中创建任何表。
迁移代码上方:
<php
defined('BASEPATH') OR exit('No direct script access allowed');
class Migration_Create_users_table extends CI_Migration {
public function __construct()
{
parent::__construct();
$this->load->dbforge();
}
public function up()
{
$fields = array(
'user_id' => array(
'type' => 'INT',
'constraint' => 11,
'unique' => TRUE,
'null' => FALSE,
'auto_increment' => TRUE
),
'user_name' => array(
'type' => 'VARCHAR',
'constraint' => '255',
'null' => FALSE,
),
'user_email' => array(
'type' => 'VARCHAR',
'constraint' => '255',
'null' => FALSE,
),
'user_password' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'user_status' => array(
'type' => 'INT',
'constraint' => 1,
'default' => 0
),
'user_permissions' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'device_token' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'user_level' => array(
'type' => 'INT',
'constraint' => 3,
'default' => '=9'
),
'user_photo' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'device_snid' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'user_recovery_token' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'client' => array(
'type' => 'INT',
'constraint' => 11,
'null' => FALSE,
'default' => 0
),
'latitude' => array(
'type' => 'VARCHAR',
'constraint' => '255',
),
'longitude' => array(
'type' => 'VARCHAR',
'constraint' => '255',
)
);
$this->dbforge->add_field($fields);
$this->dbforge->add_key('user_id', TRUE);
$attributes = array('ENGINE' => 'InnoDB');
try{
$this->dbforge->create_table('users',TRUE,$attributes);
echo '<pre>Table created</pre>';
} catch(Exception $e ){
echo '<pre>Error creating table.</pre>';
d($e);
}
$this->db->query(" INSERT INTO `users` VALUES (1, 'SYSTEM', 'NOUSERNAME', '111', 0, NULL, NULL, NULL, -9, NULL, NULL, NULL, 1, NULL, NULL)");
}
public function down()
{
$this->dbforge->drop_table('users',TRUE);
}
}
迁移文件名:/aplication/migrations/20181129120800_Create_users_table.php
运行迁移的控制器方法:
public function do_migration($version = NULL)
{
$this->load->library('migration');
if(isset($version) && ($this->migration->version($version) === FALSE))
{
show_error($this->migration->error_string());
}
elseif(is_null($version) && $this->migration->latest() === FALSE)
{
show_error($this->migration->error_string());
}
else
{
echo 'The migration has concluded successfully.';
}
}
CodeIgniter创建"migrations"表,并按预期将"version"设置为文件名的时间戳。
"用户"表尚未创建。将打印调试消息"table created"。
如果我测试方法$this->dbforge->create_table('users',TRUE,$attributes(则返回false。
尝试调试并尝试/捕获错误,但唯一的结果是bool(false(。
如果我创建了任何表并选择了其中的数据,CI会按预期返回它,因为DB连接正常。
编辑
发现问题:在字段中,user_level上有一个拼写错误,默认值设置为"=9"(无效整数(,而它本应为"-9"。
问题是试图捕获异常,因为dbforge
没有抛出任何异常。您应该恢复到良好的旧if
条件。
if($this->dbforge->create_table('users',TRUE,$attributes) === FALSE)
{
echo '<pre>Error creating table.</pre>';
return;
}
echo '<pre>Table created</pre>';
$res = $this->db->query(" INSERT INTO `users` VALUES (1, 'SYSTEM', 'NOUSERNAME', '111', 0, NULL, NULL, NULL, -9, NULL, NULL, NULL, 1, NULL, NULL)");
echo $res ? '<pre>Insert Succeeded</pre>' : '<pre>Insert Failed</pre>';
与您的问题无关,但您不需要Migration_Create_users_table
中的__construct
方法。dbforge
库由父类CI_Migration
加载。没有理由覆盖CI_Migration::__construct
,如果您确实有理由,那么调用parent::__construct($config);
将是绝对必要的。(哦,扩展类需要在其构造函数中接受$config
参数。(
如果最后一段不清楚(是的,我漫谈了一下(,请从Migration_Create_users_table
中删除构造函数。