【问题标题】:Converting Excel Oracle DB Query to Python Pandas将 Excel Oracle DB 查询转换为 Python Pandas
【发布时间】:2021-03-29 10:49:13
【问题描述】:

我有一个简单的程序,可以在 Python 中与 Oracle 数据库建立连接。我需要一些关于如何在 Python 中编写 SQL 查询的提示。我有一个工作正常的 Excel 查询,但我在 Python 中需要它,我认为我在 Excel 查询连接属性中有我需要的东西。我的python程序是这样的-

import pandas as pd
import cx_Oracle
from sys import exit

conn= cx_Oracle.connect('DOMINA_CO/S#UU@ex021-orc.corp.mycompany.com:1540/domp_domi_bi')
try:
    query = '''
     SELECT * from dual
         '''
    df = pd.read_sql(con = conn, sql = query)
    finally:
conn.close()
df.head()

exit()

然后返回 -

Out[2]: 
DUMMY
0     X

在 Excel 中,我有工作查询的连接属性,它具有如下所示的“命令文本:”:

SELECT TO_CHAR (DGE_DATOS_INSTALACIONES.FEC_LOCAL - (1/24), 'YYYY-MM') MONTH,
       REPLACE(DGE_NEGOCIOS.NOM_NEGOCIO, 'ESPAÑA', 'SPAIN') BUSINESS,
       REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(DGE_PAISES.NOM_PAIS, 'ESPAÑA', 'SPAIN'), 'ALEMANIA', 'GERMANY'), 'BRASIL', 'BRAZIL'), 'CHIPRE', 'CYPRUS'), 'FRANCIA', 'FRANCE'), 'GRECIA', 'GREECE'), 'HUNGRIA', 'HUNGARY'), 'ITALIA', 'ITALY'), 'POLONIA', 'POLAND'), 'RUMANIA', 'ROMANIA'), 'ESCOCIA', 'SCOTLAND'), 'GALES', 'WALES'), 'INGLATERRA', 'ENGLAND'), 'IRLANDA DEL NORTE', 'NORTHERN IRELAND'), 'IRLANDA', 'IRELAND'), 'ESTADOS UNIDOS', 'UNITED STATES') COUNTRY,
       DGE_REGIONES.NOM_REGION REGION,
       DGE_INSTALACIONES.NOM_INSTALACION PARK,
       ROUND(SUM(DGE_DATOS_INSTALACIONES.CAN_PRODUCIBLE_SUMA*DGE_DATOS_INSTALACIONES.COEF_PERDIDAS_MEDIA_TENSION*DGE_DATOS_INSTALACIONES.COEF_PERDIDAS_PF)/1000) "POTENTIAL_GEN_(MWH)"

FROM DOMINAGE.DGE_DATOS_INSTALACIONES DGE_DATOS_INSTALACIONES,
     DOMINAGE.DGE_NEGOCIOS DGE_NEGOCIOS,
     DOMINAGE.DGE_PAISES DGE_PAISES,
     DOMINAGE.DGE_REGIONES DGE_REGIONES,
     DOMINAGE.DGE_INSTALACIONES DGE_INSTALACIONES

WHERE DGE_DATOS_INSTALACIONES.FEC_LOCAL >= TO_DATE('01-JAN-13 01:00', 'DD-MON-YY HH24:MI')
      AND DGE_DATOS_INSTALACIONES.COD_INSTALACION = DGE_INSTALACIONES.COD_INSTALACION
      AND DGE_INSTALACIONES.COD_NEGOCIO = DGE_NEGOCIOS.COD_NEGOCIO
      AND DGE_INSTALACIONES.COD_PAIS = DGE_PAISES.COD_PAIS
      AND DGE_INSTALACIONES.COD_REGION = DGE_REGIONES.COD_REGION

GROUP BY TO_CHAR (DGE_DATOS_INSTALACIONES.FEC_LOCAL - (1/24), 'YYYY-MM'),
         DGE_NEGOCIOS.NOM_NEGOCIO,
         DGE_PAISES.NOM_PAIS,
         DGE_REGIONES.NOM_REGION,
         DGE_INSTALACIONES.NOM_INSTALACION

ORDER BY MONTH,
         REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(BUSINESS, 'UNITED STATES', '1'), 'SPAIN', '2'), 'UNITED KINGDOM', '3'), 'INTERNATIONAL', '4'), 'OFFSHORE', '5'),
         COUNTRY,
         PARK

非常感谢任何关于将此查询转换为 python 查询的帮助,因为我是在 python 中编写数据库查询的新手!

【问题讨论】:

    标签: python sql excel database oracle


    【解决方案1】:

    不需要翻译。只需重新运行相同的查询。 Python 和 Excel VBA 作为客户端应用程序连接到同一个后端数据库,这里是 Oracle。数据库旨在连接到任何客户端。

    事实上,考虑将长 SQL 查询保存在文本 .sql 文件中,让所有客户端简单地读取脚本文件并避免在任一代码中使用带引号或换行符的长字符串。

    Python

    conn= cx_Oracle.connect('...')
    
    # READ SQL QUERY FROM FILE
    with open(r'C:\path\to\my\query.sql') as f:
        query = f.read().strip()
    
    # IMPORT INTO PANDAS DATA FRAME
    try:
        df = pd.read_sql(con = conn, 
                         sql = query)     # QUERY READ FROM .sql FILE
    finally:
        conn.close()
    
    df.head()
    

    Excel VBA

    ' READ SQL QUERY FROM FILE
    With CreateObject("Scripting.FileSystemObject")
          sql = .OpenTextFile("C:\Path\To\my\query.sql", 1).readall
    End With
    
    ' OPEN DB CONNECTION
    Set conn = New ADODB.Connection
    conn.Open "..."
       
    ' DEFINE COMMAND OBJECT
    Set cmd = New ADODB.Command
    With cmd
        .ActiveConnection = conn
        .CommandType = adCmdText
        .CommandText = sql               ' QUERY READ FROM .sql FILE
        
        Set rst = cmd.Execute
    End With 
    

    【讨论】:

    • 谢谢。我在 sql = query 行上收到“类型错误”。它看起来像“期望字符串或字节对象”。
    • f.readlines() 返回一个列表,其中每一行都有一个元素。 f.read() 将整个文件作为单个 str(嵌入换行符)返回。
    【解决方案2】:

    查询将是相同的。在这两种情况下,它都会被发送到数据库以执行并返回数据。由于文本包含单引号,因此您需要使用三重双引号 (") 来包装它,而不是使用 SELECT * FROM DUAL 周围的三重单引号。

    【讨论】:

    猜你喜欢
    • 2021-12-20
    • 2011-11-09
    • 2019-07-29
    • 2018-11-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    相关资源
    最近更新 更多