用于从 SQL 语句中的 from 子句中提取表名的 python 库,

Mar*_*rin 3 python sql parsing

我有一个复杂的 SQL,如下所示。我正在寻找一个 python (3+) 库,它可以提取 from 子句中包含的表名。我正在映射客户的数据库、视图和报告,并且有数十个查询要映射,因此需要自动化该作业。

\n

已经看过 Python-sqlparse 、 sqlparse ,但我不确定它们是否能胜任这项任务,我正在努力避免学习曲线。

\n
SELECT --Locais Dispon\xc3\xadveis para Abertura de Ordens de corte\n     COALESCE(a."Chave", b."Chave") AS "Chave",\n     COALESCE(a."Unidade", b."Unidade") AS "Unidade",\n     COALESCE(a."Fazenda", b."Fazenda") AS "Fazenda",\n     COALESCE(a."Talhao", b."Talhao") AS "Talhao",\n     COALESCE(a."Participacao", b."Participacao") AS "Participacao",\n     CASE\n       WHEN a."Condicao" = 'Dispon\xc3\xadvel Parcial (Moagem)' AND\n            b."Condicao" = 'Dispon\xc3\xadvel Parcial (Mudas)' THEN\n        'Dispon\xc3\xadvel (Safra+Mudas)'\n       ELSE\n        COALESCE(a."Condicao", b."Condicao")\n     END AS "Condicao",\n     COALESCE(a."Estagio", b."Estagio") AS "Estagio",\n     COALESCE(a."Variedade", b."Variedade") AS "Variedade",\n     COALESCE(a."Ciclo Maturacao", b."Ciclo Maturacao") AS "Ciclo Maturacao",\n     COALESCE(a."Propriedade", b."Propriedade") AS "Propriedade",\n     COALESCE(a."Proprietario", b."Proprietario") AS "Proprietario",\n     COALESCE(a."No. Corte", b."No. Corte") AS "No. Corte",\n     (CASE\n       WHEN a."Area" IS NULL THEN\n    0\n       ELSE\n        a."Area"\n     END + CASE\n       WHEN b."Area" IS NULL THEN\n    0\n       ELSE\n        b."Area"\n     END) AS "Area",\n     CASE\n       WHEN a."Condicao" = 'Dispon\xc3\xadvel Parcial (Moagem)' AND\n            b."Condicao" = 'Dispon\xc3\xadvel Parcial (Mudas)' THEN\n        ((CASE\n          WHEN a."Area" IS NULL THEN\n    0\n          ELSE\n           a."Area"\n        END + CASE\n          WHEN b."Area" IS NULL THEN\n    0\n          ELSE\n           b."Area"\n        END) * a."TCH")\n       ELSE\n        a."Toneladas"\n     END AS "Toneladas",\n     a."TCH",\n     COALESCE(a."Distancia", b."Distancia") AS "Distancia"\n      FROM (SELECT --Disponibilidade (Moagem)\n             A.*,\n             a."Area" * b."TCH" AS "Toneladas",\n             b."TCH" AS "TCH",\n             c."Dist. Terra" + c."Dist. Asfalto" AS "Distancia"\n              FROM ((SELECT --\xc3\x81REAS DISPON\xc3\x8dVEIS PARA ABERTURA DE ORDEM CORTE DE SAFRA\n                      a."Fazenda" * 1000 + a."Talhao" AS "Chave",\n                      CASE\n                        WHEN a."Unidade" = 15 THEN\n                         'USF'\n                        ELSE\n                         'URD'\n                      END AS "Unidade",\n                      a."Fazenda",\n                      a."Talhao",\n                      a."Participacao",\n                      CASE\n                        WHEN a."Ocorrencia Cadastro" = 'C' THEN\n                         'Dispon\xc3\xadvel Total (Moagem)'\n                        ELSE\n                         'Dispon\xc3\xadvel Parcial (Moagem)'\n                      END AS "Condicao",\n                      a."Estagio",\n                      a."Variedade",\n                      a."Ciclo Maturacao",\n                      a."Propriedade",\n                      a."Proprietario",\n                      a."No. Corte",\n                      (a."Area" - (CASE\n                        WHEN b."Area Fechada" IS NULL THEN\n    0\n                        ELSE\n                         b."Area Fechada"\n                      END)) AS "Area"\n                       FROM (SELECT --ULTIMA ESTIMATIVA DO TALHAO A\n                              OBJ.CD_UNID_IND AS "Unidade",\n                              OBJ.CD_UPNIVEL1 AS "Fazenda",\n                              OBJ.CD_UPNIVEL3 AS "Talhao",\n                              OBJ.CD_UPNIVEL1 || ' - ' || F.DE_UPNIVEL1 AS "Propriedade",\n                              G.DE_FORNEC AS "Proprietario",\n                              CASE\n                                WHEN UP3.CD_TP_PROPR IN (1, 2, 3, 11) THEN\n                                 'Parceria'\n                                WHEN UP3.CD_TP_PROPR IN (5, 8) THEN\n                                 'Fornecedor'\n                                WHEN UP3.CD_TP_PROPR = 6 THEN\n                                 'Fornecedor'\n                                WHEN UP3.CD_TP_PROPR = 14 THEN\n                                 'Parceria'\n                                ELSE\n                                 'Verificar'\n                              END AS "Participacao",\n                              C.FG_OCORREN AS "Ocorrencia Cadastro",\n                              C.DT_OCORREN AS "Data Ocorrencia",\n                              B.DA_ESTAGIO AS "Estagio",\n                              B.NO_CORTE AS "No. Corte",\n                              D.DE_VARIED AS "Variedade",\n                              E.DE_MATURAC AS "Ciclo Maturacao",\n                              (OBJ.QT_AREA_PROD * 1) AS "Area",\n                              (OBJ.QT_CANA_ENTR / 1000) AS "Toneladas"\n                               FROM PIMSCS.HISTPREPRO   OBJ,\n                                    PIMSCS.ESTAGIOS     B,\n                                    PIMSCS.UPNIVEL3     UP3,\n                                    PIMSCS.SAFRUPNIV3   C,\n                                    PIMSCS.VARIEDADES   D,\n                                    PIMSCS.TIPO_MATURAC E,\n                                    PIMSCS.UPNIVEL1     F,\n                                    PIMSCS.FORNECS      G\n                              WHERE OBJ.CD_SAFRA =\n                                    (SELECT MAX(CD_SAFRA) FROM PIMSCS.HISTPREPRO)\n                                AND OBJ.CD_UNID_IND IN (15, 19)\n                                AND OBJ.CD_ESTAGIO = B.CD_ESTAGIO\n                                AND OBJ.CD_UPNIVEL1 = UP3.CD_UPNIVEL1\n                                AND OBJ.CD_UPNIVEL3 = UP3.CD_UPNIVEL3\n                                AND OBJ.CD_SAFRA = UP3.CD_SAFRA\n                                AND OBJ.CD_UPNIVEL1 = C.CD_UPNIVEL1\n                                AND OBJ.CD_UPNIVEL3 = C.CD_UPNIVEL3\n                                AND OBJ.CD_SAFRA = C.CD_SAFRA\n                                AND UP3.CD_VARIED = D.CD_VARIED\n                                AND E.FG_MATURAC = D.FG_MATURAC\n                                AND OBJ.CD_UPNIVEL1 = F.CD_UPNIVEL1\n                                AND F.CD_FORNEC = G.CD_FORNEC\n                                AND C.DT_OCORREN =\n                                    (SELECT MAX(D.DT_OCORREN)\n                                       FROM PIMSCS.SAFRUPNIV3 D\n                                      WHERE D.CD_UPNIVEL1 = C.CD_UPNIVEL1\n                                        AND D.CD_UPNIVEL3 = C.CD_UPNIVEL3\n                                        AND D.CD_SAFRA = C.CD_SAFRA)\n                                AND OBJ.CD_HIST =\n                                    (SELECT OBJ2.CD_HIST\n                                       FROM PIMSCS.HISTPREPRO OBJ2\n                                      WHERE OBJ2.CD_UPNIVEL1 = OBJ.CD_UPNIVEL1\n                                        AND OBJ2.CD_UPNIVEL3 = OBJ.CD_UPNIVEL3\n                                        AND OBJ2.CD_SAFRA =\n                                            (SELECT MAX(CD_SAFRA)\n                                               FROM PIMSCS.HISTPREPRO)\n                                        AND OBJ2.CD_HIST NOT IN ('E', 'S')\n                                        AND OBJ2.CD_EMPRESA IN (15, 19)\n                                        AND OBJ2.DT_HISTORICO =\n                                            (SELECT MAX(OBJ3.DT_HISTORICO)\n                                               FROM PIMSCS.HISTPREPRO OBJ3\n                                              WHERE OBJ3.CD_UPNIVEL1 =\n                                                    OBJ.CD_UPNIVEL1\n                                                AND OBJ3.CD_UPNIVEL3 =\n                                                    OBJ.CD_UPNIVEL3\n                                                AND OBJ3.CD_SAFRA =\n                                                    (SELECT MAX(CD_SAFRA)\n                                                       FROM PIMSCS.HISTPREPRO)\n                                                AND OBJ3.CD_HIST NOT IN ('E', 'S')\n                                                AND OBJ3.CD_EMPRESA IN (15, 19)))) A,\n                            (SELECT --\xc3\x81REA DE ORDEM DE CORTE DE SAFRA FECHADA B\n                              QD.CD_UPNIVEL1 AS "Fazenda",\n                              QD.CD_UPNIVEL3 AS "Talhao",\n                              SUM(QD.QT_AREA) AS "Area Fechada"\n                               FROM PIMSCS.QUEIMA_HE QH, PIMSCS.QUEIMA_DE QD\n                              WHERE QH.NO_QUEIMA = QD.NO_QUEIMA\n                                AND QD.CD_SAFRA =\n                                    (SELECT MAX(CD_SAFRA) FROM PIMSCS.HISTPREPRO)\n                              GROUP BY QD.CD_UPNIVEL1, QD.CD_UPNIVEL3) B\n                      WHERE a."Fazenda" = b."Fazenda"(+)\n                        AND a."Talhao" = b."Talhao"(+)\n                        AND a."Ocorrencia Cadastro" <> 'F'\n                        AND (a."Area" - (CASE\n                              WHEN b."Area Fechada" IS NULL THEN\n    0\n                              ELSE\n                               b."Area Fechada"\n                            END)) > 0)) A\n              LEFT JOIN (SELECT --Ultima Estimativa do Talh\xc3\xa3o\n                         A.CD_HIST "Cod. Historico",\n                         CASE\n                           WHEN A.CD_UNID_IND = 15 THEN\n                            'USF'\n                           ELSE\n                            'URD'\n                         END AS "Unidade",\n                         A.CD_UPNIVEL1 AS "Zona",\n                         A.CD_UPNIVEL3 AS "Talhao",\n                         A.DT_HISTORICO AS "Data",\n                         A.QT_AREA_PROD AS "Area",\n                         (A.QT_CANA_ENTR / 1000) AS "Toneladas",\n                         A.QT_TCH AS "TCH"\n                          FROM PIMSCS.HISTPREPRO A\n                         WHERE A.CD_UNID_IND IN (15, 19)\n                           AND A.CD_SAFRA =\n                               (SELECT MAX(CD_SAFRA) FROM PIMSCS.HISTPREPRO)\n                           AND A.CD_HIST NOT IN ('E', 'S')\n                           AND A.QT_AREA_PROD <> 0\n                           AND A.DT_HISTORICO =\n                               (SELECT MAX(A2.DT_HISTORICO)\n                                  FROM PIMSCS.HISTPREPRO A2\n                                 WHERE A.CD_SAFRA = A2.CD_SAFRA\n                                   AND A.CD_UPNIVEL2 = A2.CD_UPNIVEL1\n                                   AND A.CD_UPNIVEL3 = A2.CD_UPNIVEL3\n                                   AND A2.CD_HIST NOT IN ('E', 'S'))) B\n                ON a."Fazenda" = b."Zona"\n               AND a."Talhao" = b."Talhao"\n              LEFT JOIN (SELECT --Distancia Cadastrada \n                         A.CD_UPNIVEL1 AS "Zona",\n                         A.CD_UPNIVEL3 AS "Talhao",\n                         MAX(A.DS_TERRA) AS "Dist. Terra",\n                         MAX(A.DS_ASFALTO) AS "Dist. Asfalto"\n                          FROM PIMSCS.UPNIVEL3 A\n                          LEFT JOIN PIMSCS.SAFRUPNIV3 B\n                            ON A.CD_SAFRA = B.CD_SAFRA\n                           AND A.CD_UPNIVEL1 = B.CD_UPNIVEL1\n                           AND A.CD_UPNIVEL3 = B.CD_UPNIVEL3\n                         WHERE A.CD_UNID_IND IN (15, 19)\n                           AND A.CD_OCUP = 1\n                           AND A.CD_SAFRA =\n                               (SELECT MAX(CD_SAFRA) FROM PIMSCS.HISTPREPRO)\n                           AND B.CD_SAFRA =\n                               (SELECT MAX(CD_SAFRA) FROM PIMSCS.HISTPREPRO)\n                           AND B.FG_OCORREN <> 'I'\n                           AND B.DT_OCORREN =\n                               (SELECT MAX(B2.DT_OCORREN)\n                                  FROM PIMSCS.SAFRUPNIV3 B2\n                                 WHERE B.CD_SAFRA = B2.CD_SAFRA\n                                   AND B.CD_UPNIVEL1 = B2.CD_UPNIVEL1\n                                   AND B.CD_UPNIVEL3 = B2.CD_UPNIVEL3)\n                         GROUP BY A.CD_UPNIVEL1, A.CD_UPNIVEL3) C\n                ON a."Fazenda" = c."Zona"\n               AND a."Talhao" = c."Talhao") A\n      FULL JOIN (SELECT --Disponibilidade (Mudas)\n                  A.*,\n                  a."Area" * b."TCH" AS "Toneladas",\n                  b."TCH" AS "TCH",\n                  c."Dist. Terra" + c."Dist. Asfalto" AS "Distancia"\n                   FROM ((SELECT --\xc3\x81REAS DISPON\xc3\x8dVEIS PARA ABERTURA DE ORDEM CORTE DE SAFRA\n                           a."Fazenda" * 1000 + a."Talhao" AS "Chave",\n                           CASE\n                             WHEN a."Unidade" = 15 THEN\n                              'USF'\n                             ELSE\n                              'URD'\n                           END AS "Unidade",\n                           a."Fazenda",\n                           a."Talhao",\n                           a."Participacao",\n                           CASE\n                             WHEN a."Ocorrencia Cadastro" = 'C' THEN\n                              'Dispon\xc3\xadvel Total (Mudas)'\n                             ELSE\n                              'Dispon\xc3\xadvel Parcial (Mudas)'\n                           END AS "Condicao",\n                           a."Estagio",\n                           a."Variedade",\n                           a."Ciclo Maturacao",\n                           a."Propriedade",\n                           a."Proprietario",\n                           a."No. Corte",\n                           (a."Area" - (CASE\n                             WHEN b."Area Fechada" IS NULL THEN\n    0\n                             ELSE\n                              b."Area Fechada"\n                           END)) AS "Area"\n                            FROM (SELECT --ULTIMA ESTIMATIVA DO TALHAO A\n                                   OBJ.CD_UNID_IND AS "Unidade",\n                                   OBJ.CD_UPNIVEL1 AS "Fazenda",\n                                   OBJ.CD_UPNIVEL3 AS "Talhao",\n                                   OBJ.CD_UPNIVEL1 || ' - ' || F.DE_UPNIVEL1 AS "Propriedade",\n                                   G.DE_FORNEC AS "Proprietario",\n                                   CASE\n                                     WHEN UP3.CD_TP_PROPR IN (1, 2, 3, 11) THEN\n                                      'Parceria'\n                                     WHEN UP3.CD_TP_PROPR IN (5, 8) THEN\n                                      'Fornecedor'\n                                     WHEN UP3.CD_TP_PROPR = 6 THEN\n                                      'Fornecedor'\n                                     WHEN UP3.CD_TP_PROPR = 14 THEN\n                                      'Parceria'\n                                     ELSE\n                                      'Verificar'\n                                   END AS "Participacao",\n                                   C.FG_OCORREN AS "Ocorrencia Cadastro",\n                                   C.DT_OCORREN AS "Data Ocorrencia",\n                                   B.DA_ESTAGIO AS "Estagio",\n                                   B.NO_CORTE AS "No. Corte",\n                                   D.DE_VARIED AS "Variedade",\n                                   E.DE_MATURAC AS "Ciclo Maturacao",\n                                   (OBJ.QT_AREA_PROD * 1) AS "Area",\n                                   (OBJ.QT_CANA_ENTR / 1000) AS "Toneladas"\n                                    FROM PIMSCS.HISTPREPRO   OBJ,\n                                         PIMSCS.ESTAGIOS     B,\n                                         PIMSCS.UPNIVEL3     UP3,\n                                         PIMSCS.SAFRUPNIV3   C,\n                                         PIMSCS.VARIEDADES   D,\n                                         PIMSCS.TIPO_MATURAC E,\n                                         PIMSCS.UPNIVEL1     F,\n                                         PIMSCS.FORNECS      G\n                                   WHERE OBJ.CD_SAFRA =\n                                         (SELECT MAX(CD_SAFRA)\n                                            FROM PIMSCS.HISTPREPRO)\n                                     AND OBJ.CD_UNID_IND IN (15, 19)\n                                     AND OBJ.CD_ESTAGIO = B.CD_ESTAGIO\n                                     AND OBJ.CD_UPNIVEL1 = UP3.CD_UPNIVEL1\n                                     AND OBJ.CD_UPNIVEL3 = UP3.CD_UPNIVEL3\n                                     AND OBJ.CD_SAFRA = UP3.CD_SAFRA\n                                     AND OBJ.CD_UPNIVEL1 = C.CD_UPNIVEL1\n                                     AND OBJ.CD_UPNIVEL3 = C.CD_UPNIVEL3\n                                     AND OBJ.CD_SAFRA = C.CD_SAFRA\n                                     AND UP3.CD_VARIED = D.CD_VARIED\n                                     AND E.FG_MATURAC = D.FG_MATURAC\n                                     AND OBJ.CD_UPNIVEL1 = F.CD_UPNIVEL1\n                                     AND F.CD_FORNEC = G.CD_FORNEC\n                                     AND C.DT_OCORREN =\n                                         (SELECT MAX(D.DT_OCORREN)\n                                            FROM PIMSCS.SAFRUPNIV3 D\n                                           WHERE D.CD_UPNIVEL1 = C.CD_UPNIVEL1\n                                             AND D.CD_UPNIVEL3 = C.CD_UPNIVEL3\n                                             AND D.CD_SAFRA = C.CD_SAFRA)\n                                     AND OBJ.CD_HIST =\n                                         (SELECT OBJ2.CD_HIST\n                                            FROM PIMSCS.HISTPREPRO OBJ2\n                                           WHERE OBJ2.CD_UPNIVEL1 = OBJ.CD_UPNIVEL1\n                                             AND OBJ2.CD_UPNIVEL3 = OBJ.CD_UPNIVEL3\n                                             AND OBJ2.CD_SAFRA =\n                                                 (SELECT MAX(CD_SAFRA)\n                                                    FROM PIMSCS.HISTPREPRO)\n                                             AND OBJ2.CD_HIST = 'S'\n                                             AND OBJ2.CD_EMPRESA IN (15, 19)\n                                             AND OBJ2.DT_HISTORICO =\n                                                 (SELECT MAX(OBJ3.DT_HISTORICO)\n                                                    FROM PIMSCS.HISTPREPRO OBJ3\n                                                   WHERE OBJ3.CD_UPNIVEL1 =\n                                                         OBJ.CD_UPNIVEL1\n                                                     AND OBJ3.CD_UPNIVEL3 =\n                                                         OBJ.CD_UPNIVEL3\n                                                     AND OBJ3.CD_SAFRA =\n                                                         (SELECT MAX(CD_SAFRA)\n                                                            FROM PIMSCS.HISTPREPRO)\n                                                     AND OBJ3.CD_HIST = 'S'\n                                                     AND OBJ3.CD_EMPRESA IN (15, 19)))) A,\n                                 (SELECT --\xc3\x81REA DE ORDEM DE CORTE DE MUDAS FECHADA B\n                                   A.CD_UPNIVEL1 AS "Fazenda",\n                                   A.CD_UPNIVEL3 AS "Talhao",\n                                   SUM(A.QT_AREA) AS "Area Fechada"\n                                    FROM  PIMSCS.OCORTEMD_DE A\n                                    JOIN PIMSCS.OCORTEMD_HE B\n                                      ON A.NO_ORDEM = B.NO_ORDEM\n                                   WHERE A.CD_SAFRA =\n                                         (SELECT 

Tob*_*Mao 6

我创建了Sqlglot可以解析你的 SQL。

\n
import sqlglot\nimport sqlglot.expressions as exp\n\nexpression = sqlglot.parse_one(..., read=\xe2\x80\x9coracle\xe2\x80\x9d)\nlist(expression.find_all(exp.Table))\n
Run Code Online (Sandbox Code Playgroud)\n