clickhouse-go icon indicating copy to clipboard operation
clickhouse-go copied to clipboard

Select Example Require Preparestatement

Open secoba opened this issue 1 year ago • 2 comments

Need more select query with preparestatement ....

secoba avatar Mar 07 '23 10:03 secoba

Hi @secoba

Not sure I understand your need. Could you elaborate?

jkaflik avatar Mar 08 '23 05:03 jkaflik

package main

import (
	"database/sql"
	"log"
	"time"

	clickhouse "github.com/ClickHouse/clickhouse-go/v2"
)

func ConnectCH(addr string, database string, username string, password string) *sql.DB {
	conn := clickhouse.OpenDB(&clickhouse.Options{
		Addr: []string{addr},
		Auth: clickhouse.Auth{
			Database: database,
			Username: username,
			Password: password,
		},
		Settings: clickhouse.Settings{
			"max_execution_time": 60,
		},
		DialTimeout: time.Second * 30,
		Compression: &clickhouse.Compression{
			Method: clickhouse.CompressionLZ4,
		},
		Debug:                false,
		BlockBufferSize:      10,
		MaxCompressionBuffer: 10240,
		ClientInfo: clickhouse.ClientInfo{
			Products: []struct {
				Name    string
				Version string
			}{{Name: "123", Version: ""}},
		},
	})
	conn.SetMaxIdleConns(10)
	conn.SetMaxOpenConns(20)
	conn.SetConnMaxLifetime(time.Hour)
	if err := conn.Ping(); err != nil {
		conn.Close()
		log.Fatalln(err)
	}
	return conn
}

func q1(db *sql.DB) error {
	stmt, err := db.Prepare(`SELECT name FROM funds WHERE symbol=? LIMIT 1`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	var name string
	rows, err := stmt.Query("abc")
	if err != nil {
		return err
	}
	if rows.Next() {
		if err := rows.Scan(&name); err != nil {
			_ = rows.Close()
			return err
		}
	}
	_ = rows.Close()
	return nil
}

func q2(db *sql.DB) error {
	stmt, err := db.Prepare(`SELECT name FROM funds WHERE symbol={symbol:str} LIMIT 1`)
	if err != nil {
		return err
	}
	defer stmt.Close()

	var name string
	rows, err := stmt.Query(clickhouse.Named("symbol", "abc"))
	if err != nil {
		return err
	}
	if rows.Next() {
		if err := rows.Scan(&name); err != nil {
			_ = rows.Close()
			return err
		}
	}
	_ = rows.Close()
	return nil
}

func main() {
	log.SetFlags(log.LstdFlags | log.Lshortfile)
	db := ConnectCH("10.43.55.162:9000", "test", "test", "test")
	log.Println(q1(db))
	log.Println(q2(db))
}
2023/08/03 00:18:21 test.go:93: code: 62, message: Syntax error: failed at position 37 ('?'): ? LIMIT 1 VALUES. Expected one of: CAST operator, ANY, ALL, NOT, INTERVAL, CASE, DATE, TIMESTAMP, tuple, collection of literals, array, number, literal, NULL, Bool, true, false, string literal, asterisk, qualified asterisk, compound identifier, list of elements, identifier, COLUMNS matcher, COLUMNS, qualified COLUMNS matcher, substitution, MySQL-style global variable
2023/08/03 00:18:21 test.go:94: code: 62, message: Syntax error: failed at position 58 ('VALUES'): VALUES. Expected one of: token, DoubleColon, OR, AND, IS NULL, IS NOT NULL, BETWEEN, NOT BETWEEN, LIKE, ILIKE, NOT LIKE, NOT ILIKE, REGEXP, IN, NOT IN, GLOBAL IN, GLOBAL NOT IN, MOD, DIV, alias, AS, Comma, OFFSET, WITH TIES, BY, FETCH, LIMIT, SETTINGS, UNION, EXCEPT, INTERSECT, INTO OUTFILE, FORMAT, end of query

fungaren avatar Aug 02 '23 16:08 fungaren