Python Multiline String muda a indentação

Sep 14 2020

Estou trabalhando em uma automação com Python e Selenium. Tenho que colar um bloco de códigos SQL e Java Script na área de texto do site. Usei várias maneiras de enviar as strings, mas isso muda o recuo. Existe uma maneira de enviar os códigos / strings sem nenhuma alteração no recuo? Usei todos os abaixo e nada funcionou,

textwrap.dedent(prdrsql1)
textwrap.dedent(prdrsql1).lstrip()
(prdrsql1).lstrip()
(prdrsql1).strip()

Código:

prdrsql1 = ("""
        SELECT DISTINCT CAST(q2.SubjectId AS varchar(32)) as SubjectId, q2.SubjectNum, 
'A' as ItemOid,
q1.B as VisitId,
q1.[C] as VisitRepeatKey,
q1.[D] AS FormOid,
q1.E as FormRepeatKey,
'Y' as Data
FROM Table.A.ABC q2 with (NOLOCK)
    Right Join (
    select hashkey, SubjectNum, 
    (CASE WHEN C is null THEN 'SUBJECT' ELSE [D] END) AS 
    [D], 
    (CASE WHEN G is null THEN 'SUBJECT' ELSE [G] END) AS 
    [G], 
    FormOID, [DD], AB,ABC
    from Table.A.ABC with (NOLOCK) where abc=123
    ) q1
    on q1.abc = q2.qbc
    AND q1.AA = 1 and AAA=1""")

Resultado:

É a saída

Por causa disso, o compilador não está compilando o código e dando um erro.

Preciso enviar esses SQL e Java Script ( tenho outro campo de texto para o qual devo enviar códigos JS que têm For Loops e condições IF ) Códigos sem alterar o recuo ou pelo menos iniciar todas as linhas do início da linha . Alguém pode fornecer suas contribuições?

O compilador compila os códigos apenas se o código for como abaixo.

Obrigado, Sanjay.

Respostas

JaspreetKaur Sep 24 2020 at 06:45

A solução para este problema é muito simples. Você acabou de copiar e colar a Consulta SQL esperando que funcione aqui como está. O problema aqui no Python é que ele é sensível a indentação. um recuo incorreto causaria um problema não intencional. Agora, por outro lado, consultas SQL e código JavaScript, ambos não são sensíveis a indentação. Estes dependem; (ponto e vírgula) para quebrar a linha. Isso significa que, mesmo se você especificar 300 comandos em uma linha, separando cada um com um; (ponto-e-vírgula) os comandos serão executados sem complicações. Mas o mesmo não funcionará aqui no caso do python.

Se você tentar o código abaixo, isso funcionará para você e você obterá os resultados esperados.

prdrsql1 = ("SELECT DISTINCT CAST(q2.SubjectId AS varchar(32)) as SubjectId, q2.SubjectNum, 'A' as ItemOid, q1.B as VisitId, q1.[C] as VisitRepeatKey, q1.[D] AS FormOid, q1.E as FormRepeatKey, 'Y' as Data FROM Table.A.ABC q2 wit (NOLOCK) Right Join ( select hashkey, SubjectNum, (CASE WHEN C is null THEN 'SUBJECT' ELSE [D] END) AS [D], (CASE WHEN G is null THEN 'SUBJECT' ELSE [G] END) AS [G], FormOID, [DD], AB,ABCfrom Table.A.ABC with (NOLOCK) where abc=123) q1 on q1.abc = q2.qbc AND q1.AA = 1 and AAA=1")

Tente imprimir e verificar a saída dessa variável em seu SQL Client antes de realmente usá-la.