Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run raw SQL in migration

I was trying with whatever syntax and can't think how can I write this correctly:

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

also tried with

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

and double quotation marks and so on. I always get the following when I run the migration:

Syntax error or access violation: 1064 You have an error in your SQL syntax; check
the manual that corresponds to your MariaDB server version for the right syntax to use near ''users' MODIFY 'age' DATETIME' at line 1

Yes, I have checked, MariaDB uses MySQL's syntax (at least for this case).

like image 563
Milkncookiez Avatar asked Feb 28 '15 21:02

Milkncookiez


People also ask

How do I run a raw SQL query using DbContext?

From the DbContext 's database object, create the Db command. Then, assign all the required parameters to the command object like the SQL, Command Type, SQL parameters, use existing DB transition, and optional command timeout to the command. Finally, calling ExecuteNonQuery() to execute the raw SQL query.

What command do we use in Django to see raw SQL of the migration?

Use the sqlmigrate command from manage.py . will display the SQL statements for a specific migration of the app.


1 Answers

The issue (as @postashin said) was the backticks.

As of Laravel 5 (not sure about Laravel 4), you could have done this:

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

In fact you didn't even need the back ticks as they don't need escaping. So you could have just written:

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

You do not need this in the closure either if you are just executing a database statement.

However a better approach to what you are doing is as follows:

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

Note the last solution can sometimes raise an error due to a bug in Doctrine, which usually occurs if you have an enum in the table (not just the column you are changing).

For more information, see Laravel Database Migration - Modifying Column

like image 139
Yahya Uddin Avatar answered Sep 29 '22 03:09

Yahya Uddin