【问题标题】:How to fast insert data from Python 3 to SQL Server?如何将数据从 Python 3 快速插入 SQL Server?
【发布时间】:2020-01-01 03:44:08
【问题描述】:

我在将大量数据从 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 的这种精确组合,可以为我指明正确的方向?

【问题讨论】:

  • 很抱歉,从哪里加载数据?记录文件?
  • 来自内存中的 pandas 数据帧。我在代码底部显示了转换,但它被滚动窗口隐藏了。

标签: sql-server python-3.x turbodbc


【解决方案1】:

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

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

BULK INSERT MyTable
    FROM 'path\myfile.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);

查看这些优化链接:

【讨论】:

    【解决方案2】:

    我可以看到你已经有了 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
    

    【讨论】:

    • 啊……很有创意。让我试一试,看看它是如何比较的。我会报告调查结果。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2022-01-18
    相关资源
    最近更新 更多