如何使用gocql查询cassandra UDT?

问题描述

Cassandra表和UDT

CREATE TYPE IF NOT EXISTS phone_type(
   code TEXT,phone TEXT,);

CREATE TABLE IF NOT EXISTS user_by_phone(
    user_id UUID,phone FROZEN<phone_type>,password TEXT,PRIMARY KEY (phone)
);

golang结构

type PhoneType struct {
    Code  string `json:"code"`
    Phone string `json:"phone"`
}
phone := PhoneType{
    Code:  "+1",Phone: "7777777777",}

gqcql查询

err := Session.Query("SELECT user_id,password FROM user_by_phone WHERE phone=?;",phone).Scan(
    &user.UserID,&user.Password,)

使用此代码,即使在cassandra表中有记录,也不会返回。 如何使用gocql通过UDT查询

解决方法

尝试这样定义您的结构(在结构定义中使用cql代替json

type PhoneType struct {
    Code  string `cql:"code"`
    Phone string `cql:"phone"`
}

phone := PhoneType{
    Code:  "+1",Phone: "7777777777",}

根据此处的示例: https://github.com/gocql/gocql/blob/master/udt_test.go

然后对我有用:

    var id gocql.UUID
    var password string
    
    iter := session.Query("SELECT user_id,password FROM user_by_phone WHERE phone=?;",phone).Iter()
    for iter.Scan(&id,&password) {
        fmt.Println("Phone Record:",id,password)
    }
    if err := iter.Close(); err != nil {
        log.Fatal(err)
    }