专栏首页python3Python学习笔记-SQLSERVER

Python学习笔记-SQLSERVER

环境 : 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后,千万必须要关闭该连接。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python3监控网站状态

    py3study
  • Django(三):HttpReques

      当一个请求连接进来时,django会创建一个HttpRequest对象来封装和保存所有请求相关的信息,并且会根据请求路由载入匹配的视图函数。每个请求的视图函...

    py3study
  • Python 3 之 运算符重载详解

    实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。...

    py3study
  • 用Python实现模拟登录正方教务系统抢课

    最近学校开始选课,但是如果选课时间与自己的事情冲突,这时候就可以使用Python脚本自助抢课,抢课的第一步即是模拟登录,需要模拟登录后保存登录信息然后再进行操作...

    sergiojune
  • 1.8亿条海量Txt数据存储MySQL实践

    最近出去旅游了,嗨皮了嗨皮,明天上班,开始做作业,今日将1.8亿数据存储的方式进行总结,欢迎大家拍砖!

    公众号guangcity
  • python3监控网站状态

    py3study
  • 用最小二乘法对多项式进行拟合并可视化

    本篇文章所讲代码是对2018年全国大学生数学建模比赛A题附件的数据进行拟合,代码如下:

    用户3577892
  • 【Code】关于 GCN,我有三种写法

    本篇文章主要基于 DGL 框架用三种不同的方式来实现图卷积神经网络。手机看可能不太方便,可以点击阅读原文,移步到知乎上看(但是我忘了加 = =)。

    阿泽 Crz
  • 如何用vn.py做隔夜交易?

    本文提供了一个每个交易日开盘前不用重连CTP的方法。如果不是特殊需求,强烈建议每天盘前重启程序。感谢viponedream在维恩的派论坛里的分享!

    用Python的交易员
  • 【Code】GraphSAGE 源码解析

    本文代码源于 DGL 的 Example 的,感兴趣可以去 github 上面查看。

    阿泽 Crz

扫码关注云+社区

领取腾讯云代金券