【问题标题】:Export all the tables in the database into a single csv file in python将数据库中的所有表导出到python中的单个csv文件中
【发布时间】:2016-10-17 08:35:29
【问题描述】:

我一直在尝试将数据库中的所有表导出到单个 csv 文件中。

我试过了

import MySQLdb as dbapi
import sys
import csv
import time


dbname      = 'site-local'
user        = 'root'
host        = '127.0.0.1'
password    = ''
date        = time.strftime("%d-%m-%Y")
file_name   = date+'-portal'

query='SELECT * FROM site-local;' //<---- I'm stuck here

db=dbapi.connect(host=host,user=user,passwd=password)
cur=db.cursor()
cur.execute(query)
result=cur.fetchall()

c = csv.writer(open(file_name+'.csv','wb'))
c.writerow(result)

我现在有点卡住了,我希望有人可以根据我所拥有的来阐明一些基础。

【问题讨论】:

  • 我不是 MySQL 专家,但我想说没有单一的语句可以从数据库中的每个表中获取每条记录。 RDMS 将返回所有相同列的结果,因此您所做的并不真正适合。我要做的是查询元数据表并获取所有表的列表,然后查询每个表并将其附加到您的文件中。

标签: python mysql csv


【解决方案1】:

使用 python 不是解决这个问题的方法。最简单的解决方案是使用SELECT INTO OUTFILE。这可以快速将非常大的表转储为 CSV 格式,而无需在 Python 代码中使用 CSV 编写器。

从您的其他问题中,我了解到您转储的原因是重新导入到 postgresql。如果不是这样,您可以简单地使用mysqldump 命令一次转储整个数据库。

如果您想以 CSV 格式转储每个表,它确实需要一些代码。创建一个 python 循环来遍历所有表,然后对每个表执行 SELECT INTO 查询。

【讨论】:

    【解决方案2】:

    考虑从所有数据库表中迭代导出SHOW CREATE TABLE(txt 文件)和SELECT * FROM(csv 文件)输出。根据您之前的相关问题,由于您需要迁移数据库,因此您可以运行 create table 语句(调整 MySQL for Postgre 语法,例如 ENGINE=InnoDB 行),然后使用 PostgreSQL 的 COPY 命令通过 csv 导入数据。下面的 csv 文件包含fetchall() 中未包含的表格列标题。

    db = dbapi.connect(host=host,user=user,passwd=password)
    cur = db.cursor()
    
    # RETRIEVE TABLES
    cur.execute("SHOW TABLES")
    tables = []
    for row in cur.fetchall():
        tables.append(row[0])
    
    for t in tables:    
        # CREATE TABLES STATEMENTS
        cur.execute("SHOW CREATE TABLE `{}`".format(t))
        temptxt = '{}_table.txt'.format(t)
    
        with open(temptxt, 'w', newline='') as txtfile:
            txtfile.write(cur.fetchone()[1])                   # ONE RECORD FETCH
        txtfile.close()
    
        # SELECT STATEMENTS
        cur.execute("SELECT * FROM `{}`".format(t))
        tempcsv = '{}_data.csv'.format(t)
    
        with open(tempcsv, 'w', newline='') as csvfile:
            writer = csv.writer(csvfile)
            writer.writerow([i[0] for i in cur.description])   # COLUMN HEADERS
            for row in cur.fetchall():        
                writer.writerow(row)
        csvfile.close()
    
    cur.close()
    db.close()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 2013-03-19
      • 2021-01-09
      • 2012-12-22
      相关资源
      最近更新 更多