Golang MySQL Driver не разрешает изменения базы данных с ProxySQL - PullRequest
0 голосов
/ 01 октября 2019

Мы пытаемся использовать GO для создания веб-приложения, которое подключается к ProxySQL, которое, в свою очередь, подключается к различным серверам баз данных MySQL на основе правил запросов MySQL, установленных в ProxySQL.

Мы можем подключитьсяв ProxySQL через командную строку в linux и все работает как положено:

    use database1;
    select id from users where user_id=1;
    use database2;
    select id from posts where user_id=1;

Вышеуказанные базы данных расположены на физически разных серверах. Правила в ProxySQL знают, как их маршрутизировать.

При подключении к ProxySQL правила работают нормально, и мы подключены к правильным серверам баз данных, и запросы обрабатываются, как и ожидалось.

Когда мы пытаемсяТо же самое с GO и транзакциями, мы не можем переключить базы данных, поскольку они возвращают, что база данных не существует.

База данных существует на внутренних серверах, на которые ProxySQL будет направлять трафик.

По какой-то причине он работает в командной строке, но не в GO

Мы можем заставить его работать, если мы подключаемся с GO и указываем базу данных на соединение, затем отключаемся и повторно подключаемся с новым подключением к базе данных.

Мы пытаемся использовать пул соединений, чтобы не тратить время на открытие и закрытие соединений.

    //open the connection to ProxySQL

    db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/")

    //The above only allows us to stay on the default database for the user

    //in order to access each of the databases we would need to open a
    //connection to database1 then open another connection to database2
    //which defeats the whole purpose of connection pooling.

    db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/database1")
    ... do something...

    db, err = sql.Open("mysql", "user:password@tcp(x.x.x.x:6033)/database2")
    ... do something ...



    //code below is an example of what is not working but works from
    //command line in linux. Results are not processed below because we
    //cannot get past the first error of no database
    tx, err := db.Begin()
    res, err := tx.Exec("use database1")
    res, err = tx.Exec("select id from users where user_id=1;")
    res, err = tx.Exec("use database2")
    res, err = tx.Exec("select id from posts where user_id=1;")
    tx.Commit()

ProxySQL знает, как правильно маршрутизировать, но мы не можемполучить правильную работу функций в GOLANG

1 Ответ

0 голосов
/ 01 октября 2019

Я нашел информацию из официальных документов Голанга https://golang.google.cn/pkg/database/sql/#Tx.Exec:

func (*Tx) Exec
func (tx *Tx) Exec(query string, args ...interface{}) (Result, error)
Exec executes a query that doesn't return rows. For example: an INSERT and UPDATE.

Может быть, вам следует использовать другой метод func (db *DB) Prepare(query string) (*Stmt, error), удачи.

...