导言
InterSystems IRIS 数据平台一直以其性能、互操作性和跨编程语言的灵活性而著称。多年来,开发人员可以将 IRIS 与 Python、Java、JavaScript 和 .NET 结合使用,但 Go(或Golang)开发人员却只能望洋兴叹。

这种等待终于结束了。
新的go-irisnative驱动程序为 InterSystems IRIS 带来了GoLang 支持,实现了标准的 database/sql API。这意味着 Go 开发人员现在可以使用熟悉的数据库工具、连接池和查询接口来构建由 IRIS 支持的应用程序。
为什么要支持 GoLang
GoLang 是一种专为简单性、并发性和性能而设计的语言,是云原生和基于微服务架构的理想选择。它为 Kubernetes、Docker 和 Terraform 等一些世界上最具可扩展性的系统提供了支持。
将 IRIS 引入 Go 生态系统可实现以下目标
- 使用 IRIS 作为后台的轻量级高性能服务。
- 并行查询执行或后台处理的本机并发性。
- 与容器化和分布式系统无缝集成。
- 通过 Go 的
database/sql界面进行自动化数据库访问。
这种集成使 IRIS 成为现代云就绪 Go 应用程序的完美选择。
开始使用
1.安装
go get github.com/caretdev/go-irisnative
2.连接 IRIS
下面介绍如何使用标准的 database/sql API 进行连接:
import (
"database/sql"
"fmt"
"log"
_ "github.com/caretdev/go-irisnative"
)
func main() {
db, err := sql.Open("iris", "iris://_SYSTEM:SYS@localhost:1972/USER")
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Simple ping to test connection
if err := db.Ping(); err != nil {
log.Fatal("Failed to connect:", err)
}
fmt.Println("Connected to InterSystems IRIS!")
}
3.创建表格
让我们创建一个简单的演示表:
_, err = db.Exec(`CREATE TABLE IF NOT EXISTS demo (
id INT PRIMARY KEY,
name VARCHAR(50)
)`)
if err != nil {
log.Fatal(err)
}
fmt.Println("Table created.")
4.插入数据
目前不支持多行插入- 每次调用只插入一行:
_, err = db.Exec(`INSERT INTO demo (id, name) VALUES (?, ?)`, 1, "Alice")
if err != nil {
log.Fatal(err)
}
_, err = db.Exec(`INSERT INTO demo (id, name) VALUES (?, ?)`, 2, "Bob")
if err != nil {
log.Fatal(err)
}
fmt.Println("Data inserted.")
5.查询数据
使用 database/sql 界面可直接进行查询:
rows, err := db.Query(`SELECT id, name FROM demo`)
if err != nil {
log.Fatal(err)
}
defer rows.Close()
for rows.Next() {
var id int
var name string
if err := rows.Scan(&id, &name); err != nil {
log.Fatal(err)
}
fmt.Printf("ID: %d, Name: %s\n", id, name)
}
这就是在 Go 中执行基本 SQL 操作所需的全部内容。
如何运行
在引擎盖下,go-irisnative驱动程序使用IRIS Native API与数据库进行高效的底层通信。该驱动程序实现了 Go 的标准 database/sql/driver 接口,因此可与现有的 Go 工具兼容,例如:IRIS Native API、IRIS Native API、IRIS Native API、IRIS Native API、IRIS Native API:
sqlxgorm(使用自定义方言)- 标准 Go 移植工具
这为开发人员提供了一个熟悉的 API,具有本地 IRIS 访问的功能和性能。
使用实例
- 微服务:轻量级Go服务直接连接到IRIS。
- 数据API:通过REST或gRPC端点暴露IRIS数据。
- 集成工具:在Go管道中桥接IRIS数据与其他系统。
- 云原生IRIS应用:在Kubernetes或Docker上部署基于IRIS的Go应用。
使用测试容器进行测试
如果您想运行自动化测试而无需管理实时IRIS实例,可以使用testcontainers-iris-go。
它会启动一个临时 IRIS 容器进行集成测试。
测试设置示例:
import (
"context"
"database/sql"
"flag"
"log"
"os"
"testing"
iriscontainer "github.com/caretdev/testcontainers-iris-go"
"github.com/stretchr/testify/require"
"github.com/testcontainers/testcontainers-go"
)
var connectionString string = "iris://_SYSTEM:SYS@localhost:1972/USER"
var container *iriscontainer.IRISContainer = nil
func TestMain(m *testing.M) {
var (
useContainer bool
containerImage string
)
flag.BoolVar(&useContainer, "container", true, "Use container image.")
flag.StringVar(&containerImage, "container-image", "", "Container image.")
flag.Parse()
var err error
ctx := context.Background()
if useContainer || containerImage != "" {
options := []testcontainers.ContainerCustomizer{
iriscontainer.WithNamespace("TEST"),
iriscontainer.WithUsername("testuser"),
iriscontainer.WithPassword("testpassword"),
}
if containerImage != "" {
container, err = iriscontainer.Run(ctx, containerImage, options...)
} else {
// or use default docker image
container, err = iriscontainer.RunContainer(ctx, options...)
}
if err != nil {
log.Println("Failed to start container:", err)
os.Exit(1)
}
defer container.Terminate(ctx)
connectionString = container.MustConnectionString(ctx)
log.Println("Container started successfully", connectionString)
}
var exitCode int = 0
exitCode = m.Run()
if container != nil {
container.Terminate(ctx)
}
os.Exit(exitCode)
}
func openDbWrapper[T require.TestingT](t T, dsn string) *sql.DB {
db, err := sql.Open(`intersystems`, dsn)
require.NoError(t, err)
require.NoError(t, db.Ping())
return db
}
func closeDbWrapper[T require.TestingT](t T, db *sql.DB) {
if db == nil {
return
}
require.NoError(t, db.Close())
}
func TestConnect(t *testing.T) {
db := openDbWrapper(t, connectionString)
defer closeDbWrapper(t, db)
var (
namespace string
username string
)
res := db.QueryRow(`SELECT $namespace, $username`)
require.NoError(t, res.Scan(&namespace, &username))
require.Equal(t, "TEST", namespace)
require.Equal(t, "testuser", username)
}
这是CI/CD 管道或单元测试的理想选择,可确保 Go 应用程序与 IRIS 在隔离状态下无缝运行。
结论
InterSystems IRIS对Go语言的支持现已到来,这无疑是一个变革性的进步。
通过go-irisnative,您现在可以直接利用 IRIS 的强大功能构建可扩展、并发和云原生的应用程序。
无论您是要构建微服务、API 还是集成工具,Go 都能为您提供简单性和性能,而 IRIS 则能为您提供可靠性和丰富的数据功能。
👉 来试一试吧!
.png)

.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
.png)
