我在laravel项目中有一个迁移,我重命名了字段。这个迁移在mysql和我测试过的大多数数据库驱动程序(还有我本地的sqlite)上都运行得很好,不管是什么原因,github ci runner的语法似乎有问题,我相信要么是版本不匹配,要么是laravel生成了一个错误的sql语句。这是我的迁徙:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('user_weights', function (Blueprint $table) {
$table->renameColumn('weight', 'weight_raw');
});
Schema::table('user_heights', function (Blueprint $table) {
$table->renameColumn('height', 'height_raw');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('user_weights', function (Blueprint $table) {
$table->renameColumn('weight_raw', 'weight');
});
Schema::table('user_heights', function (Blueprint $table) {
$table->renameColumn('height_raw', 'height');
});
}
};
我的github工作流程看起来像这样:
on:
push:
branches:
- master
- feature/*
- hotfix/*
pull_request:
branches:
- master
name: CI
jobs:
phpunit:
runs-on: ubuntu-latest
container:
image: kirschbaumdevelopment/laravel-test-runner:8.1
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Install composer dependencies
run: |
composer config "http-basic.nova.laravel.com" "${{ secrets.NOVA_USERNAME }}" "${{ secrets.NOVA_LICENSE }}"
composer install --no-scripts
- name: Prepare .env
run: cp .env.testing .env
- name: Generate key
run: php artisan key:generate
- name: Directory Permissions
run: chmod -R 777 storage bootstrap/cache
- name: Mark app folder as safe directory
run: git config --global --add safe.directory /__w/fitness-backend-neu/fitness-backend-neu
- name: Create Database
run: |
mkdir -p database
touch database/database.sqlite
php artisan migrate
- name: Run Testsuite
run: vendor/bin/phpunit tests/
- name: Run Pint
run: vendor/bin/pint --test
工作流在数据库迁移中崩溃,并出现以下错误:
In Connection.php line 759:
SQLSTATE[HY000]: General error: 1 near "0": syntax error (SQL: CREATE TABLE
user_weights (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, user_id VARCH
AR(255) NOT NULL COLLATE BINARY, weight_raw DOUBLE PRECISION NOT NULL, date
DATE NOT NULL, created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAU
LT NULL, CONSTRAINT 0 FOREIGN KEY (user_id) REFERENCES users (id) ON UPDATE
NO ACTION ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE))
In Connection.php line 538:
SQLSTATE[HY000]: General error: 1 near "0": syntax error
由于错误发生在“user_id”关系中,我已经尝试在重命名之前删除该关系,并在重命名过程之后立即重新创建该关系。由于sqlite不支持删除外键约束,所以这不起作用。
我还尝试使用act重现这个错误。Act是一个本地ci运行器,它也解释GitHub工作流文件。使用act运行的完全相同的设置,我仍然无法重现此错误。除了GitHub Actions之外,一切都正常(Act,PHPUnit,本地环境迁移,生产环境迁移)。
我刚刚看到,之前通过GitHub操作运行了完全相同的迁移,并且没有失败。它只是在一些其他提交后开始失败。
2条答案
按热度按时间a2mppw5e1#
我找到了一个解决方法,因为在这种情况下laravel似乎会生成一个错误的sql语句。我在迁移中添加了以下代码,以捕获sqlite连接上的sql语句并运行“仅sqlite”查询。
我也做了同样的反向迁移。
unftdfkk2#
我在
"doctrine/dbal": "^3.1"
上也遇到了同样的问题,但是更新doctrine/dbal
解决了这个问题。