【发布时间】:2021-05-17 06:11:43
【问题描述】:
我想分块读取 mysql 数据库并将其内容写入一堆 csv 文件。
虽然这可以通过使用下面的 pandas 轻松完成:
df_chunks = pd.read_sql_table(table_name, con, chunksize=CHUNK_SIZE)
for i, df in enumerate(chunks):
df.to_csv("file_{}.csv".format(i)
假设我不能使用 pandas,我还能使用什么其他替代方法?我尝试使用
import sqlalchemy as sqldb
import csv
CHUNK_SIZE = 100000
table_name = "XXXXX"
host = "XXXXXX"
user = "XXXX"
password = "XXXXX"
database = "XXXXX"
port = "XXXX"
engine = sqldb.create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(user,password,host,port,database))
con = engine.connect()
metadata = sqldb.MetaData()
table = sqldb.Table(table_name, metadata, autoload=True, autoload_with=engine)
query = table.select()
proxy = con.execution_options(stream_results=True).execute(query)
cols = [""] + [column.name for column in table.c]
file_num = 0
while True:
batch = proxy.fetchmany(CHUNK_SIZE)
if not batch:
break
csv_writer = csv.writer("file_{}.csv".format(file_num), delimiter=',')
csv_writer.writerow(cols)
#csv_writer.writerows(batch) # while this work, it does not have the index similar to df.to_csv()
for i, row in enumerate(batch):
csv_writer.writerow(i + row) # will error here
file_num += 1
proxy.close()
虽然使用 .writerows(batch) 可以正常工作,但它没有您从 df.to_csv() 获得的结果那样的索引。我也想添加等效的行号,但似乎无法添加到sqlalchemy.engine.result.RowProxy 的行中。我该怎么做?或者我可以使用什么其他更快的替代方案?
【问题讨论】:
-
将 row_number 添加到您的选择中