Estou tentando encontrar a melhor maneira de formatar uma string de consulta sql. Quando estou depurando meu aplicativo, gostaria de registrar para arquivar todas as strings de consulta sql, e é importante que a string esteja formatada corretamente.
Opção 1
def myquery():
sql = "select field1, field2, field3, field4 from table where condition1=1 and condition2=2"
con = mymodule.get_connection()
...
- Isso é bom para imprimir a string sql.
- Não é uma boa solução se a string for longa e não se ajustar à largura padrão de 80 caracteres.
opção 2
def query():
sql = """
select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
Aqui, o código é claro, mas quando você imprime a string de consulta sql, obtém todos esses espaços em branco irritantes.
u '\ nselecione campo1, campo2, campo3, campo4 \ n_ _ ___ da tabela \ n _ ___ onde condição1 = 1 \ n _ ___ _e condição2 = 2'
Observação: substituí os espaços em branco por sublinhados _
, porque eles são cortados pelo editor
Opção 3
def query():
sql = """select field1, field2, field3, field4
from table
where condition1=1
and condition2=2"""
con = mymodule.get_connection()
...
- Não gosto dessa opção porque quebra a clareza do código bem tabulado.
Opção 4
def query():
sql = "select field1, field2, field3, field4 " \
"from table " \
"where condition1=1 " \
"and condition2=2 "
con = mymodule.get_connection()
...
- Não gosto desta opção porque toda a digitação extra em cada linha e é difícil editar a consulta também.
Para mim, a melhor solução seria a Opção 2, mas não gosto dos espaços em branco extras quando imprimo a string sql.
Você conhece outras opções?
fonte
Respostas:
Desculpe por postar em um tópico tão antigo - mas como alguém que também compartilha a paixão pelo 'melhor' pythônico, pensei em compartilhar nossa solução.
A solução é construir instruções SQL usando String Literal Concatenation do python ( http://docs.python.org/ ), que pode ser qualificada em algum lugar entre a Opção 2 e a Opção 4
Amostra de código:
Funciona bem com f-strings :
Prós:
fonte
"""
e usartextwrap.dedent()
antes de"sql query"
para evitar mexer com strings SQL (que usam aspas simples como padrão)?Obviamente, você considerou muitas maneiras de escrever o SQL de forma que ele imprima bem, mas que tal mudar a instrução 'print' que você usa para o registro de depuração, em vez de escrever seu SQL de maneiras que você não gosta? Usando sua opção favorita acima, que tal uma função de registro como esta:
Isso também tornaria trivial adicionar lógica adicional para dividir a string registrada em várias linhas se a linha for maior do que o comprimento desejado.
fonte
A maneira mais limpa que encontrei é inspirada no guia de estilo sql .
Essencialmente, as palavras-chave que começam uma cláusula devem ser alinhadas à direita e os nomes dos campos, etc., devem ser alinhados à esquerda. Isso parece muito legal e também é mais fácil de depurar.
fonte
se o valor da condição for uma string, você pode fazer assim:
fonte
format()
strings SQL, é um grande cheiro de código.where condition1=:field1
e depois passar os valores como parâmetros. Se você estiver usando.format()
, haverá uma maneira de';DROP TABLE Users
inserir um em seu SQL. Dê uma olhada no PEP-249 para saber como usar os parâmetros corretamente. python.org/dev/peps/pep-0249/#paramstylePara evitar a formatação totalmente , acho que uma ótima solução é usar procedimentos .
Chamar um procedimento fornece o resultado de qualquer consulta que você deseja colocar neste procedimento. Na verdade, você pode processar várias consultas em um procedimento. A chamada retornará apenas a última consulta que foi chamada.
MYSQL
Pitão
fonte
você pode colocar os nomes dos campos em uma matriz "campos" e, em seguida:
fonte
Eu sugeriria ficar com a opção 2 (estou sempre usando para consultas mais complexas do que
SELECT * FROM table
) e se você quiser imprimi-lo de uma maneira agradável, você pode sempre usar um módulo separado .fonte
Para consultas curtas que podem caber em uma ou duas linhas, uso a solução literal de string na solução mais votada acima. Para consultas mais longas, divido-as em
.sql
arquivos. Em seguida, uso uma função de wrapper para carregar o arquivo e executar o script, algo como:É claro que isso geralmente fica dentro de uma classe, então geralmente não preciso passar
cursor
explicitamente. Eu também geralmente usocodecs.open()
, mas isso dá uma ideia geral. Então, os scripts SQL são completamente autocontidos em seus próprios arquivos com seu próprio realce de sintaxe.fonte
[editar em responder ao comentário]
Ter uma string SQL dentro de um método NÃO significa que você precisa "tabulá-la":
fonte
select
. Minha resposta não tem espaços iniciais. O que o leva a formar a opinião de que são iguais?