純 Go 實現的 MySQL 引擎——go-mysql-server
go-mysql-server 是一個用 Go 編寫的 MySQL 兼容的查詢引擎。它不僅是一個解析器,還是一個服務器和查詢執行引擎,完全使用 Go 語言編寫。與 Dolt 一樣,它的目標是成爲 MySQL 的 100% 兼容的替代品。
go-mysql-server 具有以下兩個主要用途:
-
作爲 Golang 測試環境中 MySQL 的替代品,使用內置的內存數據庫實現。
-
通過實現一些接口,提供對任意數據源的 SQL 查詢訪問。其中最完整的實現是 Dolt,一個具有 Git 風格版本控制的 SQL 數據庫。
除了特定的限制,go-mysql-server 是 MySQL 的一個即插即用的替代品。任何與 MySQL 兼容的客戶端庫、工具、查詢、SQL 語法、SQL 函數等都應該適用於 go-mysql-server。
安裝
將 go-mysql-server 添加爲您項目的依賴項。在包含 go.mod 文件的目錄中運行以下命令:
go get github.com/dolthub/go-mysql-server@latest
如果您需要在測試環境中替代真實的 MySQL 服務器,可以使用內存測試服務器。以下是在 _example 目錄中的代碼示例,您可以用它來啓動內存測試服務器:
package main
import (
"fmt"
"time"
sqle "github.com/dolthub/go-mysql-server"
"github.com/dolthub/go-mysql-server/memory"
"github.com/dolthub/go-mysql-server/server"
"github.com/dolthub/go-mysql-server/sql"
"github.com/dolthub/go-mysql-server/sql/types"
)
var (
dbName = "mydb"
tableName = "mytable"
address = "localhost"
port = 3306
)
func main() {
ctx := sql.NewEmptyContext()
engine := sqle.NewDefault(memory.NewDBProvider(createTestDatabase(ctx)))
// 此變量可能在“users_example.go”文件中找到。請參考該文件以瞭解如何在建立連接時設置“mysql”數據庫以允許用戶創建和用戶檢查。此示例中設置爲 false,但您可以隨意嘗試並查看其工作原理。
if enableUsers {
if err := enableUserAccounts(ctx, engine); err != nil {
panic(err)
}
}
config := server.Config{
// 配置您的服務器選項
}
server := server.NewDefaultServer(config, engine)
server.Start()
}
// 創建一個測試數據庫
func createTestDatabase(ctx *sql.Context) *memory.Database {
db := memory.NewDatabase(dbName)
table := memory.NewTable(tableName, sql.Schema{
{Name: "id", Type: types.Int64, Source: tableName, PrimaryKey: true},
{Name: "name", Type: types.Text, Source: tableName},
// 添加其他列...
})
db.AddTable(tableName, table)
return db
}
// 啓用用戶帳戶
func enableUserAccounts(ctx *sql.Context, engine *sqle.Engine) error {
// 實現啓用用戶帳戶的邏輯
// ...
return nil
}
這個示例通過使用 Golang 代碼創建 memory.Database 和 memory.Table 對象來填充數據庫,但您也可以在服務器運行時通過發出 CREATE DATABASE、CREATE TABLE 等語句來填充它。
一旦服務器運行起來,您可以使用任何 MySQL 客戶端連接,包括 Golang 的 MySQL 連接器和 MySQL shell。
> mysql --host=localhost --port=3306 --user=root mydb --execute="SELECT * FROM mytable;"
+----------+-------------------+-------------------------------+----------------------------+
| name | email | phone_numbers | created_at |
+----------+-------------------+-------------------------------+----------------------------+
| Jane Deo | janedeo@gmail.com | ["556-565-566","777-777-777"] | 2022-11-01 12:00:00.000001 |
| Jane Doe | jane@doe.com | [] | 2022-11-01 12:00:00.000001 |
| John Doe | john@doe.com | ["555-555-555"] | 2022-11-01 12:00:00.000001 |
| John Doe | johnalt@doe.com | [] | 2022-11-01 12:00:00.000001 |
+----------+-------------------+-------------------------------+----------------------------+
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/xDSDtshEasx4Dq2WaF8ZFA