50 votes

Comment exécuter les migrations de CodeIgniter ?

Je sais comment les créer via http://codeigniter.com/user_guide/libraries/migration.html

Mais une fois que j'ai créé mes fichiers de migration, comment les exécuter ?

0 votes

github.com/AimalAzmi/codeigniter-migrations Essayez ceci, j'ai écrit une bibliothèque pour cela qui peut être utilisée très facilement via le CLI. Elle peut être utilisée pour créer des fichiers de migration et exécuter des migrations en arrière ou en avant.

66voto

twmulloy Points 1055

Utiliser ces pages comme références : Exécution via le CLI et Classe de migration vous pouvez restreindre l'accès à votre contrôleur de migration à la ligne de commande avec quelque chose de ce genre (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());
    }
  }
}

puis pour exécuter votre dernière migration, cd dans la racine de votre répertoire de projet et exécuter :

php index.php migrate

mais lorsque vous essayez d'accéder via le serveur web domain.com/migrate, vous verrez le texte dans le script ci-dessus.

3 votes

Notez que la réponse ci-dessus ne fonctionne qu'avec CI2. Les installations CI3 doivent enregistrer le fichier sous le nom de application/controllers/Migrate.php.

0 votes

J'essaie de faire fonctionner l'exemple ci-dessus, mais il échoue lorsqu'il tente de charger la bibliothèque de migration, lorsque j'y accède depuis le CLI. Si je commente la ligne is_cli_request, il fonctionne parfaitement dans le navigateur. Avez-vous une idée ?

0 votes

@ViggoV, on dirait qu'il s'agit potentiellement d'un changement de l'IC à la is_cli_request() Vérifiez votre version de CI et voyez si l'appel est différent. Le commenter permettrait alors d'exécuter les migrations dans le navigateur, ce qui est à éviter.

33voto

RSK Points 6428

Je ne suis pas sûr que ce soit la bonne façon de faire, mais ça marche pour moi.

J'ai créé un contrôleur nommé 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());
      }   
    }
}

Puis, à partir du navigateur, j'appellerai cette url pour l'exécuter. index l'action en migrate contrôleur
Eg : http://localhost/index.php/migrate/index/1

2 votes

Une fois la migration terminée, je vous recommande de retirer ce contrôleur du serveur jusqu'à la prochaine migration, car il s'agit d'une url publique et si vous la conservez sur le serveur, n'importe qui peut facilement supprimer vos tables.

12 votes

Je pense que vous ne voudriez exécuter que sur la base de ENVIRONMENT

6voto

joni jones Points 1082

Vous pouvez également exécuter certaines versions pour les migrations descendantes ou ascendantes :

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');;
        }
     }
 }

Pour le CLI, exécutez cette commande php index.php migrate version 55 est la version de la migration. Si la version est supérieure à la migration actuelle - migration vers le haut, sinon - vers le bas jusqu'à la version entrée.

1voto

Bidyashish Kumar Points 158

C'est la plus simple des migrations de bases de données de Codeigniter.

  1. Configurez application/database.php en fonction de vos paramètres de nom de base de données.

  2. Créer application/config 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";
            }
        }
    }
  3. En application \migration.php le changement $config['migration_enabled'] = TRUE; .

  4. Ouvrez le CLI dans le dossier et tapez php index.php migrate

1voto

Adem Tepe Points 192

Je pense avoir la solution la plus simple ici. (Ceci est pour Codeigniter 3.1.11)

Les solutions ci-dessus suggèrent de faire la migration via url ou cli.

Le problème avec la première est que vous rendez publique cette question qui devrait être cachée dans les coulisses.

Le problème avec la deuxième option est que si vous déployez ce projet sur une plateforme d'hébergement partagé, vous n'avez pas la possibilité de l'exécuter via le client.

La solution la plus simple à mon avis est de laisser Codeigniter faire le travail pour nous : (en supposant que vous avez effectué les réglages de votre base de données et créé les migrations correctement)

  1. faire $config['migration_enabled'] = TRUE; dans /application/config/migration.php
  2. définir la version de migration $config['migration_version'] = 20201019123900; comme ceci
  3. set $config['migration_auto_latest'] = TRUE;
  4. chargement automatique ou manuel de la bibliothèque de migration (à définir dans /application/config/autoload.php comme suit $autoload['libraries'] = array('migration'); ou le charger dans le constructeur du contrôleur comme $this->load->library('migration'); )
  5. et lancez simplement votre application (ouvrez-la via un navigateur)

Tata ! Voilà. Vous pouvez vérifier votre base de données si vos tables ont été créées correctement.

Il devrait être possible de laisser les paramètres tels quels dans l'environnement de développement.

MAIS pour un environnement de production, nous devons réinitialiser $config['migration_enabled'] = FALSE; comme cela a été souligné dans la section des commentaires.

Cette solution peut être critiquée car la bibliothèque de migration est chargée à chaque fois que l'application ou le contrôleur est exécuté mais je n'ai pas dit que c'était la meilleure solution, j'ai dit que c'était la solution la plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X