forked from mirror/gorm
Fix primary key tag
This commit is contained in:
parent
9e8a4db36b
commit
af080e6773
|
@ -90,8 +90,6 @@ func (p *processor) Execute(db *DB) {
|
|||
}
|
||||
|
||||
if stmt := db.Statement; stmt != nil {
|
||||
db.RowsAffected = stmt.RowsAffected
|
||||
|
||||
db.Logger.Trace(curTime, func() (string, int64) {
|
||||
return db.Dialector.Explain(stmt.SQL.String(), stmt.Vars...), db.RowsAffected
|
||||
}, db.Error)
|
||||
|
|
|
@ -108,13 +108,14 @@ func (db *DB) Omit(columns ...string) (tx *DB) {
|
|||
return
|
||||
}
|
||||
|
||||
// Where add conditions
|
||||
func (db *DB) Where(query interface{}, args ...interface{}) (tx *DB) {
|
||||
tx = db.getInstance()
|
||||
tx.Statement.AddClause(clause.Where{Exprs: tx.Statement.BuildCondtion(query, args...)})
|
||||
return
|
||||
}
|
||||
|
||||
// Not add NOT condition
|
||||
// Not add NOT conditions
|
||||
func (db *DB) Not(query interface{}, args ...interface{}) (tx *DB) {
|
||||
tx = db.getInstance()
|
||||
tx.Statement.AddClause(clause.Where{Exprs: []clause.Expression{clause.Not(tx.Statement.BuildCondtion(query, args...)...)}})
|
||||
|
|
|
@ -6,23 +6,6 @@ type From struct {
|
|||
Joins []Join
|
||||
}
|
||||
|
||||
type JoinType string
|
||||
|
||||
const (
|
||||
CrossJoin JoinType = "CROSS"
|
||||
InnerJoin = "INNER"
|
||||
LeftJoin = "LEFT"
|
||||
RightJoin = "RIGHT"
|
||||
)
|
||||
|
||||
// Join join clause for from
|
||||
type Join struct {
|
||||
Type JoinType
|
||||
Table Table
|
||||
ON Where
|
||||
Using []string
|
||||
}
|
||||
|
||||
// Name from clause name
|
||||
func (from From) Name() string {
|
||||
return "FROM"
|
||||
|
@ -48,30 +31,6 @@ func (from From) Build(builder Builder) {
|
|||
}
|
||||
}
|
||||
|
||||
func (join Join) Build(builder Builder) {
|
||||
if join.Type != "" {
|
||||
builder.WriteString(string(join.Type))
|
||||
builder.WriteByte(' ')
|
||||
}
|
||||
|
||||
builder.WriteString("JOIN ")
|
||||
builder.WriteQuoted(join.Table)
|
||||
|
||||
if len(join.ON.Exprs) > 0 {
|
||||
builder.WriteString(" ON ")
|
||||
join.ON.Build(builder)
|
||||
} else if len(join.Using) > 0 {
|
||||
builder.WriteString(" USING (")
|
||||
for idx, c := range join.Using {
|
||||
if idx > 0 {
|
||||
builder.WriteByte(',')
|
||||
}
|
||||
builder.WriteQuoted(c)
|
||||
}
|
||||
builder.WriteByte(')')
|
||||
}
|
||||
}
|
||||
|
||||
// MergeClause merge from clause
|
||||
func (from From) MergeClause(clause *Clause) {
|
||||
if v, ok := clause.Expression.(From); ok {
|
||||
|
|
|
@ -1,8 +1,42 @@
|
|||
package clause
|
||||
|
||||
// Joins joins clause
|
||||
type Joins struct {
|
||||
Name string
|
||||
Query string
|
||||
Vars []interface{}
|
||||
type JoinType string
|
||||
|
||||
const (
|
||||
CrossJoin JoinType = "CROSS"
|
||||
InnerJoin = "INNER"
|
||||
LeftJoin = "LEFT"
|
||||
RightJoin = "RIGHT"
|
||||
)
|
||||
|
||||
// Join join clause for from
|
||||
type Join struct {
|
||||
Type JoinType
|
||||
Table Table
|
||||
ON Where
|
||||
Using []string
|
||||
}
|
||||
|
||||
func (join Join) Build(builder Builder) {
|
||||
if join.Type != "" {
|
||||
builder.WriteString(string(join.Type))
|
||||
builder.WriteByte(' ')
|
||||
}
|
||||
|
||||
builder.WriteString("JOIN ")
|
||||
builder.WriteQuoted(join.Table)
|
||||
|
||||
if len(join.ON.Exprs) > 0 {
|
||||
builder.WriteString(" ON ")
|
||||
join.ON.Build(builder)
|
||||
} else if len(join.Using) > 0 {
|
||||
builder.WriteString(" USING (")
|
||||
for idx, c := range join.Using {
|
||||
if idx > 0 {
|
||||
builder.WriteByte(',')
|
||||
}
|
||||
builder.WriteQuoted(c)
|
||||
}
|
||||
builder.WriteByte(')')
|
||||
}
|
||||
}
|
||||
|
|
|
@ -70,7 +70,7 @@ func (dialector Dialector) DataTypeOf(field *schema.Field) string {
|
|||
sqlType = "bigint"
|
||||
}
|
||||
|
||||
if field.AutoIncrement {
|
||||
if field.AutoIncrement || field == field.Schema.PrioritizedPrimaryField {
|
||||
return sqlType + " IDENTITY(1,1)"
|
||||
}
|
||||
return sqlType
|
||||
|
|
|
@ -71,7 +71,7 @@ func (dialector Dialector) DataTypeOf(field *schema.Field) string {
|
|||
sqlType += " unsigned"
|
||||
}
|
||||
|
||||
if field.AutoIncrement {
|
||||
if field.AutoIncrement || field == field.Schema.PrioritizedPrimaryField {
|
||||
sqlType += " AUTO_INCREMENT"
|
||||
}
|
||||
return sqlType
|
||||
|
@ -94,6 +94,10 @@ func (dialector Dialector) DataTypeOf(field *schema.Field) string {
|
|||
return fmt.Sprintf("varchar(%d)", size)
|
||||
case schema.Time:
|
||||
precision := ""
|
||||
if field.Precision == 0 {
|
||||
field.Precision = 3
|
||||
}
|
||||
|
||||
if field.Precision > 0 {
|
||||
precision = fmt.Sprintf("(%d)", field.Precision)
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ var (
|
|||
)
|
||||
|
||||
func init() {
|
||||
dsn := "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True"
|
||||
dsn := "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True&loc=Local"
|
||||
if os.Getenv("GORM_DSN") != "" {
|
||||
dsn = os.Getenv("GORM_DSN")
|
||||
}
|
||||
|
|
|
@ -60,7 +60,7 @@ func (dialector Dialector) DataTypeOf(field *schema.Field) string {
|
|||
case schema.Bool:
|
||||
return "boolean"
|
||||
case schema.Int, schema.Uint:
|
||||
if field.AutoIncrement {
|
||||
if field.AutoIncrement || field == field.Schema.PrioritizedPrimaryField {
|
||||
switch {
|
||||
case field.Size < 16:
|
||||
return "smallserial"
|
||||
|
|
|
@ -33,7 +33,7 @@ func ExplainSQL(sql string, numericPlaceholder *regexp.Regexp, escaper string, v
|
|||
if v.IsZero() {
|
||||
vars[idx] = escaper + "0000-00-00 00:00:00" + escaper
|
||||
} else {
|
||||
vars[idx] = escaper + v.Format("2006-01-02 15:04:05") + escaper
|
||||
vars[idx] = escaper + v.Format("2006-01-02 15:04:05.999") + escaper
|
||||
}
|
||||
case []byte:
|
||||
if isPrintable(v) {
|
||||
|
|
|
@ -219,7 +219,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||
}
|
||||
|
||||
if field.Size == 0 {
|
||||
switch fieldValue.Kind() {
|
||||
switch reflect.Indirect(fieldValue).Kind() {
|
||||
case reflect.Int, reflect.Int64, reflect.Uint, reflect.Uint64, reflect.Float64:
|
||||
field.Size = 64
|
||||
case reflect.Int8, reflect.Uint8:
|
||||
|
|
14
statement.go
14
statement.go
|
@ -28,17 +28,15 @@ type Statement struct {
|
|||
ConnPool ConnPool
|
||||
Schema *schema.Schema
|
||||
Context context.Context
|
||||
Error error
|
||||
RowsAffected int64
|
||||
RaiseErrorOnNotFound bool
|
||||
SQL strings.Builder
|
||||
Vars []interface{}
|
||||
NamedVars []sql.NamedArg
|
||||
}
|
||||
|
||||
// StatementOptimizer statement optimizer interface
|
||||
type StatementOptimizer interface {
|
||||
OptimizeStatement(*Statement)
|
||||
// StatementModifier statement modifier interface
|
||||
type StatementModifier interface {
|
||||
ModifyStatement(*Statement)
|
||||
}
|
||||
|
||||
// Write write string
|
||||
|
@ -144,8 +142,8 @@ func (stmt *Statement) AddVar(writer clause.Writer, vars ...interface{}) {
|
|||
|
||||
// AddClause add clause
|
||||
func (stmt *Statement) AddClause(v clause.Interface) {
|
||||
if optimizer, ok := v.(StatementOptimizer); ok {
|
||||
optimizer.OptimizeStatement(stmt)
|
||||
if optimizer, ok := v.(StatementModifier); ok {
|
||||
optimizer.ModifyStatement(stmt)
|
||||
}
|
||||
|
||||
c, ok := stmt.Clauses[v.Name()]
|
||||
|
@ -255,8 +253,6 @@ func (stmt *Statement) reinit() {
|
|||
stmt.ConnPool = stmt.DB.Config.ConnPool
|
||||
stmt.Schema = nil
|
||||
stmt.Context = context.Background()
|
||||
stmt.Error = nil
|
||||
stmt.RowsAffected = 0
|
||||
stmt.RaiseErrorOnNotFound = false
|
||||
|
||||
stmt.SQL.Reset()
|
||||
|
|
|
@ -21,7 +21,7 @@ type User struct {
|
|||
Toys []Toy `gorm:"polymorphic:Owner"`
|
||||
CompanyID *int
|
||||
Company Company
|
||||
ManagerID uint
|
||||
ManagerID *uint
|
||||
Manager *User
|
||||
Team []User `gorm:"foreignkey:ManagerID"`
|
||||
Languages []Language `gorm:"many2many:UserSpeak"`
|
||||
|
|
|
@ -81,7 +81,7 @@ func TestFind(t *testing.T, db *gorm.DB) {
|
|||
}}
|
||||
|
||||
if err := db.Create(&users).Error; err != nil {
|
||||
t.Errorf("errors happened when create users: %v", err)
|
||||
t.Fatal("errors happened when create users: %v", err)
|
||||
}
|
||||
|
||||
t.Run("First", func(t *testing.T) {
|
||||
|
|
Loading…
Reference in New Issue