```
fix(database): 修复SQLite迁移中自增主键的定义问题 - 修复了自增列同时标记为主键时重复添加PRIMARY KEY约束的问题 - 确保自增主键列只添加一次PRIMARY KEY约束 - 优化了复合主键约束的添加逻辑,避免与自增约束冲突 - 修正了自增主键的类型定义为INTEGER以符合SQLite规范 ```main v1.0.2025
parent
33faa6f722
commit
7e54a96454
|
|
@ -52,14 +52,16 @@ func (m *Migration) CreateTable(ctx context.Context, table string, columns map[s
|
||||||
var primaryKeys []string
|
var primaryKeys []string
|
||||||
for name, def := range columns {
|
for name, def := range columns {
|
||||||
colDef := m.buildColumnDefinition(name, def)
|
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))
|
primaryKeys = append(primaryKeys, database.QuoteIdentifier(name))
|
||||||
}
|
}
|
||||||
colDefs = append(colDefs, " "+colDef)
|
colDefs = append(colDefs, " "+colDef)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add primary key constraint if needed
|
// Add composite primary key constraint if needed (for non-auto-increment keys)
|
||||||
if len(primaryKeys) > 0 {
|
if len(primaryKeys) > 1 {
|
||||||
colDefs = append(colDefs, fmt.Sprintf(" PRIMARY KEY (%s)", strings.Join(primaryKeys, ", ")))
|
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
|
var parts []string
|
||||||
parts = append(parts, database.QuoteIdentifier(name))
|
parts = append(parts, database.QuoteIdentifier(name))
|
||||||
|
|
||||||
// Handle SQLite-specific types
|
// Handle SQLite-specific types for auto-increment primary key
|
||||||
dbType := def.Type
|
|
||||||
if def.AutoIncrement && def.PrimaryKey {
|
|
||||||
if dbType == "INT" || dbType == "INTEGER" {
|
|
||||||
dbType = "INTEGER"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parts = append(parts, dbType)
|
|
||||||
|
|
||||||
if def.PrimaryKey && def.AutoIncrement {
|
if def.PrimaryKey && def.AutoIncrement {
|
||||||
parts = append(parts, "PRIMARY KEY AUTOINCREMENT")
|
// SQLite requires INTEGER type for AUTOINCREMENT
|
||||||
} else {
|
parts = append(parts, "INTEGER PRIMARY KEY AUTOINCREMENT")
|
||||||
if !def.Null {
|
return strings.Join(parts, " ")
|
||||||
parts = append(parts, "NOT NULL")
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if def.Unique && !def.PrimaryKey {
|
// Regular column definition
|
||||||
parts = append(parts, "UNIQUE")
|
parts = append(parts, def.Type)
|
||||||
}
|
|
||||||
|
|
||||||
if def.Default != nil {
|
if !def.Null {
|
||||||
defaultValue := formatDefaultValue(def.Default)
|
parts = append(parts, "NOT NULL")
|
||||||
parts = append(parts, fmt.Sprintf("DEFAULT %s", defaultValue))
|
}
|
||||||
}
|
|
||||||
|
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, " ")
|
return strings.Join(parts, " ")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue