作为数据帧存储时,python cx_oracle挂起?

时间:2018-07-30 14:17:44

标签: python oracle pandas

我试图将Oracle SQL查询的结果存储到数据帧中,并且执行无限期挂起。但是,当我打印查询时,它会立即显示出来。将其另存为DataFrame时会导致什么错误?

import cx_Oracle
import pandas as pd
dsn_tns = cx_Oracle.makedsn('HOST', 'PORT', service_name='SID')
conn = cx_Oracle.connect(user='USER', password='PASSWORD', dsn=dsn_tns)
curr =conn.cursor()
curr.execute('alter session set current_schema= apps')
df = pd.read_sql('select * from TABLE', curr)
####THE ALTERNATIVE CODE TO PRINT THE RESULTS
# curr.execute('select * from TABLE')
# for line in curr:
#     print(line)
curr.close()
conn.close()

1 个答案:

答案 0 :(得分:0)

Pandas的read_sql需要一个连接对象作为其 con 参数,而不是游标的execute的结果。另外,请考虑使用SQLAlchemy推荐的熊猫与数据库之间的接口,您可以在引擎连接分配中定义架构。该引擎还允许to_sql调用。

engine = create_engine("oracle+cx_oracle://user:pwd@host:port/dbname")

df = pd.read_sql('select * from TABLE', con=engine)

engine.dispose()

正如本DBA post所述,在Oracle中,用户和模式本质上是同一件事(与其他RBDMS不同)。因此,尝试在create_engine调用中以用户身份使用所需凭据传递 apps

engine = create_engine("oracle+cx_oracle://apps:PASSWORD@HOST:PORT/SID")

df = pd.read_sql('select * from TABLE', con=engine)

engine.dispose()