package std import ( "database/sql" "fmt" "github.com/ClickHouse/clickhouse-go/v2" clickhouse_tests "github.com/ClickHouse/clickhouse-go/v2/tests/std" "time" ) func BindParameters() error { conn, err := GetStdOpenDBConnection(clickhouse.Native, nil, nil, nil) if err != nil { return err } const ddl = ` CREATE TABLE example ( Col1 UInt8 , Col2 String , Col3 DateTime ) ENGINE = Memory ` if _, err := conn.Exec(`DROP TABLE IF EXISTS example`); err != nil { return err } if _, err := conn.Exec(ddl); err != nil { return err } scope, err := conn.Begin() if err != nil { return err } datetime := time.Now() { scope, err := conn.Begin() if err != nil { return err } batch, err := scope.Prepare("INSERT INTO example") if err != nil { return err } for i := 0; i < 10; i++ { if _, err := batch.Exec(uint8(i), "ClickHouse Inc.", datetime.Add(time.Duration(i)*time.Hour)); err != nil { return err } } if err := scope.Commit(); err != nil { return err } } if err := scope.Commit(); err != nil { return err } var result struct { Col1 uint8 Col2 string Col3 time.Time } // numeric bind if err := conn.QueryRow(`SELECT * FROM example WHERE Col1 = $1 AND Col3 = $2`, 2, datetime.Add(time.Duration(2)*time.Hour)).Scan( &result.Col1, &result.Col2, &result.Col3, ); err != nil { return err } fmt.Println(clickhouse_tests.ToJson(result)) // named bind if err := conn.QueryRow(`SELECT * FROM example WHERE Col1 = @Col1 AND Col3 = @Col2`, sql.Named("Col1", 4), sql.Named("Col2", datetime.Add(time.Duration(4)*time.Hour)), ).Scan( &result.Col1, &result.Col2, &result.Col3, ); err != nil { return err } fmt.Println(clickhouse_tests.ToJson(result)) // positional bind if err := conn.QueryRow(`SELECT * FROM example WHERE Col1 = ? AND Col3 = ?`, 6, datetime.Add(time.Duration(6)*time.Hour), ).Scan( &result.Col1, &result.Col2, &result.Col3, ); err != nil { return err } fmt.Println(clickhouse_tests.ToJson(result)) return nil }