环境 : python3.6 / win10 / vs2017 / sqlserver2017html
1、须要安装的包pymssqlpython
pip install pymssql
2、pymssql模块的介绍sql
pymssql 包 有modules:app
因此我更加推荐使用_mssql,而不是网上案列里比较多的pymssql函数
3、对_mssql模块的封装sqlserver
一、简单的执行性能
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
4、对于大批量Insert的操做测试
pymssql的模块提供了executemany来执行大批量的导入。spa
导入列表里的元素行为Tuple,相似 DataList=[(1,2),(2,3)]scala
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后,千万必需要关闭该链接。