Usando Parâmetros em Consultas do Data Explorer

Parâmetros são uma ferramenta poderosa que pode ser usada em consultas do Data Explorer no Discourse. Parâmetros permitem consultas mais dinâmicas e personalizáveis, e em vez de codificar valores fixos em suas consultas, você pode declarar variáveis que solicitarão entrada quando a consulta for executada.

Declarando um Parâmetro

Para declarar um parâmetro, você pode usar a seguinte sintaxe:

-- [params]
-- int :parameter_name = 10

A seção de parâmetros da consulta sempre começará com -- [params], seguida por cada tipo de parâmetro em uma nova linha, onde parameter_name será substituído pelo nome do seu parâmetro.

Isso criará um campo onde você pode inserir diferentes valores cada vez que executar a consulta.

Tipos de Parâmetros

Ao declarar parâmetros em suas consultas do Data Explorer, você pode especificar diferentes tipos de entrada. Aqui estão os tipos de parâmetro disponíveis e suas descrições:

Parâmetros Numéricos

  • int: Mostra uma entrada de número, torna-se um valor numérico. int é restrito a números de 32 bits.
  • bigint: Semelhante a int, mas pode ser maior.
  • double: Permite valores decimais.

A correção dos parâmetros numéricos será verificada no front-end.

Parâmetros de String

  • string: Caixa de texto de formato livre, torna-se um valor de texto.

Parâmetros de Lista

  • int_list: Insira inteiros separados por vírgulas, torna-se inteiros separados por vírgulas na consulta.
  • string_list: Semelhante a int_list, mas para strings.

Parâmetros de ID Específicos

  • post_id: Entrada numérica; garante que a postagem especificada exista no fórum antes de executar a consulta.
  • topic_id: Semelhante a post_id, mas para tópicos.
  • badge_id: Garante que o emblema especificado exista.

Parâmetros Booleanos

  • boolean: Mostra uma caixa de seleção.
  • null boolean: Mostra um menu suspenso, permitindo uma entrada vazia.

Parâmetros de Tempo

  • time: Exibe uma entrada de seletor de hora.
  • date: Exibe uma entrada de seletor de data.
  • datetime: Exibe uma caixa de entrada que inclui data e hora.

Parâmetros de Seleção

  • user_id: Mostra a caixa de seleção de usuário do Discourse e se torna o ID numérico do usuário.
  • user_list: Semelhante a user_id, mas permite múltiplos usuários, tornando-se uma lista separada por vírgulas dos IDs numéricos dos usuários.
  • group_id: Semelhante a user_id, mas para grupos.
  • group_list: Semelhante a user_list, mas para grupos.
  • category_id: Semelhante a user_id, mas para categorias.

Parâmetros Internos

  • current_user_id: Nenhuma interface de entrada; define automaticamente a variável para o ID do usuário que está executando a consulta

Usando Parâmetros de Lista

Ao usar parâmetros de lista (int_list, string_list, user_list), deve-se tomar cuidado especial para evitar erros de sintaxe. Aqui está um exemplo de como usar corretamente um parâmetro de lista:

-- [params]
-- user_list :the_user_ids
SELECT SUM(length(bio_raw))
FROM user_profiles
WHERE user_id IN (:the_user_ids)

Parâmetros Nulos

Você também pode permitir uma entrada vazia prefixando o tipo de parâmetro com null. Isso significa que não é necessário fornecer um valor para esse parâmetro ao executar a consulta.

Aqui estão alguns exemplos de como você declararia tais parâmetros:

-- [params]
-- null int :null_int
-- null boolean :null_boolean
-- null string :null_string
-- null current_user_id :me

No SQL acima, null_int, null_boolean e null_string são parâmetros que podem ser deixados vazios ao executar a consulta.

Vamos ver como esses tipos de parâmetros podem ser usados em uma consulta:

-- [params]
-- null int :post_id
-- null string :username
SELECT *
FROM users
WHERE (id = :post_id OR :post_id IS NULL)
AND (username = :username OR :username IS NULL)

Nesta consulta, se post_id ou username não for fornecido (ou seja, deixado como null), a consulta ignorará essa parte da cláusula WHERE. Isso permite consultas mais flexíveis onde algumas condições são opcionais.

Validação Front-end

A maioria dos tipos de parâmetros será validada no front-end. Essas validações incluem entradas obrigatórias, mas não preenchidas, entrada numérica inválida, categorias ou grupos inexistentes, horários mal formatados, etc. Para entrada inválida, o motivo do erro será exibido no formulário, e a operação de execução da consulta será rejeitada.

Exemplos Adicionais

Aqui estão alguns exemplos adicionais de declaração de diferentes tipos de parâmetros:

-- [params]
-- int             :int = 3
-- bigint          :bigint = 12345678912345
-- boolean         :boolean
-- null boolean    :boolean_three = #null
-- string          :string = little bunny foo foo
-- date            :date = 14 jul 2015
-- time            :time = 5:02 pm
-- datetime        :datetime = 14 jul 2015 5:02 pm
-- double          :double = 3.1415
-- string          :inet = 127.0.0.1/8
-- user_id         :user_id = system
-- post_id         :post_id = http://localhost:3000/t/adsfdsfajadsdafdsds-sf-awerjkldfdwe/21/1?u=system
-- topic_id        :topic_id = /t/-/21
-- int_list        :int_list = 1,2,3
-- string_list     :string_list = a,b,c
-- category_id     :category_id = meta
-- group_id        :group_id = admins
-- user_list       :mul_users = system,discobot
-- current_user_id :me 

Mais Tópicos Nesta Série

17 curtidas

Estes são ótimos guias, obrigado por postá-los @SaraDev :slight_smile: :hugs:

6 curtidas

@AlexDev
o nome de um campo na cláusula WHERE pode ser um parâmetro? obrigado
ou a instrução SQL inteira pode ser um parâmetro para passar do endpoint /admin/plugin/explorer/queries/id/run

PSA: Você não pode usar números em seus nomes de parâmetro, por exemplo, “foo123” falhará.

-- [params]
-- string       :foo123 = a

SELECT :foo123

resulta em

PG::SyntaxError: ERROR:  syntax error at or near ":"
LINE 10: SELECT :foo123
                ^
4 curtidas

Tentei chamar o endpoint de execução com parâmetros no payload JSON como

payload = {
    "params": {
        "request_post_id": "45"
    },
    "explain": False
}

Eu fiz engenharia reversa do payload da aba de desenvolvedor do Chrome
De alguma forma, continuo recebendo erro 500 do servidor

Alguém pode me ajudar?

PSA: isso foi adicionado recentemente por

2 curtidas