追求速度问题,使用csv缓存,从csv中获取数据,速度最快

pymssql模块 :使用execute, 然后fetchall(),速度在 7min 左右

pandas read_sql :速度差不多,数据量大,速度有优势

pyodbc模块 、pyodbc模块待测试,速度应该会没差别

pandas模块 read_csv :直接从csv文件取相同数据,read_csv(),只需几秒。

2、百万DataFrame 入库:

pymssql模块 :10分钟

  • execute和executemany(遍历execute,坑爹)是一条条的插入,超级慢

  • 拼接sql,value后面最多接1000条数据。速度大概在10分钟作用

pyodbc模块 :3分钟

  • 设置fast_executemany=True,只需3分钟就可以完成,设置1W参数,然后遍历executemany,速度最快(还需要测试)

pandas模块 :3分钟

  • 原始状态就是一条条插入,速度太慢,10几个小时吧
    2、修改conn,设置为fast_executemany=True,即底层调用pyodbc模块,速度3分钟左右

调用java模块 :2分钟

  • 速度在几十秒,但是写成csv需要1分钟多,然后java从csv读数据写入sql server只需几十秒

bulk insert方式 :1分钟

  • 几秒完成,百万数据写入csv需要1分钟,但是遇到code3(路径)和code5的错误(权限),还需要解决。

pyodbc vs turbodbc

to_sql 用于将pandas DataFrame上传到SQL Server时,turbodbc肯定会比pyodbc更快 fast_executemany=False ,但是, fast_executemany=True 的pyodbc,两种方法都会产生基本相同的性能。1W行100列的DataFrame,平均30秒左右。

二、FAQ

环境:win10,sql server 2016

1、 conn = 'DRIVER={SQL Server Native Client 11.0};SERVER=xxxx;DATABASE=xxx;UID=xxxx;PWD=xxxx'

这里driver必须选择11.0版本

2、to_sql一直显示create附近语法错误,还有一个问题是,to_sql执行成功,无任何错误,但数据库没有数

ERROR: sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'BIGINT'.

原因是 bak.[51card_speed_up_test] 带了括号,而to_sql不会自己转义,去掉括号就能解决。

3、密码错误,接口参数不对 sqlalchemy.exc.InterfaceError: (pyodbc.InterfaceError) ('28000', "[28000]

4、这里para为60W的时候不能组装。当数据为100左右的时候,能自己组装。

ERROR: sqlalchemy.exc.ProgrammingError: (pyodbc.ProgrammingError) ('The SQL contains -66 parameter markers, but 65470 parameters were supplied', 'HY000')。cursor.execute(statement, parameters)

5、使用上下文模式

with engine.begin() as conn:
    df.to_sql(name='my_balance', con=conn, if_exists='append',
              index=False, index_label='id')
    # 故意出现错误的代码,测试事物回滚
    df1.to_sql(name='my_balance', con=conn, if_exists='append')
  • 多线程入库,没有尝试成功,多个connect 或者 单个con和多个cursor 也没有解决。查询资料是说没有pyodbc 模块速度快。
在前几篇文章中,数据库的记录仅限于较小的数据和单个元组。本文将解释如何使用涵盖所有异常的模块SQLite3从数据库中写入和获取大数据。一种简单的方法是执行查询并使用fetchall()。1.executescript()这是一次可以同时执行多个SQL语句的便捷方法。它执行作为参数获取的SQL脚本。语法:sqlite3.connect.executescript(script)import sqli... 值得注意的是,在实际生产环境中,我们还需要考虑异常处理、连接池管理、安全性(如使用加密连接、不将密码硬编码在代码中)等方面的问题,以构建更健壮和安全的数据库连接和交互机制。通过这种封装方式,我们可以方便地在不同的Python脚本或模块中重用数据库连接和操作的代码,从而提高代码的可维护性和复用性。使用这个类,我们可以方便地连接到数据库,执行查询和非查询操作,并在完成后关闭连接,确保资源的正确管理。通过封装MySQL连接和操作,我们可以创建更加健壮和可维护的Python代码,同时减少重复的代码和潜在的错误。 #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致。/// </summary> /// <param name="conStr">数据库连接串</pa... 上述代码将从指定的CSV文件路径导入数据到名为"MyTable"的表中。本文将详细介绍如何使用一些有效的技术和最佳实践,以在4秒内将百万数据导入SQL Server数据库。首先,我们需要准备好要导入的百万数据。确保数据源的格式正确,并根据需要进行必要的数据清洗和转换。通过遵循上述步骤和最佳实践,您可以实现在4秒内将百万数据导入SQL Server数据库。根据您的具体需求和环境,可能需要进行一些调整和优化。在SQL Server中,我们需要创建一个表来存储导入的数据。根据数据的结构,创建相应的表和列。 如何使用pyodbc将dataframe中的列插入到sqlserver中? 您得到错误消息是因为您试图使用参数化查询,但没有将参数值传递给execute方法。在 此外,不需要通过在显式的for循环中调用execute来逐行插入。您可以使用executemany代替: # test data df = pd.DataFrame( [(1, ‘Josh’, 10000), (2, ‘Michael’, 5000), (3, ‘Sara’, 8000)], columns=[‘id’, ‘name’, ‘sala 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:  select id from t where num i 设置create_engine参数:fast_executemany=True,可以提高tosql效率N倍(自己测试七十万条数据插入,设置fast_executemany后的时间仅需两分钟左右,未设置之前跑了一个多小时都没跑完被我手动结束) connection_string = "xxxxxxxxx" engine = create_engine(connection_string,fast_e... <pandas.DataFrame>的to_sql()方法导入数据库很方便,但是比较慢(参考另一篇具体插入方法)。在最近一次大量数据导入SQLSever时让我尤其不耐烦,尝试过给to_sql()方法传入method="multi"​不知道为啥竟然报错了。  百度pandas to_sql 加速的结果只有一篇利用sqlalchemy的copy_from方法加速PostgreSQL数据插入... 探索PyMSSQLPythonSQL Server的无缝连接库 pymssqlOfficial home for the pymssql source code.项目地址:https://gitcode.com/gh_mirrors/py/pymssql PyMSSQL是一个轻量、高效能的Python库,用于连接和操作Microsoft SQL Server数据库。如果你在Python环... pyodbc.ProgrammingError: (“ 42000”,“ [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server]无法在事务内执行备份或还原操作。(3021)(SQLExecDirectW); [42000] [Microsoft] [ODBC SQL Server驱动程序] [SQL Server] BACKUP ...