Skip to content
This repository has been archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Update操作,入参bean与condiBean类型不同时,会忽略condiBean的信息 #912

Closed
alex023 opened this issue Apr 26, 2018 · 4 comments
Labels
Milestone

Comments

@alex023
Copy link

alex023 commented Apr 26, 2018

在使用Update方法的时候,如果bean与condiBean类型不同,输出的sql(调用LastSQL())会忽略condiBean构造的where条件语句。截图如下:

当bean与condiBean类型相同时:

image
sql输出:

UPDATE `s_users` SET `spid_facebook` = ? WHERE `accountid`=? AND `authcode`=? [116186232572328 FFE58BF2-307C-11E7-A346-408D5CB790C2 MOTRF53X4NFZY6XS]

当bean与condiBean类型不同时:

image
sql输出:

UPDATE `s_users` SET `spid_facebook` = ?  [116186232572328]

从实际运行情况看,后者的sql确实导致全表更新,LastSql的结果正确的。
如果是Update在使用时有什么限制,希望在doc中进一步描述!

@lunny lunny added the kind/bug label Apr 29, 2018
@lunny lunny added this to the 0.7 milestone Apr 29, 2018
@lunny
Copy link
Member

lunny commented Apr 29, 2018

see #918, I added some test but cannot reproduce your issue on latest commit. Which version did you use?

@alex023
Copy link
Author

alex023 commented May 3, 2018

版本配置,glide.lock

- name: github.com/go-sql-driver/mysql
  version: a0583e0143b1624142adab07e0e97fe106d99561
- name: github.com/go-xorm/builder
  version: a9b7ffcca3f0c6445c4e3b1bf72c01578817a6c3
- name: github.com/go-xorm/core
  version: f43c33d9a48db006417a7ac4c16b08897e3e1458
- name: github.com/go-xorm/xorm
  version: fc1b13e0d8e240788213230aa5747eb557f80f41

@alex023
Copy link
Author

alex023 commented May 3, 2018

重新写了一个独立的代码,问题没有重现:

package main

import (
	"github.com/go-xorm/xorm"
	"log"
	_ "github.com/go-sql-driver/mysql"
)

//用户表定义
type User struct {
	Name  string
	Email string
}

func (User) TableName() string {
	return "s_user"
}

type UserCondition struct {
	Email string
}

const (
	MaxOpenConns = 100 //最大打开连接数
	MaxIdleConns = 80  //最大空闲数
)

//定义数据库连接
var (
	dbMap = make(map[string]*xorm.Engine)
)

func addDb(username, password, addr, dbname string, maxOpenConns, maxIdleConns int, showsql bool) error {
	if maxOpenConns <= 0 || maxIdleConns <= 0 {
		maxOpenConns = MaxOpenConns
		maxIdleConns = MaxIdleConns
	}
	url := username + ":" + password + "@tcp(" + addr + ")/"
	engine, err := xorm.NewEngine("mysql", url+dbname)
	if err != nil {
		return err
	}
	if err = engine.Ping(); err != nil {
		return err
	}
	engine.ShowSQL(showsql)
	engine.SetMaxOpenConns(maxOpenConns)
	engine.SetMaxIdleConns(maxIdleConns)
	dbMap[dbname] = engine

	return nil
}

//GetSession 获取业务数据库会话(innodb下)
func getSession(dbName string) *xorm.Session {
	if engine, founded := dbMap[dbName]; founded {
		return engine.NewSession()
	}
	return nil
}

func sync() {
	session := getSession("xorm_test")
	defer session.Close()

	err := session.Sync2(new(User))
	if err != nil {
		log.Println("sync:", err)
	}
}
func add() {
	session := getSession("xorm_test")
	defer session.Close()
	err := session.Sync2(new(User))
	if err != nil {
		log.Println("sync:", err)
	}
}

func update1() {
	session := getSession("xorm_test")
	defer session.Close()
	var user = User{
		Name: "alex",
	}
	var condition = User{
		Email: "alex_023@126.com",
	}
	session.Table("s_users").Update(&user, condition)

	log.Println(session.LastSQL())
}
func update2() {
	session := getSession("xorm_test")
	defer session.Close()
	var user = User{
		Name: "alex",
	}
	var condition = UserCondition{
		Email: "alex_023@126.com",
	}
	session.Table("s_users").Update(&user, condition)

	log.Println(session.LastSQL())
}
func main() {
	if err := addDb("xorm_test", "xorm_test", "127.0.0.1:3306", "xorm_test", MaxOpenConns, MaxIdleConns, true); err != nil {
		log.Println("adddb:", err)
		return
	}

	sync()

	add()
	update1()
	update2()

	return
}

我再看看

@alex023
Copy link
Author

alex023 commented May 4, 2018

没在重现,或许是我某个使用不正确。

@alex023 alex023 closed this as completed May 4, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Projects
None yet
Development

No branches or pull requests

2 participants