Consulta SQL++ / N1QL

De N1QL para JavaScript e vice-versa - Parte 5: declarações preparadas

Em blogs anteriores, abordamos a execução do N1QL (SQL++) a partir do JavaScript funções, processamento de documentos por meio de iteradores, manipulação de dados. e tratamento de erros.

Passamos agora para execução de instruções dinâmicas.

Declarações preparadas

As funções JavaScript podem preparar e executar instruções preparadas, da mesma forma que qualquer solicitação, por exemplo:

Antes de nos aprofundarmos nos detalhes da preparação e execução de instruções preparadas, devemos mencionar alguns aspectos sobre as instruções preparadas do N1QL:

    • As instruções preparadas no N1QL não são privadas para uma solicitação, mas são compartilhadas entre todo o nó. É definitivamente possível, ou melhor, incentivado, usar declarações previamente preparadas por outra pessoa.
    • Isso significa que o escopo do nome do comando preparado é o contexto_de_consulta usado no momento em que foi criado. Não é possível ter duas declarações com o mesmo nome no mesmo query_context.
    • Se permitir que o N1QL atribua nomes no momento da preparação, os comandos preparados não serão diferentes de qualquer mecanismo relacional.
    • Se você mesmo atribuir nomes, lembre-se de que é necessário mantê-los exclusivos dentro do contexto_de_consulta definido por sua solicitação. É uma boa ideia usar um esquema de nomenclatura exclusivo, como um prefixo de aplicativo.
    • Além disso, se você estiver preparando uma declaração que já existe, o texto da declaração deverá corresponder ao texto da declaração existente. Isso evita que o significado de uma declaração preparada seja alterado pelas costas de outra pessoa.

De volta às instruções preparadas em funções JavaScript!

Você pode:

    • preparar e executar uma declaração
    • preparar uma declaração para alguma outra função/solicitação a ser usada
    • executar uma instrução existente
    • até mesmo executar uma instrução passada como parâmetro de função (embora seja possivelmente arriscado fazer isso, por exemplo, injeção de código)

Preparar e executar

Já vimos a preparação e a execução de um comando nomeado no exemplo anterior. Agora, vamos explorar como preparar e executar um comando preparado anônimo.

Em geral, você precisa processar os resultados do PREPARAR extrair o nome e construir uma declaração EXECUTAR assim:

O exemplo acima também demonstra como usar iteradores. Se você achar isso feio, poderá fazer um loop nos resultados da preparação para obter o nome:

O exemplo acima funciona porque PREPARAR retorna apenas um documento, o plano de declaração preparado, e o escopo da variável preparação declarado no para é a função real, portanto, é visível após o final do próprio loop.

Para ser justo, nenhum dos exemplos parece particularmente elegante, mas ainda assim.

O que deve ser observado é que EXECUTAR não aceita parâmetros, portanto, você precisa construir uma string de instrução, o que significa usar o N1QL() função.

Embora isso não seja um problema neste exemplo específico, é melhor incluir o nome do comando entre aspas, por um lado para poder lidar com nomes de comandos especificados em formato distribuído, mas, mais importante, para evitar qualquer risco de injeção de N1QL: digamos que o nome do comando tenha sido passado como parâmetro para a função:

Um usuário nefasto poderia muito bem executá-lo:

Se você não tivesse colocado o nome entre aspas, ele estaria executando uma função potencialmente perigosa, não uma declaração preparada!

Isso evita o risco:

Passagem de valores de espaço reservado para instruções EXECUTE

É mais provável que você tenha que passar valores de espaço reservado para o comando preparado enquanto o executa.

Para placeholders posicionais, isso não é realmente diferente dos comandos não preparados: você precisa usar o N1QL() por exemplo

Quando se trata de parâmetros nomeados, os pontos a serem considerados são os seguintes:

    • O transpilador não tem visibilidade do texto do comando preparado; o que ele está analisando e reescrevendo é apenas o comando EXECUTE. Portanto, ele não sabe realmente quais nomes de variáveis deve usar para construir o comando N1QL() ligar.
    • O EXECUTAR ... USANDO permite apenas valores estáticos na declaração USO para evitar ambiguidade entre os parâmetros definidos no corpo da solicitação e os parâmetros definidos na cláusula USO cláusula.

O resultado líquido é que, a menos que você queira usar valores estáticos (strings, números, etc.), onde EXECUTAR ... USANDO seria uma opção viável (também para parâmetros nomeados); atualmente, a única opção viável é o N1QL() função:

Em versões posteriores, o transpilador será estendido para lidar com o EXECUTAR declaração.

Prepared statements e loops

Considere a seguinte função:

O que essa função faz é executar um INSERIR para cada documento recuperado.

Isso exige que o JavaScript worker peça ao serviço N1QL para analisar e planejar o INSERIR para cada documento recuperado.

Uma maneira melhor é usar declarações preparadas:

Conclusão

Agora, abordamos todas as maneiras possíveis de coletar e manipular dados executando instruções N1QL em funções JavaScript.

Em seguida, abordaremos alguns tópicos avançados, como Chamadas de função aninhadas, segurança e transações.

Compartilhe este artigo
Receba atualizações do blog do Couchbase em sua caixa de entrada
Esse campo é obrigatório.

Autor

Postado por Marco Greco, arquiteto de software, Couchbase

Em uma vida anterior, Marco foi CTO, físico de radiação, arquiteto de software, administrador de sistemas, DBA, instrutor e faz-tudo na maior clínica de radioterapia da Itália. Depois de mudar de carreira e de país, ele passou mais de duas décadas em vários cargos de suporte e desenvolvimento na Informix, primeiro, e na IBM, depois, antes de finalmente mergulhar de cabeça e entrar para a Couchbase, para ajudá-los a fazer do N1QL um ouro. Ele é detentor de várias patentes e é autor de seus próprios projetos de código aberto.

Deixe um comentário

Pronto para começar a usar o Couchbase Capella?

Iniciar a construção

Confira nosso portal do desenvolvedor para explorar o NoSQL, procurar recursos e começar a usar os tutoriais.

Use o Capella gratuitamente

Comece a trabalhar com o Couchbase em apenas alguns cliques. O Capella DBaaS é a maneira mais fácil e rápida de começar.

Entre em contato

Deseja saber mais sobre as ofertas do Couchbase? Deixe-nos ajudar.