环境 : 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 输入TSQLtsql -S 127.0.0.1\SQLEXPRESS -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.0\Common7\Tools\ .要用到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 installpymssql-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()

更多相关文章

  1. Python添加默认模块搜索包路径
  2. python 装饰器和 functools 模块
  3. Python 3.x--模块导入
  4. Python 安装 pip模块
  5. 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)
  6. Python实战小程序——matplotlib模块画图
  7. python 带正则的search 模块
  8. python subprocess模块 监控子进程的2种方式 忙等待和立即返回同
  9. Shell脚本更改带变量的目录

随机推荐

  1. Android adb的使用略解
  2. android JNI 学习笔记
  3. AVD(android virtual device )路径设置
  4. android 输入法默认设置
  5. javax.net.ssl.SSLException: hostname i
  6. Android(安卓)项目打包时出现“TaskExecu
  7. Android(安卓)Studio 发布Jar ,aar 到Mave
  8. Android中的android.provider.Settings.S
  9. 【android 自动化测试】Testing和Instrum
  10. android 一个app启动另一个App的几种方法