python - 将 Excel Oracle DB 查询转换为 Python Pandas
问题描述
我有一个简单的程序,可以在 Python 中与 Oracle DB 建立连接。我需要一些关于如何在 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 和 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-server - Laravel BelongsTo 关系查询日志中的 0 = 1
- android - 更改或删除 RatingBar 焦点颜色
- c# - 母版页服务器错误 - 编译器错误消息:CS0426
- ruby - 用策略模式重构。在红宝石中
- javascript - 如何扩展所有 Sequelize 模型?
- c# - 检查公共语言运行时异常时 System.Diagnostics.DebuggerHidden() 不起作用
- java - @Autowired Spring 组件在 CustomWebSecurityExpressionRoot 内抛出 null
- c# - Xamarin表单中内容扩展时如何使Frame扩展
- xamarin - Xamarin Forms Lottie 图像未显示
- c# - 从轮廓生成 HALCON 区域