通过Go连接实例
本节主要介绍使用Go语言连接GeminiDB Cassandra的基本读写操作。
前提条件
操作步骤
- 获取GeminiDB Cassandra实例的内网IP地址、端口。
内网IP地址和端口的获取方法请参见查看IP地址和端口。
- 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“登录弹性云服务器”。
- 编辑连接GeminiDB Cassandra实例的代码。
import ( "os" ) // Default LoadBalancingPolicy RoundRobinHostPolicy cluster := gocql.NewCluster("127.0.0.1,127.0.0.2,127.0.0.3") // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放、使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 username = os.Getenv("EXAMPLE_USERNAME_ENV"), password = os.Getenv("EXAMPLE_PASSWORD_ENV"), cluster.Authenticator = gocql.PasswordAuthenticator{ Username: username, Password: password } cluster.Keyspace = "ks1" // connect to the cluster session, err := cluster.CreateSession() if err != nil { log.Fatal(err) } defer session.Close()
- 运行示例代码,确认结果是否正常。
执行读写
使用 Session.Query 创建查询。查询参数不能用于其他语句,并且不能在开始查询之后进行修改。
要在不读取结果的情况下执行查询,请使用 Query.Exec:
err := session.Query(`INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?)`, "me", gocql.TimeUUID(), "hello world").WithContext(ctx).Exec()
可以通过调用 Query.Scan 读取单行:
err := session.Query(`SELECT id, text FROM tweet WHERE timeline = ? LIMIT 1`, "me").WithContext(ctx).Consistency(gocql.One).Scan(&id, &text)
可以使用 Iter.Scanner 读取多行:
scanner := session.Query(`SELECT id, text FROM tweet WHERE timeline = ?`, "me").WithContext(ctx).Iter().Scanner() for scanner.Next() { var ( id gocql.UUID text string ) err = scanner.Scan(&id, &text) if err != nil { log.Fatal(err) } fmt.Println("Tweet:", id, text) } // scanner.Err() closes the iterator, so scanner nor iter should be used afterwards. if err := scanner.Err(); err != nil { log.Fatal(err) }
同时执行多个查询
从多个Goroutine中使用Session是安全的,因此要执行多个并发查询,只需从多个Worker Goroutine中执行它们即可。
results := make(chan error, 2) go func() { results <- session.Query(`INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?)`, "me", gocql.TimeUUID(), "hello world 1").Exec() }() go func() { results <- session.Query(`INSERT INTO tweet (timeline, id, text) VALUES (?, ?, ?)`, "me", gocql.TimeUUID(), "hello world 2").Exec() }()