【问题标题】:Codeigniter Migrations + Multiple Tables + One Migration File Per TableCodeigniter 迁移 + 多个表 + 每个表一个迁移文件
【发布时间】:2012-04-12 11:43:50
【问题描述】:

我想开始使用 CI 中内置的 DBForge 和迁移类,但我不确定如何为我的所有表创建迁移。

我的想法是在我的安装程序过程中为以下每个表都有一个迁移文件:advertisements, announcements, config, users, points.. 当用户安装应用程序时,它会自动运行这些迁移文件并创建表。

IE:001_advertisements, 001_announcements, 001_config, 001_users, 001_points

001_map_advertisements

class Migration_map_advertisements extends CI_Migration {

public function up(){
    $this->dbforge->add_field(array(
        'id' => array(
            'type' => 'INT',
            'constraint' => 11,
            'unsigned' => TRUE,
            'auto_increment' => TRUE
        ),
        'youtube_id' => array(
            'type' => 'VARCHAR',
            'constraint' => '255',
        ),
        'status' => array(
            'type' => 'int',
            'constraint' => 11,
            'null' => FALSE,
            'default' => 1
        ),
        'timestamp' => array(
            'type' => 'int',
            'constraint' => 11
        ),
        'type' => array(
            'type' => 'VARCHAR',
            'default' => 'video'
        ),
        'filename' => array(
            'type' => 'VARCHAR',
            'constraint' => '255'
        ),
        'url' => array(
            'type' => 'varchar',
            'constraint' => '255'
        ),
        'description' => array(
            'type' => 'varchar',
            'constraint' => 64
        ),
        'title' => array(
            'type' => 'varchar',
            'constraint' => 64
        )
    ));
    $this->dbforge->create_table('map_advertisements', TRUE);
}

public function down()
{
    $this->dbforge->drop_table('map_advertisements');
}

但是,如果我这样做并尝试运行安全控制器:

class Developer extends ADMIN_Controller {
function __construct(){
    parent::__construct();
} #end constructor function
public function migrate($index){
    $this->load->library('migration');

    if ( !$this->migration->version($index) ){
        show_error($this->migration->error_string());
    }else{
        echo 'migrated';
    }

}
}

我收到一条错误消息,指出有多个 version 1 迁移并且迁移过程失败。在 CI 中还有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: mysql codeigniter migration


    【解决方案1】:

    是的,每个版本只能有一个迁移文件。迁移不是特定于表的,而更像是“我的应用程序从版本 x 到版本 x+1 需要进行哪些架构更改?”

    将所有现有的迁移文件合并为 1,并将其命名为 001_initial_schema.php。然后,在添加新功能时,为该功能创建一个新的架构文件。如果您有一个部署周期(例如每周一次的 SCRUM 冲刺),最好在每次部署时拥有这些迁移文件之一。

    【讨论】:

    • 您能否提供一个示例 sn-p,说明如何在一个文件中创建多个表迁移?我已将迁移代码添加到我的答案中,以供单个表参考。
    • 合并来自多个文件的所有up()down() 方法。这是一个简单的复制/粘贴,但您需要按照应该创建表的顺序放置它们(相反,应该按照在 down() 方法中删除它们的顺序)。
    • 您可以通过重命名文件001_...002_... 等来规避这一切。
    • 是的,但这是更好的路线,我从头开始。我有一个现有的数据库,我将为应用程序的未来安装创建迁移。
    • 将所有与功能相关或与部署相关的架构更新组合在同一个迁移类中。按表拆分是没有意义的。
    【解决方案2】:

    根据http://www.codeigniter.com/user_guide/libraries/migration.html,“版本”迁移的最佳方式是使用 YYYYMMDDHHMMSS 格式。这应该有效地克服所表达的版本控制问题。还建议如果文件名为“201507071208_advertisements.php”,则包含的迁移类应称为“Migration_Advertisements”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-19
      • 2016-02-03
      • 1970-01-01
      • 2019-12-02
      • 2014-12-26
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多