环境 : python3.6 / win10 / vs2017 / sqlserver2017

一、需要安装的包pymssql

pip install pymssql

二、pymssql模块的介绍

pymssql 包 有modules:

  • pymssql – 如果您关注DB-API遵从性,或者如果您习惯于DB-API语法,请使用它。
  • _mssql –  比pymssql更高性能和易用性,性能高出不是一点点,用法也相对简单。

所以我更加推荐使用_mssql,而不是网上案列里比较多的pymssql

三、对_mssql模块的封装

1、简单的执行

class C_SQLServer(object):
def __init__(self, Server,user,password,database):
self.Server=Server
self.user=user
self.password=password
self.database=database
#执行无返回操作,适用与(insert,update,delete)
def execute_non_query(self,SQLStr):
conn = _mssql.connect(server=self.Server, user=self.user, password=self.password, database=self.database,charset='utf8')
conn.execute_non_query(SQLStr)
#执行返回迭代器的操作,迭代器中的行以字典方式展示,适用于(select)
def execute_query(self,SQLStr):
conn = _mssql.connect(server=self.Server, user=self.user, password=self.password, database=self.database,charset='utf8')
conn.execute_query(SQLStr)
return conn
#执行返回单行的字典
def execute_row(self,SQLStr):
conn = _mssql.connect(server=self.Server, user=self.user, password=self.password, database=self.database,charset='utf8')
row=conn.execute_row(SQLStr)
return row
#执行返回单值的操作,适用于返回行计数等
def execute_scalar(self,SQLStr):
conn = _mssql.connect(server=self.Server, user=self.user, password=self.password, database=self.database,charset='utf8')
scalar=conn.execute_scalar(SQLStr)
return scalar
#获取标题,以及标题类型字典
def MSSQL_GetTitleDict(self,conn):
titleDict={}
for rows in conn.get_header():
titleDict[rows[0]]=rows[1]
     #如果调用conn完成后千万记得,要吧连接关闭。
     conn.close()
return titleDict

四、对于大批量Insert的操作

pymssql的模块提供了executemany来执行大批量的导入。

导入列表里的元素行为Tuple,类似 DataList=[(1,2),(2,3)]

cursor.executemany(
"INSERT INTO persons VALUES (%d, %s, %s)",
[(1, 'John Smith', 'John Doe'),
(2, 'Jane Doe', 'Joe Dog'),
(3, 'Mike T.', 'Sarah H.')])
# you must call commit() to persist your data if you don't set autocommit to True
conn.commit()

_mssql模块没有提供批量导入的功能。

但是我们可以用拼接字符串 Insert ————Select————UNION ALL————SELECT 去实现。

测经过测试,同样插入10W的数据,_mssql模块写拼接比pymssql的executemany快了近3倍多。

代码如下:

    def GetTableTitle(self,tableName):
SQLStr=f"select * from {tableName}"
conn=self.execute_query(f"select * from {tableName}")
titleDict=self.MSSQL_GetTitleDict(conn)
return titleDict
  #拼接字符串 Insert ————Select————UNION ALL————SELECT类型插入
def InsertByRow(self,tableName,TitleList,DataList):
#获取列头的字典包含列名以及数据类型
titleDict=self.GetTableTitle(tableName)
#定义Insert语句的头部
insertTitleStr=f"Insert into {tableName} (" + ','.join(TitleList)+")\n"
#批导入变量,执行行号
i=0
#按行执行
for row_dict in DataList:
insertRowStrList=[]
#循环列
for columnName in TitleList:
columnType=titleDict[columnName]
if columnType in [1,4]:
isChar=1
else:
isChar=0
columValue= row_dict[columnName]
#SqlParameter_AddQuotes函数用以增给值增加单引号
columValue=SqlParameter_AddQuotes(isChar,columValue)
queryStr=columnName+"="+columValue
insertRowStrList.append(queryStr)
#行的SelectStr
insertRowStr=','.join(insertRowStrList)
if i==0:
insertStr="Select "+insertRowStr
else:
insertStr+="\n union all \nSelect "+insertRowStr
i+=1
#定义批量插入的大小,这里是300行为一批Insert
if i%300==0:
self.execute_non_query(insertTitleStr+'\n'+insertStr)
i=0
#剩余数据Insert
self.execute_non_query(insertTitleStr+'\n'+insertStr)

性能刚刚的!日常的操作基本也就都封装好了!

但是记得打开conn后,千万必须要关闭该连接。

