Как запросить Cassandra UDT с помощью gocql?

Таблица кассандры и 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)
);

структура голанга

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,
)

С этим кодом он возвращает значение not found, даже если есть запись в таблице cassandra. Как запросить UDT с помощью gocql?


person Chandu    schedule 05.10.2020    source источник


Ответы (1)


Попробуйте определить свою структуру таким образом (используйте 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)
    }
person bswynn    schedule 06.10.2020