将数据帧或numpy数组导出到MySQL

将数据帧或numpy数组导出到MySQL,mysql,python-2.7,pandas,mysql-python,Mysql,Python 2.7,Pandas,Mysql Python,我正在使用python将一个大型矩阵(形状大约为3000*3000)导出到MySQL中 现在我正在使用MySQLdb插入这些值,但它太麻烦,效率太低。这是我的密码: # -*- coding:utf-8 -*- import MySQLdb import numpy as np import pandas as pd import time def feature_to_sql_format(df): df = df.fillna(value='') columns =

我正在使用python将一个大型矩阵(形状大约为3000*3000)导出到MySQL中

现在我正在使用MySQLdb插入这些值,但它太麻烦,效率太低。这是我的密码:

# -*- coding:utf-8 -*-


import MySQLdb
import numpy as np
import pandas as pd
import time


def feature_to_sql_format(df):
    df = df.fillna(value='')
    columns = list(df.columns)
    index = list(df.index)
    index_sort = np.reshape([[int(i)] * len(columns) for i in index], (-1)).tolist()
    columns_sort = (columns * len(index))
    values_sort = df.values.reshape(-1).tolist()
    return str(zip(index_sort, columns_sort, values_sort))[1: -1].replace("'NULL'", 'NULL')


if __name__ == '__main__':
    t1 = time.clock()
    df = pd.read_csv('C:\\test.csv', header=0, index_col=0)
    output_string = feature_to_sql_format(df)
    sql_CreateTable = 'USE derivative_pool;DROP TABLE IF exists test1;' \
                      'CREATE TABLE test1(date INT NOT NULL, code VARCHAR(12) NOT NULL, value FLOAT NULL);'
    sql_Insert = 'INSERT INTO test (date,code,value) VALUES ' + output_string + ';'
    con = MySQLdb.connect(......)
    cur = con.cursor()
    cur.execute(sql_CreateTable)
    cur.close()
    cur = con.cursor()
    cur.execute(sql_Insert)
    cur.close()
    con.commit()
    con.close()
    t2 = time.clock()
    print t2 - t1
它总共消耗274秒左右

我想知道是否有一种更简单的方法来实现这一点,我考虑将矩阵导出到csv,然后使用LOAD DATA Infle进行导入,但这也太复杂了

我注意到,在pandas文档中,pandas dataframe有一个函数用于_sql,在中,您可以将“flavor”设置为“mysql”,即:

df.to_sql(con=con, name=name, flavor='mysql')
但现在我的熊猫版本是,味道降低到只有“sqlite”。。。。。。我仍然尝试使用

df.to_sql(con=con, name=name, flavor='sqlite')
这给了我一个错误


有什么方便的方法可以做到这一点吗?

以后的pandas版本支持SQLalchemy连接器,而不是
flavor=“mysql”

首先,安装依赖项:

pip install mysql-connector-python-rf==2.2.2
pip install MySQL-python==1.2.5
pip install SQLAlchemy==1.1.1
然后创建引擎:

from sqlalchemy import create_engine
connection_string= "mysql+mysqlconnector://root:@localhost/MyDatabase"
engine = create_engine(connection_string)
然后您可以使用
df.to_sql(…)

以下是您可以在MYSQL中执行的加快数据加载的一些操作:

SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
SET sql_log_bin = 0;
#LOAD DATA LOCAL INFILE....
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
SET SESSION tx_isolation='READ-REPEATABLE';

可能重复的感谢它的工作,但问题是我尝试了它,它需要更长的时间!有没有办法缩短这个过程?我的csv大约是3000*3000,csv格式的文件只需要100米。我不明白为什么要花这么长时间…@DirkPaul您的CSV有3000行和3000列?是的,但它对SQL来说太大了,所以我必须将其转换为一维(行数、列数、值),这应该不会花太长时间。。。不过,您可以做一些事情来加快mysql的加载速度。请看编辑。非常感谢~让我试试
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
SET sql_log_bin = 0;
#LOAD DATA LOCAL INFILE....
SET UNIQUE_CHECKS = 1;
SET FOREIGN_KEY_CHECKS = 1;
SET SESSION tx_isolation='READ-REPEATABLE';