package db import ( "fmt" "strings" "testing" ) func testCreateClickHouse(_ *testing.T) *ClickHouseRepo { host := "192.168.2.224" port := "9000" // port = 8123 username := "default" password := "123456" database := "samba" return NewClickHouseRepo(host, port, username, password, database) } func testSelect(t *testing.T) { ch := testCreateClickHouse(t) err := ch.Open() if err != nil { t.Fatal(err) } defer ch.Close() rows, err := ch.Select("select user_id, coins from coins_flow limit 1") if err != nil { t.Fatal(err) } defer func() { _ = rows.Close() }() cols, err := rows.Columns() if err != nil { t.Fatal(err) } fmt.Println(strings.Join(cols, ",")) // 一行数据,使用any,避开数据类型问题 var vRows = make([]any, len(cols)) // 存实际的值,byte数组,长度以列的数量为准 var values = make([][]byte, len(cols)) for i := 0; i < len(cols); i++ { vRows[i] = &values[i] } for rows.Next() { err = rows.Scan(vRows...) if err != nil { fmt.Println(err.Error()) break } var vString []string for _, v := range values { vString = append(vString, string(v)) } fmt.Println(vString, ",") } } func testInsert(t *testing.T) { ch := testCreateClickHouse(t) err := ch.Open() if err != nil { t.Fatal(err) } defer ch.Close() _, err = ch.Exec("INSERT INTO coins_flow(user_id, coins) VALUES (11,11)", 11, 11) if err != nil { t.Fatal(err) } // last, err := result.LastInsertId() // if err != nil { // t.Fatal(err) // } // fmt.Println(last) } func testDelete(t *testing.T) { ch := testCreateClickHouse(t) err := ch.Open() if err != nil { t.Fatal(err) } defer ch.Close() _, err = ch.Exec("DELETE FROM coins_flow WHERE user_id = 11 AND coins = 11") if err != nil { t.Fatal(err) } // last, err := result.LastInsertId() // if err != nil { // t.Fatal(err) // } // fmt.Println(last) } func TestClickHouse(t *testing.T) { testSelect(t) // testInsert(t) testDelete(t) }