【问题标题】:Python - pypyodbc - Importing CSV into MS SQL ServerPython - pypyodbc - 将 CSV 导入 MS SQL Server
【发布时间】:2015-02-26 17:13:16
【问题描述】:

我有一个 Python 脚本,我正在运行它以从 CSV 获取数据并将其插入到我的 MS SQL Server 中。 CSV 大约 35 MB,包含大约 200,000 条记录和 15 列。 SQL Server 导入工具将所有数据插入服务器不到 5 分钟。使用 pypyodbc 的 python 脚本需要 30 分钟或更长时间。

我的代码做错了什么导致这需要这么长时间

import pypyodbc
import csv
import datetime

now = datetime.datetime.now()

cnxn = pypyodbc.connect('DRIVER={SQL Server};SERVER=;DATABASE=') 
cursor = cnxn.cursor()

cursor.execute("""
DELETE FROM DataMaster
""")
cnxn.commit()

FileName = "Data - " + str('{:02d}'.format(now.month)) + "-" + str('{:02d}'.format(now.day-1)) + "-"  + str(now.year) + ".csv"
myCSV = open(FileName)
myCSV = csv.reader(myCSV)
next(myCSV, None) # this skips the headers

listlist = list(myCSV)

cursor.executemany('''
    INSERT INTO DataMaster (Column1,Column2,Column3,Column4,Column5,Column6,Column7,Column8,Column9,Column10,Column11,Column12,Column13,Column14,Column15) 
    VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)''', 
    (
    listlist
    )
    )

cursor.commit() # commits any changes

cnxn.close() # closes the connection

print "Import Completed."

【问题讨论】:

  • 您是否尝试过“BULK INSERT”命令?
  • 我没有。我以前没用过。所以,我只是设置了批量插入语句,也许在 SSMS 中对其进行测试,然后只需从我的 Python 脚本中运行该 SQL?你觉得这样会快很多吗?
  • 是的,恕我直言,BULK INSERT 是导入数据的最快方式。您可以在 SSMS 中轻松对其进行测试。
  • 好的,谢谢。我今天将致力于创建批量插入语句,并看看它是如何进行的。
  • 是的,不是那样的。只是一个计划旧表。使用 SQL Server 导入向导导入 CSV 需要 15.86 秒。我刚刚测试了它以获得基准。与 PyPyODBC 方法相比,它的速度如此之快令人难以置信。我想我需要考虑获得执行批量插入所需的权限。

标签: python sql sql-server csv


【解决方案1】:

下面的代码应该适用于您的情况。这应该不会有太多时间。

import pymysql
import logging

import numpy as np
try:
        conn = pymysql.connect(hostname='', user='user', passwd='password', db='dbname', connect_timeout=5)
    except Exception as e:
        logger.error("ERROR: Unexpected error: Could not connect to MySql instance.")
        logger.error(e)
        sys.exit()

    logger.info("SUCCESS: Connection to SQL Server instance succeeded")

    local_cursor = conn.cursor()
    path ='path/*/csv' 
    for files in glob.glob(path + "/*.csv"):
        add_csv_file="""LOAD DATA LOCAL INFILE '%s' INTO TABLE tablename FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'  IGNORE 1 LINES;;;""" %(files)


        cursor.execute(add_csv_file)

cnx.commit()
cursor.close();
cnx.close();

如果可行,请选择答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2021-02-04
    • 2012-04-05
    • 2017-02-15
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多