web-dev-qa-db-fra.com

Exécuter du SQL brut lors de la migration

J'essayais avec n'importe quelle syntaxe et je ne peux pas penser comment puis-je écrire cela correctement:

Schema::table('users', function(Blueprint $table){
    $sql = <<<SQL
        ALTER TABLE 'users' MODIFY 'age' DATETIME
    SQL;
    DB::connection()->getPdo()->exec($sql);
});

également essayé avec

DB::statement('ALTER TABLE \'users\' MODIFY COLUMN DATETIME);

et les guillemets doubles et ainsi de suite. J'obtiens toujours les éléments suivants lorsque j'exécute la migration:

Erreur de syntaxe ou violation d'accès: 1064 Vous avez une erreur dans votre syntaxe SQL; vérifier
le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de '' utilisateurs 'MODIFIER' âge 'DATETIME' à la ligne 1

Oui, j'ai vérifié, MariaDB utilise la syntaxe de MySQL (au moins pour ce cas).

33
Milkncookiez

Utilisez des tiques inverses au lieu de guillemets simples pour échapper aux identifiants dans MySQL:

alter table `users` modify `age` datetime

Dans ce cas particulier, vous pouvez omettre tout échappement:

alter table users modify age datetime
37
potashin

Le problème (comme l'a dit @postashin) était les backticks.

Depuis Laravel 5 (pas sûr de Laravel 4), vous auriez pu faire ceci:

DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');

En fait, vous n'avez même pas eu besoin des tiques arrière car elles n'ont pas besoin de s'échapper. Vous auriez donc pu écrire:

DB::statement('ALTER TABLE users MODIFY age DATETIME');

Vous n'avez pas besoin de cela dans la fermeture non plus si vous exécutez simplement une instruction de base de données.

Cependant, une meilleure approche de ce que vous faites est la suivante:

Schema::table('users', function(Blueprint $table) {
    $table->dateTime('age')->change();
});

Notez que la dernière solution peut parfois générer une erreur en raison d'un bogue dans Doctrine, qui se produit généralement si vous avez une énumération dans la table (et pas seulement la colonne que vous modifiez).

Pour plus d'informations, consultez Migration de la base de données Laravel - Modification de la colonne

30
Yahya Uddin