dolthub/go-mysql-server是一个使用纯Go实现的MySQL数据库。目前已经兼容了大量MySQL的语法。可以使用这个库来做项目的测试;
示例源代码:
使用纯Go实现的MySQL数据库
go-mysql-server简介
仓库地址如下:
根据这个库宣称,go-mysql-server会100%兼容MySQL语法(go-mysql-server is to support 100% of the statements that MySQL does.);
目前该库支持的语法见:
下面是go-mysql-server的简介:
go-mysql-server is a SQL engine which parses standard SQL (based on MySQL syntax) and executes queries on data sources of your choice. A simple in-memory database and table implementation are provided, and you can query any data source you want by implementing a few interfaces.
go-mysql-server also provides a server implementation compatible with the MySQL wire protocol. That means it is compatible with MySQL ODBC, JDBC, or the default MySQL client shell interface.
Dolt, a SQL database with Git-style versioning, is the main database implementation of this package. Check out that project for reference implmenentations.
翻译如下:
go-mysql-server是一个SQL引擎,它解析标准SQL(基于MySQL语法)并对选择的数据源执行查询。
本库提供了一个简单的基于内存的数据库和表实现,但是你可以通过实现几个接口来查询所需的任何数据源(例如,基于文件、网络等)。
本库还提供了一个与MySQL wire协议兼容的服务器实现。所以本库可以和MySQL ODBC、JDBC或默认的MySQL-client-shell接口兼容!
Dolt, 是一个具有Git风格版本控制的SQL数据库,是这个包的主要数据库实现。可以查看该项目以获取参考实现。
这个库的详细文档:
一个简单的例子
go-mysql-server库已经包含了一个SQL引擎和服务器实现。所以,如果要启动服务器,首先需要实例化引擎并传递给你自己的sql.Database实现,该引擎将负责处理检索数据的所有逻辑;
下面是一个初始化并插入数据的例子:
1 | package main |
在文件中,我们定义了一些数据库会使用到的常量;
在main中首先,初始化了一个默认的SQL引擎,并调用AddDatabase添加了一个数据库;
createTestDatabase首先创建了一个Database,并创建了一个Table(table具有name、email、phone_numbers等信息),最后向database中加入了这个表,并插入了一些数据,最后返回了*memory.Database;
代码最后创建了数据库配置,并使用引擎engine和数据库配置config创建了真正的server;
在新的gorontine中启动了server,主协程阻塞等待;
下面我们来测试这个数据库;
既然这个库已经支持了MySQL-Cli,我们就直接使用客户端连接;
首先启动服务器,随后在终端连接:
1 | $ mysql --host=127.0.0.1 --port=13306 -uuser -ppass test -e "SELECT * FROM my_table" |
mysql命令指定了host、port、username、passwd、数据库名、执行SQL,最后获取到了结果;
数据库端输出日志:
1 | $ go run app.go |
除了可以通过-e指令直接执行之外,我们甚至可以直接连接数据库:
1 | $ mysql --host=127.0.0.1 --port=13306 -uuser -ppass test |
可以看到,使用终端我们同样完成了查询!
自定义数据源&索引实现
上面使用到的database、table等,其实都是memory包提供的一个数据源的简单实现;
我们也可以手动实现一些接口,来定义自己的数据源;
这里官方文档已经描述的很清楚了,这里不再赘述:
除了可以自定义数据源之外,还可以自定义索引:
使用go-mysql-server做项目测试
go-mysql-server除了可以作为一个简单的MySQL数据库的实现之外,也可以用在项目的测试场景!
熟悉Java的同学可能听说过H2数据库,这里go-mysql-server的使用和H2数据库类似;
下面给出一个例子,在这个例子中,我们创建了一个宠物表,并使用xorm完成对宠物的CRUD测试;
pets表结构:
schema.sql
1 | USE `test`; |
首先,我们创建pet基本类型:
models/pet.go
1 | package models |
以及数据库连接:
models/models.go
1 | package models |
随后创建DAO层:
dao/pet.go
1 | package dao |
最后就是DAO层的测试代码了:
dao/pet_test.go
1 | package dao |
在测试代码中,我们首先在TestMain中创建了一个在内存中的数据库,并且创建了数据库的连接;
最后调用m.Run()启动了测试;
执行测试,最终输出:
1 | === RUN TestPetDAO_CreatePet |
可以看到所有的测试都通过了!
为了简单起见,这里的测试用例写的都比较简单;
你也可以编写更加复杂的测试用例;
使用go-mysql-server做测试的好处就是,在测试时,我们就已经自带了一个MySQL环境,所以只需要修改不同环境(如prod、dev、test)下的配置,即可完成DAO(数据存取)层的测试;
同时,这样也可以避免编写大量的打桩代码,而只需在每次测试时初始化数据库即可!
附录
示例源代码:
go-mysql-server仓库地址: