source

마이그레이션 시 원시 SQL 실행

gigabyte 2022. 9. 11. 17:26
반응형

마이그레이션 시 원시 SQL 실행

어떤 구문을 사용해도 올바르게 쓸 수 없습니다.

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

로도 시도되었다

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

큰따옴표 등입니다.마이그레이션을 실행하면 항상 다음과 같은 메시지가 나타납니다.

구문 오류 또는 액세스 위반: 1064 SQL 구문에 오류가 있습니다.확인해 주세요.
MariaDB 서버 버전에 해당하는 설명서에서 "users" MODIFY 'age' DATETIME 근처의 올바른 구문을 사용합니다.

네, 확인했습니다.MariaDB는 MySQL 구문을 사용합니다(적어도 이 경우).

(@postashin이 말한 것처럼) 문제는 백틱이었습니다.

Laravel 5(Laravel 4에 대해서는 확실하지 않음)에서는 다음과 같이 할 수 있습니다.

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

사실 등진드기는 탈출할 필요가 없기 때문에 필요조차 없었습니다.그러니까 이렇게 쓰면 되는 거구나

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

데이터베이스 문만 실행하는 경우에도 종료 시 이 기능이 필요하지 않습니다.

그러나 현재 수행 중인 작업에 대한 더 나은 접근 방식은 다음과 같습니다.

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

마지막 솔루션은 보통 테이블에 열거형이 있는 경우(변경 중인 열뿐만 아니라) 발생하는 Acrin의 버그로 인해 오류가 발생할 수 있습니다.

자세한 내용은 Larabel 데이터베이스 마이그레이션 - 수정을 참조하십시오.

MySQL에서 식별자를 이스케이프하려면 작은 따옴표 대신 back-ticks를 사용합니다.

alter table `users` modify `age` datetime

이 경우 이스케이프를 생략할 수 있습니다.

alter table users modify age datetime

아래와 같이 사용하실 수 있습니다.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTestTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
      DB::statement('ALTER TABLE `users` MODIFY `age` DATETIME');         
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users'); \or whatever you want on rollback
    }
}

또한 raw sql 쿼리 이행(phMyAdmin 또는 툴을 사용하여 작성된 쿼리는 개발자 간의 이행 관리)을 관리하는 패키지도 작성했습니다.

https://readerstacks.com/how-to-run-raw-sql-query-in-migration-laravel/ 를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/28787293/run-raw-sql-in-migration

반응형