【发布时间】:2015-12-21 09:26:48
【问题描述】:
我知道如果使用 mysqldump 或 SELECT *INTO OUTFILE.. 方法将所有数据从 MySQL 数据库获取到本地目录相当容易,但是如何使用 Python 和远程 MySQL 主机实现类似的。
远程位置没有服务器目录,因此无法将其转储到服务器上。我需要将 csv 直接下载到我的计算机上。
【问题讨论】:
我知道如果使用 mysqldump 或 SELECT *INTO OUTFILE.. 方法将所有数据从 MySQL 数据库获取到本地目录相当容易,但是如何使用 Python 和远程 MySQL 主机实现类似的。
远程位置没有服务器目录,因此无法将其转储到服务器上。我需要将 csv 直接下载到我的计算机上。
【问题讨论】:
考虑使用csv 模块和pandas 模块遍历所有表并将行和列写入外部csv 文件(保存为表名)的两种方法之一。两者都使用pymysql 包远程连接到 MySQL,但任何 MySQL 数据库 API 都可以工作。
CSV 模块
import os
import csv
import pymysql
# CURRENT DIRECTORY OF SCRIPT
cd = os.path.dirname(os.path.abspath(__file__))
# OPEN DATABASE CONNECTION
db = pymysql.connect(host="localhost", port=####, db="databasename",
user="username", passwd="*****")
cur = db.cursor()
# OBTAIN ALL TABLES
cur.execute("SHOW TABLES;")
tables = cur.fetchall()
for t in tables:
columns = []
cur.execute("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS \
WHERE table_name = '{0}';".format(t[0]))
with open(os.path.join(cd, '{0}.csv'.format(t[0])), 'w', newline='') as f:
writer = csv.writer(f)
# COLUMNS
for col in cur.fetchall():
columns.append(col[0])
writer.writerow(columns)
# ROWS
cur.execute("SELECT * FROM {0};".format(t[0]))
for row in cur.fetchall():
writer.writerow(row)
f.close()
# CLOSE CURSOR AND DATABASE CONNECTION
cur.close()
db.close()
熊猫模块
import os
import pandas as pd
import pymysql
cd = os.path.dirname(os.path.abspath(__file__))
# OPEN DATABASE CONNECTION
db = pymysql.connect(host="localhost", port=####, db="databasename",
user="username", passwd="*****")
cur = db.cursor()
# OBTAIN ALL TABLES
cur.execute("SHOW TABLES;")
tables = cur.fetchall()
for t in tables:
columns = []
# IMPORT DATA TO DATA FRAME
df = pd.read_sql("SELECT * FROM {0};".format(t[0]), db)
# EXPORT DATA FRAME TO CSV
df.to_csv(os.path.join(cd, '{0}.csv'.format(t[0])), index=False)
# CLOSE CURSOR AND DATABASE CONNECTION
cur.close()
db.close()
【讨论】: