读取csv并插入数据库性能

时间:2016-03-22 06:08:29

标签: python mysql csv go sqlalchemy

我的任务是逐行读取csv文件并将它们插入数据库。

csv文件包含大约170万行。

我使用python与sqlalchemy orm(合并函数)来做到这一点。 但它花了五个多小时。

是由python慢​​性能还是sqlalchemy或sqlalchemy引起的?

或者如果我使用golang来做一个明显更好的表现呢?(但我没有经验。此外,这个工作需要每个月安排)

希望你的家伙给出任何建议,谢谢!

更新:数据库 - mysql

2 个答案:

答案 0 :(得分:2)

对于这样的任务,你不希望逐行插入数据 :)基本上,你有两种方法:

  1. 确保sqlalchemy不会逐个运行查询。请改用BATCH INSERT查询(How to do a batch insert in MySQL)。
  2. 按照您需要的方式按摩您的数据,然后将其输出到一些临时CSV文件中,然后按照上面的建议运行LOAD DATA [LOCAL] INFILE。如果您不需要预处理数据,只需将CSV提供给数据库(我假设它是MySQL)

答案 1 :(得分:0)

按照以下三个步骤

  1. 使用表格名称保存CSV文件以保存它 至。
  2. 执行python脚本以动态创建表 (更新CSV文件名,数据库参数)
  3. 执行" mysqlimport --ignore-lines = 1 --fields-terminated-by =, - local -u dbuser -p db_name dbtable_name.csv"
  4. PYTHON CODE

    import numpy as np
    import pandas as pd
    from mysql.connector import connect
    
    csv_file = 'dbtable_name.csv'
    df = pd.read_csv(csv_file)
    table_name = csv_file.split('.')
    
    query = "CREATE TABLE " + table_name[0] + "( \n" 
    for count in np.arange(df.columns.values.size):
        query += df.columns.values[count]
        if df.dtypes[count] == 'int64':
            query += "\t\t int(11) NOT NULL"
        elif df.dtypes[count] == 'object':
            query += "\t\t varchar(64) NOT NULL"
        elif df.dtypes[count] == 'float64':
            query += "\t\t float(10,2) NOT NULL"
    
    
        if count == 0:
            query += " PRIMARY KEY"
    
        if count < df.columns.values.size - 1:
            query += ",\n"
    
    query += " );"
    #print(query)
    
    database = connect(host='localhost',  # your host
                         user='username', # username
                         passwd='password',     # password
                         db='dbname') #dbname
    curs = database.cursor(dictionary=True)
    curs.execute(query)
    # print(query)