Tengo una consulta muy larga. Me gustaría dividirla en varias líneas en Python. Una forma de hacerlo en JavaScript sería utilizando varias sentencias y uniéndolas con un operador +
(lo sé, quizá no sea la forma más eficiente de hacerlo, pero no me preocupa mucho el rendimiento en esta fase, sólo la legibilidad del código). Ejemplo:
var long_string = 'some text not important. just garbage to' +
'illustrate my example';
Intenté hacer algo similar en Python, pero no funcionó, así que utilicé `` para dividir la cadena larga. Sin embargo, no estoy seguro de si esta es la única/mejor/pitónica manera de hacerlo. Parece incómodo. Código actual:
query = 'SELECT action.descr as "action", '\
'role.id as role_id,'\
'role.descr as role'\
'FROM '\
'public.role_action_def,'\
'public.role,'\
'public.record_def, '\
'public.action'\
'WHERE role.id = role_action_def.role_id AND'\
'record_def.id = role_action_def.def_id AND'\
'action.id = role_action_def.action_id AND'\
'role_action_def.account_id = ' + account_id + ' AND'\
'record_def.account_id=' + account_id + ' AND'\
'def_id=' + def_id
¿Se trata de cadenas de varias líneas? Fácil, usa las comillas triples para empezar y terminarlas.
s = """ this is a very
long string if I had the
energy to type more and more ..."""
También puedes usar comillas simples (3 de ellas, por supuesto, al principio y al final) y tratar la cadena resultante s
como cualquier otra cadena.
NOTA: Al igual que con cualquier cadena, cualquier cosa entre las comillas iniciales y finales se convierte en parte de la cadena, por lo que este ejemplo tiene un espacio en blanco inicial (como señaló @root45). Esta cadena también contendrá espacios en blanco y nuevas líneas.
Es decir,:
' this is a very\n long string if I had the\n energy to type more and more ...'
Por último, también se pueden construir líneas largas en Python de esta manera:
s = ("this is a very"
"long string too"
"for sure ..."
)
que no incluirá espacios en blanco o nuevas líneas adicionales (este es un ejemplo deliberado que muestra el efecto de saltarse los espacios en blanco):
'this is a verylong string toofor sure ...'
No se necesitan comas, simplemente coloque las cadenas a unir en un par de paréntesis y asegúrese de tener en cuenta los espacios en blanco y las nuevas líneas.
Si no quieres una cadena multilínea sino que tienes una cadena larga de una sola línea, puedes usar paréntesis, sólo asegúrate de no incluir comas entre los segmentos de la cadena, entonces será una tupla.
query = ('SELECT action.descr as "action", '
'role.id as role_id,'
'role.descr as role'
' FROM '
'public.role_action_def,'
'public.role,'
'public.record_def, '
'public.action'
' WHERE role.id = role_action_def.role_id AND'
' record_def.id = role_action_def.def_id AND'
' action.id = role_action_def.action_id AND'
' role_action_def.account_id = '+account_id+' AND'
' record_def.account_id='+account_id+' AND'
' def_id='+def_id)
En una sentencia SQL como la que estás construyendo, las cadenas multilínea también estarían bien. Pero si el espacio en blanco extra que una cadena multilínea contendría fuera un problema, entonces esta sería una buena manera de lograr lo que quieres.
Tu código actual no debería funcionar, te faltan espacios en blanco al final de las "líneas" (por ejemplo: role.descr as roleFROM...
)
Hay comillas triples para las cadenas multilínea:
string = """line
line2
line3"""
Contendrá los saltos de línea y los espacios extra, pero para SQL eso no es un problema.