From 7e54a96454b253c855b8d1b786014fc93cf12844 Mon Sep 17 00:00:00 2001 From: black Date: Tue, 14 Apr 2026 09:54:48 +0800 Subject: [PATCH] =?UTF-8?q?```=20fix(database):=20=E4=BF=AE=E5=A4=8DSQLite?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E4=B8=AD=E8=87=AA=E5=A2=9E=E4=B8=BB=E9=94=AE?= =?UTF-8?q?=E7=9A=84=E5=AE=9A=E4=B9=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复了自增列同时标记为主键时重复添加PRIMARY KEY约束的问题 - 确保自增主键列只添加一次PRIMARY KEY约束 - 优化了复合主键约束的添加逻辑,避免与自增约束冲突 - 修正了自增主键的类型定义为INTEGER以符合SQLite规范 ``` --- database/drivers/sqlite/sqlite_migration.go | 47 ++++++++++----------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/database/drivers/sqlite/sqlite_migration.go b/database/drivers/sqlite/sqlite_migration.go index 3bfcc0c..a348490 100644 --- a/database/drivers/sqlite/sqlite_migration.go +++ b/database/drivers/sqlite/sqlite_migration.go @@ -52,14 +52,16 @@ func (m *Migration) CreateTable(ctx context.Context, table string, columns map[s var primaryKeys []string for name, def := range columns { colDef := m.buildColumnDefinition(name, def) - if def.PrimaryKey { + // Only add to primaryKeys if it's not an auto-increment column + // (auto-increment columns already have PRIMARY KEY in their definition) + if def.PrimaryKey && !def.AutoIncrement { primaryKeys = append(primaryKeys, database.QuoteIdentifier(name)) } colDefs = append(colDefs, " "+colDef) } - // Add primary key constraint if needed - if len(primaryKeys) > 0 { + // Add composite primary key constraint if needed (for non-auto-increment keys) + if len(primaryKeys) > 1 { colDefs = append(colDefs, fmt.Sprintf(" PRIMARY KEY (%s)", strings.Join(primaryKeys, ", "))) } @@ -74,30 +76,27 @@ func (m *Migration) buildColumnDefinition(name string, def *database.ColumnDefin var parts []string parts = append(parts, database.QuoteIdentifier(name)) - // Handle SQLite-specific types - dbType := def.Type - if def.AutoIncrement && def.PrimaryKey { - if dbType == "INT" || dbType == "INTEGER" { - dbType = "INTEGER" - } - } - parts = append(parts, dbType) - + // Handle SQLite-specific types for auto-increment primary key if def.PrimaryKey && def.AutoIncrement { - parts = append(parts, "PRIMARY KEY AUTOINCREMENT") - } else { - if !def.Null { - parts = append(parts, "NOT NULL") - } + // SQLite requires INTEGER type for AUTOINCREMENT + parts = append(parts, "INTEGER PRIMARY KEY AUTOINCREMENT") + return strings.Join(parts, " ") + } - if def.Unique && !def.PrimaryKey { - parts = append(parts, "UNIQUE") - } + // Regular column definition + parts = append(parts, def.Type) - if def.Default != nil { - defaultValue := formatDefaultValue(def.Default) - parts = append(parts, fmt.Sprintf("DEFAULT %s", defaultValue)) - } + if !def.Null { + parts = append(parts, "NOT NULL") + } + + if def.Unique && !def.PrimaryKey { + parts = append(parts, "UNIQUE") + } + + if def.Default != nil { + defaultValue := formatDefaultValue(def.Default) + parts = append(parts, fmt.Sprintf("DEFAULT %s", defaultValue)) } return strings.Join(parts, " ")