Go-MySQL-Driver

一个MySQL-Driverfor Go的数据库/sql包


  • 用法DSN(数据源名称)密码协议地址参数示例连接池和超时context.Context支持列类型支持加载数据本地填充支持time.Time支持Unicode支持
  • 测试/开发

Features

sql.RawBytesLONG DATALOAD DATA LOCAL INFILEio.Readertime.Time

Requirements

  • 达到1.10或更高。我们的目标是支持3个最新版本的Go。
  • MySQL(4.1+),MariaDB,Percona服务器,Google CloudSQL或Sphinx(2.2.3+)

Installation

使用shell中的go工具将包简单地安装到$GOPATH:

$ go get -u github.com/go-sql-driver/mysql
PATH

Usage

database/sql/driverdatabase/sql
mysqldriverNamedataSourceName
import "database/sql"
import _ "github.com/go-sql-driver/mysql"

db, err := sql.Open("mysql", "user:password@/dbname")
if err != nil {
	panic(err)
}
// See "Important settings" section.
db.SetConnMaxLifetime(time.Minute * 3)
db.SetMaxOpenConns(10)
db.SetMaxIdleConns(10)

我们的Wiki中提供了示例。

Important settings

db.SetConnMaxLifetime()
db.SetMaxOpenConns()
db.SetMaxIdleConns()db.SetMaxOpenConns()SetMaxOpenConns()db.SetConnMaxLifetime()db.SetConnMaxIdleTime()

DSN(数据源名称)

数据源名称有一个通用格式,例如PEAR DB使用它,但是没有type-prefix(可选部分用方括号标记):

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

最完整的DSN:

username:password@protocol(address)/dbname?param=value

除了databasename,所有值都是可选的。因此,最小DSN为:

/dbname

dbname
/

这与空DSN字符串具有相同的效果:



或者,Config.FormatDSN可以通过填充结构来创建DSN字符串。

Password

密码可以由任何字符组成。逃跑是不必要的。

Protocol

请参见net.Dial,了解可用网络的更多信息。一般来说,为了获得最佳性能,您应该使用Unix域套接字,否则应该使用TCP。

Address

host[:port]porthost
/var/run/mysqld/mysqld.sock/tmp/mysql.sock

Parameters

参数是case-sensitive!

trueTRUETrue1falseFALSEFalse0
allowAllFiles
Type:           bool
Valid Values:   true, false
Default:        false

allowAllFiles=trueLOAD DATA LOCAL INFILE
allowCleartextPasswords
Type:           bool
Valid Values:   true, false
Default:        false

allowCleartextPasswords=true
allowNativePasswords
Type:           bool
Valid Values:   true, false
Default:        true

allowNativePasswords=false
allowOldPasswords
Type:           bool
Valid Values:   true, false
Default:        false

allowOldPasswords=true
charset
Type:           string
Valid Values:   <name>
Default:        none

"SET NAMES "utf8mb4charset=utf8mb4,utf8utf8
charsetcollation
checkConnLiveness
Type:           bool
Valid Values:   true, false
Default:        true

checkConnLiveness=false
collation
Type:           string
Valid Values:   <name>
Default:        utf8mb4_general_ci

charsetcollation
SHOW COLLATION
utf8mb4_general_ciutf8_general_ci

不能使用字符集“ucs2”、“utf16”、“utf16le”和“utf32”的排序规则(ref)。

clientFoundRows
Type:           bool
Valid Values:   true, false
Default:        false

clientFoundRows=true
columnsWithAlias
Type:           bool
Valid Values:   true, false
Default:        false

columnsWithAliassql.Rows.Columns()
SELECT u.id FROM users as u

u.ididcolumnsWithAlias=true
interpolateParams
Type:           bool
Valid Values:   true, false
Default:        false

interpolateParamsdb.Query()db.Exec()?interpolateParams=false

这不能与多字节编码BIG5、CP932、GB2312、GBK或SJIS一起使用。这些被拒绝,因为它们可能会引入SQL注入漏洞!

loc
Type:           string
Valid Values:   <escaped name>
Default:        UTC

parseTime=true

注意,这会设置time.Time值的位置,但不会更改MySQL的time_zone设置。为此,请参见time_zone系统变量,该变量也可以设置为DSN参数。

/%2FUS/Pacificloc=US%2FPacific
maxAllowedPacket
Type:          decimal number
Default:       4194304

maxAllowedPacket=0max_allowed_packet
multiStatements
Type:           bool
Valid Values:   true, false
Default:        false

允许在一个查询中使用多个语句。虽然这允许批处理查询,但也大大增加了SQL注入的风险。只返回第一个查询的结果,其他所有结果都将被自动丢弃。

multiStatements?
parseTime
Type:           bool
Valid Values:   true, false
Default:        false

parseTime=trueDATEDATETIMEtime.Time[]bytestring0000-00-00 00:00:00time.Time
readTimeout
Type:           duration
Default:        0