Python学习笔记-SQLSERVER的大批量导入以及日常操作(比executemany快3倍)的更多相关文章

  1. Python学习笔记(15)- os\os.path 操作文件

    程序1 编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图: import os def countfile(path): dict1 = {} # 定义一个字典 all_files = ...

  2. Python学习笔记(三)字符串类型及其操作(2)

    1.字符串的表示 字符串是字符的序列表示,可以由一对单引号(‘).双引号(“)或三引号(’‘’)构成.其中,单引号.双引号和三引号都可以表示单行字符串,但是只有三引号可以表示多行字符串 在使用双引号时 ...

  3. 吴裕雄--天生自然python学习笔记:pandas模块导入数据

    有时候,手工生成 Pandas 的 DataFrame 数据是件非常麻烦的事情,所以我们通 常会先把数据保存在 Excel 或数据库中,然后再把数据导入 Pandas . 另 一种情况是抓 取网页中成 ...

  4. Python学习笔记 (3) :列表、元组的操作

    列表,即写在方括号之间.用逗号分隔开的数值列表.列表内的项目不必全是相同的类型. >>> a = ['spam', 'eggs', 100, 1234] >>> a ...

  5. Python学习笔记:第3天 字符串的操作

    目录 1. python的数据类型 2. int类型的操作 3. bool类型 4. 字符串的操作 5. for循环 1. python的数据类型 int 整数 str 字符串.一般不会用字符串保存大 ...

  6. python学习笔记3---浅拷贝和深拷贝,file操作

    import copy a=[1,2,3,['a','b']] b=a c= copy.copy(a)---浅拷贝 d=copy.deepcopy(a)---深拷贝 file操作: python 文件 ...

  7. python学习笔记(mysqldb下载安装及简单操作)

    python支持对mysql的操作 已经安装配置成功python.mysql 之后根据各自电脑配置选择对应系统的MySQL-python 文件是EXE格式.打开下一步即可 下载地址博主分享下: htt ...

  8. python学习笔记(四)字符串及字符串操作

    字符串 字符串可以存任意类型的字符串,比如名字,一句话等等. 字符串还有很多内置方法,对字符串进行操作,常用的方法如下: name1='hello world' print(name.capitali ...

  9. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

随机推荐

  1. 爬虫基础(五)-----scrapy框架简介

    ---------------------------------------------------摆脱穷人思维 <五> :拓展自己的视野,适当做一些眼前''无用''的事情,防止进入只关 ...

  2. 云计算openstack介绍

    一.云计算的前世今生 所有的新事物都不是突然冒出来的,都有前世和今生.云计算也是IT技术不断发展的产物. 要理解云计算,需要对IT系统架构的发展过程有所认识. 请看下 IT系统架构的发展到目前为止大致 ...

  3. iOS 友盟错误分析-2019

    友盟的错误分析越来越人性化了 前提集成了友盟统计,并打包的时候保留了.dSYM文件 先看看效果 可以看到bug显而易见的被发现了!那个文件夹,那一行代码 那么怎么才能这样呢 首先加入符号表,就是.dS ...

  4. Collections算法类

    Collections类定义了一系列用于操作集合的静态方法. 常用方法: 1.sort():排序(默认是升序排列,降序实现方法) 如果ArrayList的泛型指定为String int等类型,可以通过 ...

  5. Linux基础优化与安全归纳总结

    一名运维工程师在运维岗位上时间久了,就会发现Linux优化的重要性,同时会给运维工作带来很多的便利性.本人逐渐认识到了这一点,所以特意在工作闲暇之余,通过阅读Linux相关书籍及向同事.同行高手咨询, ...

  6. [题解]玩具谜题(toy)

    玩具谜题(toy) 来源:noip2016 提高组 day1 [题目描述] 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个 ...

  7. mybatis 一对多查询

    需求:一条数据对应多张表 ad_share_friends  主表 ad_share_image 图片表 建立实体 adShareFriends  和  adShareImage *注意在adShar ...

  8. 踩坑之mongodb配置文件修改

    一.说明 本文档是在mongodb为3.4下编写的,仅作为参考 配置mongodb有两种方式,一种是通过mongod和mongos两个命令:另外一种方式就是配置文件的方式.因为更容易去管理,所以后者更 ...

  9. ExcelPower_Helper插件下载与更新日志

    ExcelPower_Helper插件下载.功能简述与演示 ExcelPower_Helper最新版本为:0.4.5,截止到目前为止. 下载地址: 链接:https://pan.baidu.com/s ...

  10. [Cordova inAppBrowser 在App内打开浏览器]

    方案1: 使用Cordova插件 cordova-plugin-inappbrowser 1.  添加插件 cordova plugin add cordova-plugin-inappbrowser ...