一个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&...¶mN=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常见问题解答。
你可以在这里阅读完整的条款:许可证。