I/O读取超时。该值必须是带有单位后缀(“ms”、“s”、“m”、“h”)的十进制数,例如“30s”、"0.5m“或“1m30s”。

rejectReadOnly
Type:           bool
Valid Values:   true, false
Default:        false

rejectReadOnly=true

请注意,这应该是非常罕见的情况,因为自动故障转移通常发生在主服务器关闭时,除非启动故障转移后它立即恢复联机状态,否则不应该发生争用情况。另一方面,当这种情况发生时,MySQL应用程序可能会卡在read-only连接上,直到重新启动。然而,它是相当容易复制的,例如,使用AWS Aurora的MySQL-compatible集群上的手动故障转移。

如果您不依赖read-only事务来拒绝不应该发生的写入,那么在一些MySQL提供程序(如AWS Aurora)上设置此选项对于故障转移来说更安全。

read-onlyread-only
serverPubKey
Type:           string
Valid Values:   <name>
Default:        none

mysql.RegisterServerPubKey
timeout
Type:           duration
Default:        OS default

建立连接超时,也称为拨号超时。该值必须是带有单位后缀(“ms”、“s”、“m”、“h”)的十进制数,例如“30s”、"0.5m“或“1m30s”。

tls
Type:           bool / string
Valid Values:   true, false, skip-verify, preferred, <name>
Default:        false

tls=trueskip-verifypreferredskip-verifyskip-verifypreferredmysql.RegisterTLSConfig
writeTimeout
Type:           duration
Default:        0

I/O写入超时。该值必须是带有单位后缀(“ms”、“s”、“m”、“h”)的十进制数,例如“30s”、"0.5m“或“1m30s”。

System Variables

任何其他参数都被解释为系统变量:

=SET ==SET ==%27%27SET =''

Rules:

'%27

Examples:

autocommit=1SET autocommit=1time_zone=%27Europe%2FParis%27SET time_zone='Europe/Paris'transaction_isolation=%27REPEATABLE-READ%27SET transaction_isolation='REPEATABLE-READ'

Examples

user@unix(/path/to/socket)/dbname

root:pw@unix(/tmp/mysql.sock)/myDatabase?loc=Local

user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true

sql_mode
user:password@/dbname?sql_mode=TRADITIONAL

通过IPv6的TCP:

user:password@tcp([de:ad:be:ef::ca:fe]:80)/dbname?timeout=90s&collation=utf8mb4_unicode_ci

远程主机上的TCP,例如Amazon RDS:

id:password@tcp(your-amazonaws-uri.com:3306)/dbname

Google Cloud SQL应用引擎:

user:password@unix(/cloudsql/project-id:region-name:instance-name)/dbname

TCP使用本地主机上的默认端口(3306):

user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped

使用默认协议(tcp)和主机(本地主机:3306):

user:password@/dbname

未预选数据库:

user:password@/

连接池和超时

*DB.SetMaxOpenConns*DB.SetMaxIdleConns*DB.SetConnMaxLifetimereadTimeoutwriteTimeouttimeout
ColumnType
ColumnTypeColumnType.Length()
context.Context
database/sqlcontext.Context
LOAD DATA LOCAL INFILE
_
import "github.com/go-sql-driver/mysql"
mysql.RegisterLocalFile(filepath)allowAllFiles=true
io.Readermysql.RegisterReaderHandler(name, handler)io.Readerio.ReadCloserReader::DeregisterReaderHandler

有关详细信息,请参阅Go-MySQL-Driver的godoc。

time.Time
DATEDATETIME[]byte[]bytestringsql.RawBytes
DATEDATETIMEtime.TimeDATEDATETIMEparseTime=true[]bytetime.Timeloctime.Time
time.TimeDATEDATETIMEsql.RawBytes

Unicode support

 utf8mb4_general_ci
collation
&charset=utf8SET NAMES utf8collation

请参见http://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html以获取有关MySQL的Unicode支持的更多详细信息。

测试/开发

要运行驱动程序测试,您可能需要调整配置。有关详细信息,请参见测试Wiki-Page。

Go-MySQL-Driver还不是feature-complete。非常感谢你的帮助。如果你想参与,你可以处理一个未解决的问题或审查一个请求。

有关详细信息,请参阅供款指南。


License

Go-MySQL-Driver是根据Mozilla公共许可证2.0版授权的

Mozilla将许可范围总结如下:

MPL:copyleft适用于任何包含MPLed代码的文件。

That means:

  • 您可以在私有和商业中使用未更改的源代码。
  • 分发时,您必须在a)mpl2.0本身或b)兼容许可证(例如gpl3.0或Apache License2.0)下发布在mpl2.0下许可的任何更改文件的源代码。
  • 只要mpl2.0下授权的文件不变,就不必发布库的源代码。

如果您对许可证有进一步的疑问,请阅读MPL2.0常见问题解答。

你可以在这里阅读完整的条款:许可证。