From 95c1d286803a78aa923f4447ff70c81731115687 Mon Sep 17 00:00:00 2001 From: lihan3238 Date: Fri, 8 May 2026 23:30:48 +0800 Subject: [PATCH] fix(Migrator): disable foreign keys during DropColumn DropColumn calls recreateTable which performs DROP TABLE + INSERT INTO + ALTER TABLE RENAME. When foreign keys are enabled, SQLite enforces FK constraints on the INSERT INTO step, causing the operation to fail. Wrap DropColumn in RunWithoutForeignKey, following the same pattern already used by AlterColumn and DropTable. Closes #119 --- migrator.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/migrator.go b/migrator.go index 9928987..1d5a479 100644 --- a/migrator.go +++ b/migrator.go @@ -155,13 +155,15 @@ func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { } func (m Migrator) DropColumn(value interface{}, name string) error { - return m.recreateTable(value, nil, func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { - if field := stmt.Schema.LookUpField(name); field != nil { - name = field.DBName - } + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(ddl *ddl, stmt *gorm.Statement) (*ddl, []interface{}, error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } - ddl.removeColumn(name) - return ddl, nil, nil + ddl.removeColumn(name) + return ddl, nil, nil + }) }) }