# #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 || '%'
.