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.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里面的lib和include两个文件夹复制到此.
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='',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",'')
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()
增删查改示例
python-整理--连接MSSQL的更多相关文章
- python 连接mssql数据库
1.目标数据sql2008 R2 ComPrject=>TestModel 2.安装python 连接mssql 模块 运行 pip install pymssql-2.2.0.dev0-cp3 ...
- 孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库
孤荷凌寒自学python第五十八天成功使用python来连接上远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第四天.今天的感觉是,mongoDB数据 ...
- 孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库
孤荷凌寒自学python第五十七天初次尝试使用python来连接远端MongoDb数据库 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第三天.感觉这个东西学习起来还是那么困 ...
- 关于python字符串连接的操作
python字符串连接的N种方式 注:本文转自http://www.cnblogs.com/dream397/p/3925436.html 这是一篇不错的文章 故转 python中有很多字符串连接方式 ...
- php 连接 mssql 常见的所有问题
php连接mssql时 ntwdblib.dllPHP连接MSSQL配置和PHP代码演示 收藏 如果实现了PHP和MySQL链接了,PHP和MSSQL的链接其实很简单: 支持MSSQL的本地链接和远程 ...
- windows下用golang连接mssql
版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 安装Microsoft SQL Server Native Client 安装golang的mssql驱动 写测试代码 ...
- python 字符串连接
字符串连接 方法1: 用字符串的join方法 a = ['a','b','c','d']content = ''content = ''.join(a)print content 方法2: 用字符串的 ...
- Linux下用freetds连接mssql中文乱码的问题【参考2】
php5.3的情况下,用pdo的dblib驱动无法连接mssql的,根据官方的描述,5.2已经修改这个bug,5.3没有. 用php自带的mssql函数可以的.编译freetds,php_mssql, ...
- FIREDAC连接MSSQL 2000报不能支持连接MSSQL2000及更低版本的解决办法
FIREDAC连接MSSQL 2000的时候会报错,原因是MSSQL CLIENT11或MSSQL CLIENT10客户端驱动程序已经不支持连接MSSQL2000及更低版本的数据库. 解决办法: 设置 ...
随机推荐
- CSS: Table-Layout & Word-Break 设置表和列的宽度固定不变
1. 设置Table的列宽由表格宽度和列宽度设定(指定表格宽度,各个列宽度): table#tbl_id{table-layout:fixed;} 2. 设置TD内容根据宽度进行换行,即使字符串之间无 ...
- 使用MSSM管理工具登录LOCALDB
调试程序没有安装 sql server时,可以使用localdb.这是一个简易的sql server数据库,用于本地测试是很方便,省去安装SQL SERVER的工作 电脑上安装了VS2013 VS20 ...
- JavaScript可否多线程? 深入理解JavaScript定时机制(转载)
说明:最近写 js 时需要用setinterval函数做定时操作,谁知道,刚开始后运行完好,但一段时间后他就抽风了,定时任务运行的时间间隔越来越短,频率加快,这是一个完全不能容忍的问题,带着一个可以出 ...
- mongodb的连接问题,绑定IP惹的祸
刚刚安装好了 mongodb .对着 mongodb in action上的例子敲了下面的代码: public class TestDBConnect { @Test public void test ...
- Android再学习-20140928-布局
关于布局中的单位 PX是像素,这个没有问题.另外还有两个单位,一个是dp,这个是个相对单位,在任何分辨率的屏幕上显示效果是一样的,所以用dp来进行控件的大小设置.另外,字体的设置推荐用sp,这样字体可 ...
- post 报文请求接口方法
/// <summary> /// post 报文到接口服务器 /// </summary> /// <param name="targetUri"& ...
- SEO教程:向百度要流量 第一季
首先祝贺你:当你看到这篇文章时,你已经站在一条通往SEO达人捷径的路口. 笔者也是今年年初才成为SEOer的一员,在做SEO的过程中,有不少自己独特的心得体会,所以一直酝酿着写一个SEO系列的文章,将 ...
- android的微信签名
目标: 已经在微信官网申请了账号了,想要在上面开发应用,必须首先对应用进行审核.在审核之前,需要填写应用的相关信息,包括名称.图标.用途说明.签名等. 下面介绍如何获取程序的签名. 解决方案: 选择程 ...
- 伪造队形(FFT)
题目描述Tukkun带着他的合唱队去环形音乐厅参加演出.上场前,Tukkun发现了严重的问题:音乐厅的工作人员把他们的合唱队形搞错了.具体来说,Tukkun的合唱队有N个人围成一圈,身高按照顺时针顺序 ...
- 批量删除Kindle Personal Documents
javascript:(function(){ var v = new RegExp("amazon"); if (!v.test(document.URL)) { return ...