使用 cx_oracle 批量下载表

Posted

技术标签:

【中文标题】使用 cx_oracle 批量下载表【英文标题】:Batch downloading of table using cx_oracle 【发布时间】:2019-08-01 18:39:35 【问题描述】:

我需要使用 cx_oracle 将一个大表从 oracle 数据库下载到 python 服务器中。但是,ram在python服务器上是有限的,所以我需要批量处理。

我已经知道如何做一整张桌子了

usr = ''
pwd = ''
tns = '(Description = ...'
orcl = cx_Oracle.connect(user, pwd, tns)
curs = orcl.cursor()
printHeader=True
tabletoget = 'BIGTABLE'
sql = "SELECT * FROM " + "SCHEMA." + tabletoget
curs.execute(sql)
data = pd.read_sql(sql, orcl)
data.to_csv(tabletoget + '.csv' 

虽然一次加载一批 10000 行然后将其保存到 csv 然后重新加入,但我不确定该怎么做。

【问题讨论】:

【参考方案1】:

您可以直接使用 cx_Oracle 来执行这种批处理:

curs.arraysize = 10000
curs.execute(sql)
while True:
    rows = cursor.fetchmany()
    if rows:
        write_to_csv(rows)
    if len(rows) < curs.arraysize:
        break

如果您使用的是 Oracle Database 12c 或更高版本,您还可以使用 OFFSET 和 FETCH NEXT ROWS 选项,如下所示:

offset = 0
numRowsInBatch = 10000
while True:
    curs.execute("select * from tabletoget offset :offset fetch next :nrows only",
            offset=offset, nrows=numRowsInBatch)
    rows = curs.fetchall()
    if rows:
        write_to_csv(rows)
    if len(rows) < numRowsInBatch:
        break
    offset += len(rows)

此选项不如第一个选项有效,并且涉及给数据库更多工作,但根据您的具体情况,它可能对您更好。

这些示例都没有直接使用 pandas。我对那个包不是特别熟悉,但如果你(或其他人)可以适当地调整它,希望这会有所帮助!

【讨论】:

【参考方案2】:

您可以像这样实现您的结果。这里我正在将数据加载到 df。

import cx_Oracle
import time
import pandas

user = "test"
pw = "test"
dsn="localhost:port/TEST"

con = cx_Oracle.connect(user,pw,dsn)
start = time.time()
cur = con.cursor()
cur.arraysize = 10000
try:
    cur.execute( "select * from test_table" )
    names = [ x[0] for x in cur.description]
    rows = cur.fetchall()
    df=pandas.DataFrame( rows, columns=names)
    print(df.shape)
    print(df.head())
finally:
    if cur is not None:
        cur.close()

elapsed = (time.time() - start)
print(elapsed, "seconds")

【讨论】:

对于一般背景,cx_Oracle 8 现在有一个prefetchrows 设置,可以与arraysize 一起调整。请参阅cx_Oracle Tuning documentation。

以上是关于使用 cx_oracle 批量下载表的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 cx_Oracle 中的 executemany() 从批量插入数据加载中查找错误记录

java批量下载,将多文件打包成zip格式下载

如何批量下载网页上的图片!????

b站视频怎么批量下载?批量下载视频的技巧有哪些?

前端批量下载文件

网页图片怎么批量下载