Go SQL Exec не изменяет значение в базе данных - PullRequest
0 голосов
/ 29 октября 2019

Я написал программу, которая создает и загружает данные в базу данных, используя LOAD DATA INFILE. Часть LOAD DATA работает нормально, но после этого я запускаю запрос UPDATE. Запрос на обновление возвращает nil как ошибку и возвращает 1 строку (как и ожидалось). Но когда я проверяю в базе данных, значение никогда не менялось. Когда я запускаю запрос UPDATE вручную в консоли 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 до LOAD DATA, он будет работать нормально. Самое странное, что запрос UPDATE возвращает правильное значение (затронуто 1 строка) и nil как ошибку ...

...