10

Como vocês esperam que o botão "Run" funcione em um editor SQL?

No desenvolvimento do LibreDB Studio, um dos nossos contribuidores voluntários levantou uma questão interessante sobre o comportamento de múltiplas instruções SQL quando o usuário clica em Run.

Em vez de simplesmente decidir internamente, queria ouvir quem realmente usa SQL editors no dia a dia.

Por exemplo:

CREATE TABLE test (...);

INSERT INTO test VALUES (...);

SELECT * FROM test;

Ao clicar em Run, o que você esperaria que acontecesse?

Algumas possibilidades:

  1. Executar todas as instruções

Run executa todo o conteúdo do editor
Run Selection pode ser usado quando você quer executar apenas uma parte

  1. Executar a instrução atual

Run executa a instrução onde o cursor está
Run All executa todo o conteúdo do editor

  1. A seleção tem prioridade

Sem seleção > executa a instrução atual
Com seleção > executa as instruções selecionadas
Run All fica disponível separadamente

  1. Outra abordagem :)

Também existem alguns casos interessantes quando há várias instruções.

Por exemplo: se eu executar as três instruções acima, vocês esperariam que elas fossem executadas dentro de uma transaction automaticamente, ou preferem que transaction handling seja sempre explícito?

Estou particularmente interessado em saber o que vocês já estão acostumados a usar em ferramentas como DBeaver, DataGrip, SSMS, pgAdmin, TablePlus, Toad, PL/SQL Developer, phpMyAdmin, etc.

Não estou procurando necessariamente qual seria a implementação "correta". Quero entender o comportamento que parece mais natural para quem usa essas ferramentas.

Se puderem compartilhar qual editor vocês usam e como o Run funciona nele, seria ainda mais útil.

A discussão original também está acontecendo no GitHub:

Source code: https://github.com/libredb/libredb-studio

Discussion: https://github.com/orgs/libredb/discussions/776

Carregando publicação patrocinada...
8

Já usei bastante SSMS e DBeaver e particularmente para mim, o modo que o DBeaver executa instruções é o melhor: Executar a área selecionada pelo cursor, se não selecionar nada executa a instrução da linha (ou até o ponto e vírgula mais próximo).

Se quiser executar tudo deve selecionar propositalmente tudo (só dar CTRL A).

No SSMS acontecia muito de eu estar num arquivo com vários comandos, e sem querer dar um F5 e não perceber que tinha um DELETE, UPDATE etc. escondido ali no meio.

1

Esse é um ótimo exemplo, obrigado por compartilhar.

Principalmente o caso do SSMS com DELETE ou UPDATE escondido no meio do arquivo. Esse tipo de situação é justamente o que torna essa decisão mais interessante do que parece à primeira vista.

Também é interessante ver que, para quem já está acostumado com o DBeaver, executar a instrução atual por padrão parece muito mais natural, e executar tudo exige uma ação explícita.

Vou levar esse feedback para a discussão no GitHub. Obrigado!

4

Acho que se eu estou digitando SQL na mão, eu provavelmente sei o que é transaction. E eu usaria se quisesse.
No máximo você aí deve executar as instruções na sequência. Acho que o software não deve inferir que o usuário quer uma transaction. Ele deve ser literal.

Já sobre o botão de run, ele deve executar tudo, ou o selecionado. Não inferir também que o usuário sabe que é onde o cursor tá.

Basicamente. Banco de dados é algo precioso demais pra gente deixar um software inventando moda. Melhor seguir o padrão.

Essa é minha opinião.

1

Faz sentido, obrigado por compartilhar sua opinião.

Essa parte sobre não inferir uma transaction é especialmente interessante. Também estamos tentando entender até onde o editor deve ser "literal" e até onde deve tentar adivinhar a intenção do usuário.

E sobre o Run, é justamente esse comportamento que estamos tentando validar com a comunidade: executar tudo por padrão e usar a seleção quando o usuário quiser executar apenas uma parte.

Vou acompanhar as respostas por aqui e levar o feedback para a discussão no GitHub.

1

Concordo. Quando comecei a usar o DBeaver eu sofri bastante com a configuração padrão dele. Alterei pra executar tudo o que está no arquivo de uma vez.

No meu caso sofri bastante porque a maioria das Queries que faço eu uso variáveis declaradas, então era horrível ter que ficar selecionando o arquivo inteiro para que ele entendesse que eu queria a declaração das variáveis junto na execução.

E, por garantia, eu não tenho costume de misturar queries com intenções diferentes no mesmo arquivo. Se a minha intenção é um UPDATE ou DELETE, eu abro um novo arquivo para fazer a query específica. Além de garantir usando TRANSACTION.

1
2

Hoje eu uso o Dbeaver, que como os comentários anteriores já explanaram, o botão 'Run' executa a linha atual onde está o cursor.

Apesar disso, confesso que isso passou a fazer sentido depois de ser 'forçado' a me adaptar, porque pra mim, antes disso, selecionar a instrução e então clicar no botão, faria a execução ser específica e quando nada estiver selecionado, o botão executaria o todo.

1

Esse comentário é muito interessante, porque toca justamente em uma preocupação que eu tenho.

Às vezes uma interação pode parecer natural depois que você se acostuma com ela, mas não ser tão óbvia para quem está usando pela primeira vez.

Talvez a questão não seja simplesmente escolher entre "executar tudo" ou "executar a instrução atual". Talvez dê para pensar em uma interação que seja mais fácil de descobrir e entender sem precisar aprender uma regra específica do editor.

Por exemplo, deixar visualmente muito claro o que será executado, ou tornar explícita a diferença entre executar a seleção, a instrução atual e o arquivo inteiro.

Esse é exatamente o tipo de feedback que eu queria encontrar aqui. Obrigado por compartilhar sua experiência

2

Como vamos estar colocando as querys manualmente já esperamos que todas sejam executadas em sequencia. Isso de rodar uma, aí aperta pra rodar a outra não faz muito sentido. Acho que o melhor é igual do PHPmyadmin mesmo. Já roda o que a pessoa quer que roda. Se ela quer que rode por partes, vai pondo as partes.

1

Faz sentido. Obrigado por compartilhar sua experiência.

É interessante ver como o comportamento que parece mais natural depende bastante da ferramenta que a pessoa já usa. Aqui já apareceram opiniões diferentes entre DBeaver, SSMS e phpMyAdmin.

É justamente esse tipo de feedback que eu queria coletar antes de tomar uma decisão no LibreDB Studio. Vou acompanhar a discussão e levar essas experiências para o GitHub também.

1

Pra mim faz sentido que, caso tenha algo selecionado, executa só a seleção. Se não tiver nada selecionado, executa todo arquivo.

Mas entendo que é algo passível de ter uma configuração para que o usuário possa escolher como quer. Mas o padrão deve ser executar tudo.

Outra coisa que sugiro é, caso detecte a existência de mais de um comando, exibir um alerta de que todo o arquivo será executado. Um atrito leve que julgo ser justificável.

1

Gostei bastante dessa ideia, principalmente do alerta quando houver mais de uma instrução.

A ideia de ter um pequeno atrito antes de executar um arquivo com vários comandos pode ajudar a evitar execuções acidentais, sem tornar o fluxo normal muito mais complicado.

E a possibilidade de deixar esse comportamento configurável também é algo que estamos considerando.

Obrigado pelo feedback! Vou adicionar essa sugestão à nossa discussão no GitHub.