Mysql Go SQL Exec不更改数据库中的值
我编写了一个程序,使用Mysql Go SQL Exec不更改数据库中的值,mysql,go,percona,Mysql,Go,Percona,我编写了一个程序,使用LOAD data infle创建数据并将其加载到数据库中。加载数据部分工作正常,但之后我运行更新查询。update查询返回nil作为错误,并返回1行受影响(如预期)。但当我签入数据库时,值从未改变。当我在MySQL控制台中手动运行更新查询时,它工作正常。此外,没有锁定或“挂起”查询。代码如下: // Load data var loadDataCommand = fmt.Sprintf("set autocommit = 0; set foreign_key_checks
LOAD data infle
创建数据并将其加载到数据库中。加载数据部分工作正常,但之后我运行更新查询。update查询返回nil作为错误,并返回1行受影响(如预期)。但当我签入数据库时,值从未改变。当我在MySQL控制台中手动运行更新查询时,它工作正常。此外,没有锁定或“挂起”查询。代码如下:
// Load data
var loadDataCommand = fmt.Sprintf("set autocommit = 0; set foreign_key_checks = 0; set sql_log_bin = 0; LOAD DATA LOCAL INFILE '%s' INTO TABLE %s COLUMNS TERMINATED BY ',' IGNORE 1 LINES; commit; set autocommit = 1; set foreign_key_checks = 1; set sql_log_bin = 1;", filepath.Join(directoryName, tableName + ".txt"), tableName))
_, err := db.Exec(loadDataCommand)
if err != nil { panic(err) }
// Update table
_, err = db.Exec(fmt.Sprintf("UPDATE states.cities SET states.cities.online = %d WHERE states.cities.city_id = '%s'", status, cityId))
我设法“修复”这一问题的唯一方法是关闭并重新打开数据库连接。这就是我打开连接的方式
newDbConnection, err := sql.Open(DatabaseDriver, DatabaseUser+":"+DatabasePassword+"@tcp("+DatabaseAddress+":3306)/"+DatabaseName+"?multiStatements=true")
if err == nil {
newDbConnection.SetMaxOpenConns(MaxNumberOfDatabaseConnections)
newDbConnection.SetMaxIdleConns(MaxNumberOfDatabaseConnections)
newDbConnection.SetConnMaxLifetime(MaxAgeOfDatabaseConnection)
db = newDbConnection
}
另外,如果我在加载数据之前运行更新查询,它也可以正常工作。最奇怪的是,UPDATE查询返回正确的值(受影响的1行)和作为错误的nil…在第一个
Exec
中,您设置了autocommit=0
,因此您可能必须在UPDATE
语句之后提交它?或者在第一条语句之后将自动提交设置回其原始值。我在加载数据之后将自动提交设置为原始值(autocommit=1)。我错过了。抱歉。关闭并重新打开您的连接修复了它,再加上您以设置自动提交=0开始(不管是否将其重置为1),这让我非常怀疑。sql.Open不会返回连接。Go sql库在后台维护一个连接池。对db.Exec或db.Query等的每次调用都可以在不同的连接上运行。使用事务确保调用在同一数据库连接上。看见