Преобразование запроса Excel Oracle DB в Python Pandas

У меня есть простая программа, которая устанавливает соединение с БД Oracle в Python. Мне нужны некоторые подсказки о том, как написать SQL-запрос в Python. У меня есть запрос 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 есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Некоторые методы, о которых вы не знали, что они существуют в Python.
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
305
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Запрос будет тот же. В обоих случаях он отправляется в БД для выполнения и возврата данных. Поскольку текст содержит одинарные кавычки, вы захотите заключить его в тройные двойные кавычки ("") вместо тройных одинарных кавычек, которые у вас есть вокруг SELECT * FROM DUAL.

Хорошо, мне нужно удалить часть SELECT * FROM DUAL, вставить полный запрос выше, а затем заключить его в 6 кавычек, например (' ' ' ' ')?

user2100039 18.12.2020 21:37

Для цитирования посмотрите примеры вроде github.com/oracle/python-cx_Oracle/blob/master/samples/…

Christopher Jones 20.12.2020 00:09
Ответ принят как подходящий

Перевод не нужен. Просто повторно запустите тот же запрос. Python и Excel VBA служат клиентскими приложениями, которые подключаются к одной и той же серверной базе данных, в данном случае к Oracle. Базы данных предназначены для подключения к любому клиенту.

На самом деле, рассмотрите возможность сохранения вашего длинного SQL-запроса в текстовом .sql файле, чтобы все клиенты просто читали файл сценария и избегали длинных строк с кавычками или разрывами строк в любом коде.

питон

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()

Эксель 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. Это выглядит как «ожидание объекта строки или байта».

user2100039 18.12.2020 22:15
f.readlines() возвращает список с элементом для каждой строки. f.read() возвращает весь файл как один str (со встроенными символами новой строки).
Gord Thompson 18.12.2020 22:28

Другие вопросы по теме