go实现一个兼容mysql协议的虚拟数据库代码
代码语言:golang
所属分类:其他
代码描述:go实现一个兼容mysql协议的虚拟数据库代码,对外可以连接执行sql命令并返回数据,客户端看上去像一个真的mysql数据,其实都是go返回的虚假数据。
代码标签: go 兼容 mysql 协议 虚拟 数据库 代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
package main import ( "bytes" "encoding/binary" "fmt" "log" "net" "github.com/go-mysql-org/go-mysql/mysql" "github.com/go-mysql-org/go-mysql/server" ) func main() { // 启动虚拟 MySQL 服务器 l, err := net.Listen("tcp", "127.0.0.1:3307") if err != nil { log.Fatal(err) } defer l.Close() log.Println("Virtual MySQL server is listening on 127.0.0.1:3307") for { conn, err := l.Accept() if err != nil { log.Println(err) continue } go handleConnection(conn) } } func handleConnection(conn net.Conn) { // 确保连接在所有情况下都被关闭 defer conn.Close() // 创建一个新的 MySQL 连接 c, err := server.NewConn(conn, "root", "passwd", &MySQLHandler{}) if err != nil { log.Println("Failed to create MySQL connection:", err) return } for { if err := c.HandleCommand(); err != nil { log.Println("Connection closed:", err) return } } } type MySQLHandler struct{} func (h *MySQLHandler) UseDB(dbName string) error { fmt.Printf("Use database: %s\n", dbName) return nil } func (h *MySQLHandler) HandleQuery(query string) (*mysql.Result, error) { fmt.Printf("SQL Query: %s\n", query) // 这里伪造一些数据返回给客户端 columns := []*mysql.Field{ {Name: []byte("id"), Type: mysql.MYSQL_TYPE_LONG}, {Name: []byte("name"), Type: mysql.MYSQL_TYPE_VAR_STRING}, } rows := make([][]interface{}, 0) rows = append(rows, []interface{}{1, "Alice"}) rows = append(rows, []interface{}{2, "Bob"}) // 创建结果集 resultset := &mysql.Resultset{ Fields: columns, } for _, row := range rows { rowData := make([]byte, 0) for _, col := range row { encoded, err := encodeValue(col) if err != nil { return nil, err } .........完整代码请登录后点击上方下载按钮下载查看
网友评论0