Именованный параметр SQLC в сгенерированном коде для sql, содержащем условное где

# #postgresql #go #sqlc

Вопрос:

Я использую golang SQLC для генерации кода операции CRUD go из sql.

Мой запрос на выбор выглядит следующим образом

 -- name: SearchProducts :many
SELECT * FROM product
WHERE ( $1::varchar(100) IS NULL OR name LIKE  '%$1%' )
AND ( $2::varchar(1000) IS NULL OR description LIKE  '%$2%' );
 

SQLC генерирует код, подобный приведенному ниже

 type SearchProductsParams struct {
    Column1 string `json:"column_1"`
    Column2 string `json:"column_2"`
}

func (q *Queries) SearchProducts(ctx context.Context, arg SearchProductsParams) ([]Product, error) {
    rows, err := q.db.QueryContext(ctx, searchProducts, arg.Column1, arg.Column2)
    if err != nil {
        return nil, err
    }
....
 

Есть ли способ настроить sqlc так, чтобы он использовал имя и описание вместо столбца 1 и столбца 2 в SearchProductsParams struct

Комментарии:

1. Что касается именованных параметров, возможно, то, что вы ищете, описано здесь: docs.sqlc.dev/en/latest/howto/named_parameters.html .

2. Используйте объединение строк внутри SQL, например name LIKE '%' || $1 || '%' .

3. Спасибо! @mkopriva

4. Это не поможет , потому $1 что само по себе никогда не будет NULL , если тип переданного значения есть string , и приведение его к любому типу не приведет к этому NULL . Вы можете просто свериться с пустой строкой, например $1 = '' OR name LIKE '%' || $1 || '%' .

5. В Go единственный способ, которым параметр может привести к результату NULL , — это если тип аргумента является одним из тех типов, которые могут быть nil . Например, если бы у вас было Column1 *string , то Column1 это могло бы быть nil и, следовательно $1 , потенциально могло бы привести к NULL , и тогда имело бы смысл иметь условное подобное $1 IS NULL . Но если $1 этого не может быть NULL в первую очередь, то это условие просто не нужно, вы могли бы с таким же успехом написать false OR name LIKE '%' || $1 || '%' .