Создать базу данных с классом миграции codeigniter - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу интегрировать класс миграции Codeigniter в процесс сборки моего проекта. Могу ли я использовать класс миграции для создания баз данных, или это единственная цель, чтобы обновлять структуру базы данных?

Мой класс миграции выглядит так:

class Migration_base extends CI_Migration {
 public function up()
 {
   $this->dbforge->create_database('my_db');
 }
 public function down()
 {
   $this->dbforge->drop_database('my_db');
 }
}

Когда я запускаю этот код:

class Migrate extends CI_Controller
{
    public function index()
    {
            $this->load->library('migration');

            if ($this->migration->current() === FALSE)
            {
                    show_error($this->migration->error_string());
            }
        }

}

Я получаю это сообщение:

Database error: A Database Error Occurred
        Unable to connect to your database server using the provided settings.
        Filename: path_to_codeigniter/codeigniter/framework/system/database/DB_driver.php
        Line Number: 436

Кажется, база данных уже должна существовать, прежде чем я смогу использовать класс миграции. Я прав, и мне нужно написать оболочку для класса миграции, где я сначала создаю базу данных?

1 Ответ

0 голосов
/ 12 ноября 2018

Ваше подозрение, что для создания базы данных в рамках миграции потребуется обходной путь, похоже на правду. Я не знаю, можно ли это назвать ошибкой или отсутствующей функцией, но она не будет делать это так, как написано.

Большая проблема заключается в том, что _migration_table, создаваемый классом, должен находиться в перенастраиваемой базе данных. Классическая проблема "курица или яйцо".

Другая возможная проблема, которую документация предполагает и не решает, заключается в том, что база данных, которую необходимо перенести, должна быть «загружена».

Я думаю, что следующая версия вашего Migrate контроллера решит обе эти проблемы.

class Migrate extends CI_Controller
{
    public function index()
    {
        if( ! isset($this->db))
        {
            throw new RuntimeException("Must have a database loaded to run a migration");
        }

        // Are we connected to 'my_db' ?
        if( ! $this->db->database !== 'my_db')
        {
            //find out if that db even exists
            $this->load->dbutil();
            if( ! $this->dbutil->database_exists('my_db'))
            {
                // try to create 'my_db'
                $this->load->dbforge();
                if( ! $this->dbforge->create_database('my_db'))
                {
                    throw new RuntimeException("Could not create the database 'my_db");
                }
            }

            // Connection data for 'my_db' must be available 
            // in /config/database.php for this to work.
            if(($db = $this->load->database('my_db', TRUE)) === TRUE)
            {
                $this->db = $db;  //replace the previously loaded database
            }
            else
            {
                throw new RuntimeException("Could not load 'my_db' database");
            }
        }

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

        if($this->migration->current() === FALSE)
        {
            show_error($this->migration->error_string());
        }
    }
}

Пожалуйста, знайте, я не проверял этот код. Там может быть синтаксис, логика или другие ошибки. Надеюсь, это даст вам хорошую стартовую позицию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...