純 Go 實現的 MySQL 引擎——go-mysql-server

go-mysql-server 是一個用 Go 編寫的 MySQL 兼容的查詢引擎。它不僅是一個解析器,還是一個服務器和查詢執行引擎,完全使用 Go 語言編寫。與 Dolt 一樣,它的目標是成爲 MySQL 的 100% 兼容的替代品。

go-mysql-server 具有以下兩個主要用途:

  1. 作爲 Golang 測試環境中 MySQL 的替代品,使用內置的內存數據庫實現。

  2. 通過實現一些接口,提供對任意數據源的 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