zoukankan      html  css  js  c++  java
  • python-整理--连接MSSQL

    环境 : python3.4 / win10 / vs2013 / sqlexpress2014

    需要的工具和包

    1.freetds包 下载地址 https://github.com/ramiro/freetds/releases

    2.openssl包(freetds包要引用到的这个包) 下载地址 http://www.npcglib.org/~stathis/blog/precompiled-openssl/

    3.pymssql包 下载地址(不是官网)http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql    或者到CMD里执行 pip install pymssql 

                      下载地址2(官网搜索) https://pypi.python.org/pypi/pymssql/2.1.2

    安装测试:

              前两个包都下的是编译好的版本(python3.4对应VS2010,openssl下的是VS2013),解压之后添加各包的BIN目录到环境变量

              打开CMD 输入TSQL tsql -S 127.0.0.1SQLEXPRESS -U sa -P 123456

               -S 主机和实例名 -U 数据库账号 -P 密码

    到此为止,TDS测试连接成功了.

    二.pymqql 模块连接mssql

      这个模块包含pymssql和_mssql两个模块.它们的关系如右图(来自源码文件中)

    可以使用pymssql这个模块,也可以使用_mssql.从图上看,区别是pymssql是在_mssql上作了封装,是为了遵守python的DBAPI规范接口.

    pymssql文档地址 http://pymssql.org/en/latest/intro.html 

    pymssql安装遇到的问题

    pymssql安装好之后,发生找不到DLL的问题,这些DLL是FREETDS和SSL的DLL库,将它们放到pymssql的安装包目录下就可以了

    1.编译

      源码下载地址 https://github.com/pymssql/pymssql

          在源码目录执行  setup.py build

      如果报错说找不到VC++10,可以新加一个环境变量 VS100COMNTOOLS  C:Program Files (x86)Microsoft Visual Studio 12.0Common7Tools      .要用到C++编译工具,其实装了VS2013后这个变量值本来就有,不过名字叫VS12,我安装的是PYTHON3.4版本,说是对应VS2010的编译器,所以setup.py文件里会找VS2010的编译工具路径,名字叫VS10.

         此时又出错了,说是link.exe dll/ ....(略)找不到一系列的DLL.经过查找,缺少的就是FREETDS和SSL的库.此时需要:

        1).在源代码目录的freetds目录下新建目录vs2010_32,然后将之前下载好的freetds-v0.95.81-win-x86-vs2010里面的libinclude两个文件夹复制到此.

        2).在源代码根目录下新建目录openssl,然后将之前下载好的openssl-1.0.2f-vs2013里面的lib目录复制到此

         再次编译或者直接安装 setup.py install   ,pymssql会被安装到python34的lib/site-packages目录里面,也就是装第三方模块的目录

         到于为什么新建的文件夹是这些名字,可以查看setup.py脚本,里面都有提及.为什么不将这些库直接包含有源码里呢,可能是因为这也是三方库,而且编译好的版本并不一定适用使用者吧.

    2.使用

      安装之后使用,发现报错说是找不到DLL模块.此时将上面1),2)步提到的DLL文件拿出来直接放到pymssql安装目录下面就可以了

    3.问题

      pip install pymssql 使用这个命令安装的话,就可能发生找不到DLL模块的错误

      pip install pymssql-2.1.2-cp34-cp34m-win32.whl 使用下载好的WINDOWS离线安装包,则没出现这个问题

    三 myssql增删查改示例

      

    import _mssql
    # 登录连接超时时间60S 
    # Timeout for connection and login in seconds, default 60.
    print(_mssql.login_timeout) 
    
    # 从这个错误严重程序起开始引发异常.默认值6适合大多数情况.
    # Minimum severity of errors at which to begin raising exceptions. The default value of 6 should be appropriate in most cases.
    print(_mssql.min_error_severity)
    
    # 设置允许在任何给定时间打开的并发连接的最大数目。默认值是25。
    # Sets maximum number of simultaneous connections allowed to be open at any given time. Default is 25.
    # 这是个方法,加入参数即为设置.此处打印出来的是4096 数据库版本为SQLEXPRESS2014
    print(_mssql.get_max_connections())
    
    #########################################################################################
    # 建立连接使用这个对象 _mssql.MSSQLConnection 以下是连接参数
    # 可以通过调用pymssql.connect创建这个类的一个实例()。它接受以下参数。请注意,您可以使用关键字参数,而不是位置arguments.5。
    # server (str) 
        #r'.SQLEXPRESS' – SQLEXPRESS instance on local machine (Windows only)
        #r'(local)SQLEXPRESS' – Same as above (Windows only)
        #'SQLHOST' – Default instance at default port (Windows only)
        #'SQLHOST' – Specific instance at specific port set up in freetds.conf (Linux/*nix only)
        #'SQLHOST,1433' – Specified TCP port at specified host
        #'SQLHOST:1433' – The same as above
        #'SQLHOST,5000' – If you have set up an instance to listen on port 5000
        #'SQLHOST:5000' – The same as above
    # user (str) – 用户名 Database user to connect as
    # password (str) – 密码 User’s password
    # charset (str) –  字符集的名称为连接设置。Character set name to set for the connection.
    # database (str) – 要初始连接到数据库中;通过默认,SQL Server的选择被设置为默认的特定用户数据库 The database you want to initially to connect to; by default, SQL Server selects the database which is set as the default for the specific user
    # appname (str) – 设置为用于连接的应用程序的名称 Set the application name to use for the connection
    # port (str) – TCP端口用于连接到服务器 the TCP port to use to connect to the server
    # tds_version (str) – TDS协议版本索要。默认值:'7.1' TDS protocol version to ask for. Default value: ‘7.1’
    # conn_properties – SQL查询在连接建立时发送到服务器。可以是一个字符串或另一种字符串可迭代的。 默认值: SQL queries to send to the server upon connection establishment. Can be a string or another kind of iterable of strings. Default value:
        #SET ARITHABORT ON;
        #SET CONCAT_NULL_YIELDS_NULL ON;
        #SET ANSI_NULLS ON;
        #SET ANSI_NULL_DFLT_ON ON;
        #SET ANSI_PADDING ON;
        #SET ANSI_WARNINGS ON;
        #SET ANSI_NULL_DFLT_ON ON;
        #SET CURSOR_CLOSE_ON_COMMIT ON;
        #SET QUOTED_IDENTIFIER ON;
        #SET TEXTSIZE 2147483647; -- http://msdn.microsoft.com/en-us/library/aa259190%28v=sql.80%29.aspx
    
    # 建立连接对象
    dbconn=_mssql.connect(server=r'.SQLEXPRESS',user='sa',password='123456',database='testdb',charset='utf8')
    # 是否连接状态
    print(dbconn.connected)
    # TDS版本MSSQLConnection.tds_version
    print(dbconn.tds_version)
    # 插入一个语句
    re=dbconn.execute_non_query("insert into WuJiang(Name,WuLi,ZhiLi,Sudu,WuPin,ZhiWu) values(%s,%d,%d,%d,%s,%s)",('曹操',215,230,180,'倚天剑','丞相'))
    # 影响的行数
    print('执行insert后影响的行数:',dbconn.rows_affected)
    # 标识值返回
    print(dbconn.identity)
    # 打印字符集名
    print(dbconn.charset)
    # 执行一个查询
    dbconn.execute_query('SELECT * FROM WuJiang')
    # 这是结果集列表
    dblist=[]
    # MSSQLConnection类有一个迭带器,可以进行遍历.它包含一个类,实现了迭带器的一些典型方法(可在查看源码)
    for row in dbconn:
        #print("Id={0},Name={1},WuLi={2},ZhiLi={3},Sudu={4},WuPin={5},ZhiWu={6}".format(row['Id'], row['Name'],row['WuLi'],row['ZhiLi'],row['Sudu'],row['WuPin'],row['ZhiWu']))
        dblist.append(row)
    from DBA.Model import Model
    wjobj=Model()
    # dblist中的row,是数据表中的一行,是个字典.对列的一个字段包含两种键值对{列名:值,列索引:值}
    for k,v in dblist[0].items():
        if type(k)==str:# 这里只取列名:值 键值对
            wjobj.__dict__[k]=v
    print(wjobj.__dict__)
    
    # 执行标量查询
    na=dbconn.execute_scalar("select name from wujiang where id=%s",'0')
    print(na)
    
    # 得到一个row
    ro=dbconn.execute_row("select Name,WuLi,ZhiLi,Sudu,WuPin,ZhiWu,Id from wujiang where id=%d",1)
    print(ro)
    
    # 得到列标题
    colname=dbconn.get_header()
    print(colname)
    
    print()
    # 基础异常
    try:
        dbconn.execute_query("select Name,WuLi,ZhiLi,Sudu,WuPin,ZhiWu,Id from wujiang where id=%d",'abc')
    except  _mssql.MssqlDatabaseException as e:
        print('此处发生了异常,内容:',e.message)
        #raise    
    
    # 执行删除
    dbconn.execute_non_query("delete wujiang where id>%d",(1))
    print('执行delete后影响的行数:',dbconn.rows_affected)
    
    dbconn.close()
    View Code 增删查改示例
  • 相关阅读:
    Spring框架的反序列化远程代码执行漏洞分析(转)
    JVM调优总结(转)
    创造与熟练与微创造
    一次 react-router 中遇到的小坑
    mac中强大的快捷键
    数组思维 -- join的一些用法感悟
    undefined null 与 字符串相加
    mobx中的数组需要注意的地方
    更换鼠标垫(鼠标)的心路历程
    Object.defineProperty 中的 writable 和 configurable 和 enumerable 的理解
  • 原文地址:https://www.cnblogs.com/mirrortom/p/5218865.html
Copyright © 2011-2022 走看看