gorm连mysql代理报错问题分析和解决方法

时间:2025-02-24 13:32:30

问题现象

近日遇到gorm连mysql代理报错(直连mysql不报错),错误如下:

执行函数报:Table already exists

执行函数报:Unknown prepared statement handler given to mysqld_stmt_execute

原因分析

由于使用的mysql代理不支持prepare操作导致

解决方法

这个问题目前已经找到解决方法,请看下文。

使用gorm有2种方式,第1种是import /gorm,另外1种是import /jinzhu/gorm。第1种:

import (
    "/gorm"
    "/driver/mysql"
    "fmt"
)

...
db, err = (("user:password@tcp(ip:port)/database?charset=utf8&parseTime=True&loc=Local"), &{PrepareStmt: true})
...

第2种:

import (
    "/jinzhu/gorm"
    _ "/jinzhu/gorm/dialects/mysql"
    "fmt"
)

...
db, err = ("mysql", "user:password@tcp(ip:port)/database?charset=utf8&parseTime=True&loc=Local")
...

对于第1种和第2种,均需要在数据库的url里加上:interpolateParams=True,也即:

"user:password@tcp(ip:port)/database?charset=utf8&parseTime=True&loc=Local&interpolateParams=True"

加上interpolateParams=True后客户端会关闭prepare处理,此时问题就已经解决了吗?答案是没有完全解决。

实际跑下来第2种用法已经ok了,但是第1种还有问题,而且是同样的报错,此处必有蹊跷,烧脑思考中。。。

原来在第1种用法里有:PrepareStmt: true,去掉再跑就好了。

---------------------------------------------------------------------------------------------------------------------------------

题外话

以下是题外话,顺带提下搭建go环境的问题处理方法,在使用go get报i/o timeout的情况下,可以从github上根据tag下载好相应版本源码的zip包,解压到本地,再在源码工程里使用replace语句,例如,

replace /gorm => /home/xxx//gorm
replace /driver/mysql => /home/xxx//driver/mysql

第1种用法的gorm仓库地址: go-gorm · GitHubhttps:///go-gorm

第2种用法的gorm仓库地址:jinzhu (Jinzhu) · GitHubhttps:///jinzhu