如何运行 CodeIgniter 迁移?

Posted

技术标签:

【中文标题】如何运行 CodeIgniter 迁移?【英文标题】:How do I run CodeIgniter migrations? 【发布时间】:2012-02-27 13:42:19 【问题描述】:

我知道如何通过http://codeigniter.com/user_guide/libraries/migration.html创建它们

但是一旦我创建了我的迁移文件,我该如何运行它们?

【问题讨论】:

github.com/AimalAzmi/codeigniter-migrations 试试这个,我为此编写了一个库,可以通过 CLI 轻松使用。它可用于创建迁移文件并向后或向前运行迁移。 【参考方案1】:

使用这些页面作为参考:Running via the CLI 和Migration Class 您可以通过以下方式(application/controllers/migrate.php)将对迁移控制器的访问限制为命令行:

<?php  if ( ! defined('BASEPATH')) exit("No direct script access allowed");

class Migrate extends CI_Controller 

  public function __construct()
  
    parent::__construct();

    $this->input->is_cli_request() 
      or exit("Execute via command line: php index.php migrate");

    $this->load->library('migration');
  

  public function index()
  
    if(!$this->migration->latest()) 
    
      show_error($this->migration->error_string());
    
  

然后要执行最新的迁移,请 cd 进入项目目录的根目录并运行:

php index.php migrate

但是当您尝试通过 webserver domain.com/migrate 访问时,您会看到上面脚本中的文本。

【讨论】:

请注意,上述答案仅适用于 CI2。 CI3 安装应将文件保存为 application/controllers/Migrate.php 我试图让上面的示例工作,但是当我从 CLI 访问它时尝试加载迁移库时它失败了。如果我注释掉 is_cli_request 行,它可以在浏览器中完美运行。有什么想法吗? @ViggoV 听起来可能是对is_cli_request() 的 CI 更改,请验证您的 CI 版本并查看调用是否不同。将其注释掉将允许在浏览器中运行迁移,这是应该避免的。 github.com/AimalAzmi/codeigniter-migrations 试试这个,我为此编写了一个库,可以通过 CLI 轻松使用。它可用于创建迁移文件并向后或向前运行迁移。【参考方案2】:

我不确定这是不是正确的做法,但它对我有用。

我创建了一个名为 migrate 的控制器 (controllers/migrate.php)

<?php defined("BASEPATH") or exit("No direct script access allowed");

class Migrate extends CI_Controller

    public function index($version)
        $this->load->library("migration");

      if(!$this->migration->version($version))
          show_error($this->migration->error_string());
         
    

然后我会从浏览器调用这个 url 在migrate 控制器中执行index 动作 例如:http://localhost/index.php/migrate/index/1

【讨论】:

迁移后,我建议您从服务器中删除此控制器,直到下一次迁移。这是一个公共 url,如果您将其保留在服务器中,任何人都可以轻松删除您的表。 我想你只想基于ENVIRONMENT执行【参考方案3】:

您还可以运行某些版本进行向下或向上迁移:

if(!defined('BASEPATH')) exit('No direct script access allowed');
class Migrate extends CI_Controller

    public function __construct()
    
        parent::__construct();
        $this->load->library('migration');
    

     public function version($version)
     
         if($this->input->is_cli_request())
         
            $migration = $this->migration->version($version);
            if(!$migration)
            
                echo $this->migration->error_string();
            
            else
            
                echo 'Migration(s) done'.PHP_EOL;
            
        
        else
        
            show_error('You don\'t have permission for this action');;
        
     
 

对于 CLI,运行此命令 php index.php migrate version 5,其中 5 是迁移版本。如果版本更多的是当前迁移 - 向上迁移,否则 - 向下迁移到输入的版本。

【讨论】:

【参考方案4】:

这是最简单的 Codeigniter 数据库迁移

    将 application/database.php 配置为您的数据库名称设置。

    创建应用程序/配置 mirate.php

    <?php defined("BASEPATH") or exit("No direct script access allowed");
    
    class Migrate extends CI_Controller
    
        public function index()
        
            if (ENVIRONMENT == 'development') 
                $this->load->library('migration');
                if (!$this->migration->current()) 
                    show_error($this->migration->error_string());
                 else 
                    echo "success";
                
             else 
                echo "go away";
            
        
    
    

    在 application\migration.php 中,更改 $config['migration_enabled'] = TRUE;

    在文件夹中打开 CLI 并输入 php index.php migrate

【讨论】:

【参考方案5】:

我想我有最简单的解决方案。 (这是针对 Codeigniter 3.1.11)

上述解决方案建议通过 url 或 cli 进行迁移。

第一个问题是你公开了这个应该在幕后的问题。

第二个问题是如果你在共享主机平台上部署这个项目,你就没有机会通过 cli 运行它。

所以我认为最简单的解决方案是让 codeigniter 为我们完成工作: (假设您已正确完成数据库设置并创建了迁移)

    在 /application/config/migration.php 中创建 $config['migration_enabled'] = TRUE; 像这样定义迁移版本$config['migration_version'] = 20201019123900; 设置$config['migration_auto_latest'] = TRUE; 自动加载或手动加载迁移库(在 /application/config/autoload.php 中定义,如 $autoload['libraries'] = array('migration'); 在控制器构造函数中加载,如 $this-&gt;load-&gt;library('migration');) 然后运行您的应用程序(通过浏览器打开)

塔塔!你去吧。如果您的表已正确创建,您可以检查您的数据库。

开发环境保留这样的设置应该没问题。

但是对于生产环境,我们应该重置$config['migration_enabled'] = FALSE;,正如评论部分指出的那样。

这个解决方案可能会受到批评,因为每次运行应用程序或控制器时都会加载迁移库,但我没有说它是最好的解决方案,我说它是最简单的解决方案。 p>

【讨论】:

【参考方案6】:

在 application\migration.php 中,更改 $config['migration_enabled'] = TRUE; .this is the actual CI migration.php file path right

你说的是application\migration.php,实际是application\config\migration.php。

【讨论】:

【参考方案7】:
<?php defined("BASEPATH") or exit("No direct script access allowed");

class Migrate extends CI_Controller

    public function index()
    
        if (ENVIRONMENT == 'development') 
            $this->load->library('migration');
            if (!$this->migration->current()) 
                show_error($this->migration->error_string());
             else 
                echo "success";
            
         else 
            echo "go away";
        
    enter code here

【讨论】:

以上是关于如何运行 CodeIgniter 迁移?的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter,从不直接调用视图,有人可以解释一下

codeigniter 4 设置会话变量 $session = \Config\Services::session();全球

将项目从PC迁移到其他PC后,错误在codeigniter中不推荐使用each()函数[重复]

要使用codeigniter框架还是标准的php? [关闭]

如何在 localhost 上设置 CodeIgniter 站点?

出现致命错误 CodeIgniter CI_Controller not found