【问题标题】:Python read mysql to csvPython 读取 mysql 到 csv
【发布时间】: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 添加到您的选择中

标签: python mysql csv


【解决方案1】:

查找SELECT ... INTO OUTFILE ...

它将在 1 个 SQL 语句中完成任务; 0 行 Python(调用该 SQL 除外)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-21
    • 2017-12-18
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2017-07-26
    相关资源
    最近更新 更多