我试图将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()
答案 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()