当前位置: 首页 > 面试题库 >

如何使用pyodbc加快从CSV到MS SQL Server的批量插入

公冶才
2023-03-14
问题内容

以下是我需要帮助的代码。我必须运行1,300,000行,这意味着最多需要 40分钟 才能插入〜300,000行。

我认为批量插入是加快速度的途径吗?还是因为我要通过for data in reader:部分遍历行?

#Opens the prepped csv file
with open (os.path.join(newpath,outfile), 'r') as f:
    #hooks csv reader to file
    reader = csv.reader(f)
    #pulls out the columns (which match the SQL table)
    columns = next(reader)
    #trims any extra spaces
    columns = [x.strip(' ') for x in columns]
    #starts SQL statement
    query = 'bulk insert into SpikeData123({0}) values ({1})'
    #puts column names in SQL query 'query'
    query = query.format(','.join(columns), ','.join('?' * len(columns)))

    print 'Query is: %s' % query
    #starts curser from cnxn (which works)
    cursor = cnxn.cursor()
    #uploads everything by row
    for data in reader:
        cursor.execute(query, data)
        cursor.commit()

我有目的地动态地选择列标题(因为我想创建尽可能多的pythonic代码)。

SpikeData123是表名。


问题答案:

更新:如@SimonLang的注释中所述,BULK INSERT在SQL Server
2017及更高版本下,显然支持CSV文件中的文本限定符(请参阅:此处)。

BULK INSERT几乎肯定会 比阅读源文件一行一行地,做的每一行定期INSERT更快。但是,对于CSV文件,BULK
INSERT和BCP都存在很大的局限性,因为它们不能处理文本限定符(请参阅:此处)。也就是说,如果您的CSV文件中
没有 限定的文本字符串,则…

1,Gord Thompson,2015-04-15
2,Bob Loblaw,2015-04-07

…那么您可以批量插入它,但是如果它包含文本限定符(因为某些文本值包含逗号)…

1,"Thompson, Gord",2015-04-15
2,"Loblaw, Bob",2015-04-07

…那么BULK INSERT无法处理它。尽管如此,将这样的CSV文件预处理为管道分隔文件的总体速度可能会更快…

1|Thompson, Gord|2015-04-15
2|Loblaw, Bob|2015-04-07

…或制表符分隔的文件(其中代表制表符)…

1→Thompson, Gord→2015-04-15
2→Loblaw, Bob→2015-04-07

…然后批量插入该文件。对于后者(制表符分隔)文件,BULK INSERT代码如下所示:

import pypyodbc
conn_str = "DSN=myDb_SQLEXPRESS;"
cnxn = pypyodbc.connect(conn_str)
crsr = cnxn.cursor()
sql = """
BULK INSERT myDb.dbo.SpikeData123
FROM 'C:\\__tmp\\biTest.txt' WITH (
    FIELDTERMINATOR='\\t',
    ROWTERMINATOR='\\n'
    );
"""
crsr.execute(sql)
cnxn.commit()
crsr.close()
cnxn.close()

注意:如注释中所述,BULK INSERT仅当SQL
Server实例可以直接读取源文件时,才执行语句。对于源文件在远程客户端上的情况,请参见以下答案。



 类似资料:
  • 问题内容: 在python脚本中,我需要在一个数据源上运行查询,并将该查询的每一行插入到不同数据源上的表中。通常,我将使用带有tsql链接服务器联接的单个插入/选择语句来执行此操作,但是我没有与此特定数据源的链接服务器连接。 我很难找到一个简单的pyodbc示例。这是我的操作方式,但我猜想在循环内执行插入语句的速度很慢。 有没有更好的批量方式使用pyodbc插入记录?还是这是一种相对有效的方法。我

  • 问题内容: 我有一些要导入mySQL的CSV数据文件。我想在shell脚本中进行插入,以便可以将其自动化。但是,我对在脚本中使用明文形式输入用户名和密码感到有些厌倦 我有以下问题: 我对脚本中明文中的uname / pwd的想法感到不满意(反正还是这样,还是我太偏执)?也许我可以为插入表设置仅具有INSERT特权的用户? 数据库表(导入原始数据的数据库表)具有基于表列的唯一键。我尝试导入的数据中也

  • Msg 7330,级别16,状态2,第1行 无法从链接服务器“(null)”的OLE DB访问接口“BULK”中获取行。 有什么想法吗?谢谢你。

  • 我正在使用HiberNate envers进行审计,我的大多数表都很好地执行批处理插入。然而,在我的一个实体上,我有一个经过审计的集合,它似乎不想批处理。 MyEntity: (不确定这是否重要,我正在使用postgresql)。在日志中,我在一个循环中看到了1000条这样的语句 在进行一些调试时,我了解到select for update语句会导致上一次插入的刷新,而不允许它们批处理。这句话似乎

  • 问题内容: 我正在尝试使用Nest将多个记录插入数据库。使用IndexMany类插入确实可以,但是我还需要通过json字符串插入对象。 我确实在github上进行了查找,并找到了一些如何使用RAWclient的示例。在代码示例下面,我插入json。 一些其他信息: jsondata: var twitter: 我从数据库收到的结果: 有人知道这个问题可能是什么吗?还是我在json /代码中丢失了什

  • 本文向大家介绍使用JDBC在MySQL数据库中如何快速批量插入数据,包括了使用JDBC在MySQL数据库中如何快速批量插入数据的使用技巧和注意事项,需要的朋友参考一下 使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: Adds a set of parameters to t