如何快速将数据从Python 3插入SQL Server?



我在快速将大量数据从 Python3 插入 SQL Server 时遇到问题。

目标表有 9 列,包含 3 个索引和 1 个主键。

下面的代码有效,但它比我想要的要慢得多。请参阅下面的时间安排:

-- 1,000 records
In [35]: %time connection_factory.executemany(sql, args)
CPU times: user 30.2 ms, sys: 40.9 ms, total: 71.1 ms
Wall time: 3.54 s
-- 5,000 records
In [46]: %time connection_factory.executemany(sql, args)
CPU times: user 110 ms, sys: 55.8 ms, total: 166 ms
Wall time: 17 s

我已经尝试使用sql_alchemy并且目前正在使用Turbodbc - 但对其他任何工作速度更快的方法都持开放态度。

下面是我的代码示例

from turbodbc import connect, make_options
class ConnectionFactory:
def __init__(self):
self.connection = self.initialize()
@staticmethod
def initialize():
options = make_options(autocommit=True)
return connect(driver="FREETDS",
server="",
port="",
database="",
uid="",
pwd="",
turbodbc_options=options)
def execute(self, query, params=None):
try:
cursor = self.connection.cursor()
cursor.execute(query, params)
except Exception as e:
print(e)
finally:
cursor.close()
return
def executemany(self, query, params=None):
try:
cursor = self.connection.cursor()
cursor.executemany(query, params)
except Exception as e:
print(e)
finally:
cursor.close()
return

sql = """
INSERT INTO table1 (value1,
value2,
value3,
value4,
value5,
value6,
value7)
VALUES (?, ?, ?, ?, ?, ?, ?); """
args = df.to_records().tolist()
connection_factory = ConnectionFactory()
connection_factory.executemany(sql, args)

有没有人熟悉SQL Server和python的这种确切组合,可以为我指明正确的方向?

对不起,我的错误,我发布了有关mySQL的信息。 你正在寻找msSQL。

下面是 msSQL 的等效批量插入语句:

BULK INSERT MyTable
FROM 'pathmyfile.csv'
WITH 
(FIELDTERMINATOR = ';',
ROWTERMINATOR = 'n')

有以下几种选择:

您可以将数据写入.csv文件,然后利用 mySql 非常快速的LOAD DATA INFILE命令。

您还可以使用另一种形式的插入命令,即:

INSERT INTO tbl_name
(a,b,c)
VALUES
(1,2,3),
(4,5,6),
(7,8,9);

请参阅以下优化链接:

  • 加载数据文件内

  • mySQL 插入优化

我可以看到你已经有了 execute(( 的函数。 它应该比批量插入更快。

args= ', '.join(map(str, df.to_records().tolist()))
sql = "
INSERT INTO table1 (value1,
value2,
value3,
value4,
value5,
value6,
value7)
VALUES {}".format(args)
connection_factory = ConnectionFactory()
connection_factory.execute(sql)

创建新方法以从不带参数的字符串执行查询。

def execute2(self, query):
try:
cursor = self.connection.cursor()
cursor.execute(query)
except Exception as e:
print(e)
finally:
cursor.close()
return

最新更新