pymssql包是Python语言用于连接SQL Server数据库的驱动程序(或者称作DB API),它是最终和数据库进行交互的工具。SQLAlchemy包就是利用pymssql包实现和SQL Server数据库交互的功能的。

一,pymssql包的基本组成

pymssql包有两个模块构成:pymssql 和 _mssql,pymssql 是建立在_mssql模块之上的模块。

pymssql模块由Connection和Cursor 两个大类构成:

  • Connection类代表MS SQL Sever数据库的一个连接,
  • Cursor类用于向数据库发送查询请求,并获取查询的的结果。

二,连接

连接对象用于连接SQL Server引擎,并设置连接的属性,比如连接超时,字符集等。

1,创建连接对象

pymssql通过类函数来构建连接对,在创建连接对象的同时,打开连接:

class pymssql.Connection(user, password, host, database, timeout, login_timeout, charset, as_dict)

2,构建Cursor对象

在创建连接对象之后,创建Cursor对象,使用Cursor对象向数据库引擎发送查询请求,并获取查询的结果:

Connection.cursor(as_dict=False)

as_dict是布尔类型,默认值是False,表示返回的数据是元组(tuple)类型;如果设置为True,返回的数据集是字典(dict)类型。

3,提交查询和自动提交模式

在执行查询之后,必须提交当前的事务,以真正执行Cursor对象的查询请求:

Connection.commit()

默认情况下,自动提交模式是关闭的,用户可以设置自动提交,pymssql自动执行Cursor发送的查询请求:

Connection.autocommit(status)

status是bool值,True表示打开自动提交模式,False表示关闭自动提交模式,默认值是False。

4,关闭连接

在执行完查询之后,关闭连接:

Connection.close()

三,Cursor

通过打开的连接对象来创建Cursor对象,通过Cursor对象向数据库引擎发送查询请求,并获取查询的结果。

1,执行查询

Cursor对象调用execute**()函数来执行查询请求,

Cursor.execute(operation)
Cursor.execute(operation, params)
Cursor.executemany(operation, params_seq)

参数注释:

  • operation:表示执行的sql语句,
  • params :表示sql语句的参数,
  • params_seq:参数序列,用于sql语句包含多个参数的情况。

注意,除设置自动提交模式之外,必须在执行查询之后,通过连接对象来提交查询。

Connection.commit()

如果sql语句只包含一个参数,那么必须在sql语句中显式使用%s或%d作为占位符,分别用于引用字符型的参数和数值型的参数。

cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

如果sql语句包含多个参数,那么使用list来传递参数:

cursor.executemany(
"INSERT INTO persons VALUES (%d, %s, %s)",
[(1, 'John Smith', 'John Doe'),
(2, 'Jane Doe', 'Joe Dog'),
(3, 'Mike T.', 'Sarah H.')])

2,获取查询结果

Cursor对象调用fetch**()函数来获取查询的结果:

Cursor.fetchone()
Cursor.fetchmany(size=None)
Cursor.fetchall()

fetch**()函数是迭代的:

  • fetchone():表示从查询结果中获取下一行(next row)
  • fetchmany():表示从查询结果中获取下面的多行(next batch)
  • fetchall():表示从查询结果中获取剩余的所有数据行(all remaining)

3,跳过结果集

当查询的结果包含多个结果集时,可以跳过当前的结果集,跳到下一个结果集:

Cursor.nextset()

如果当前结果集还有数据行未被读取,那么这些剩余的数据行会被丢弃。

四,执行存储过程

Cursor对象有函数callproc,用于执行存储过程:

Cursor.callproc(sp_name, paras)

第一个参数是存储过程的名称,第二个参数是一个元组类型,

五,pymssql模块的基本操作

 1,pymssql的基本操作

from os import getenv
import pymssql server = getenv("PYMSSQL_TEST_SERVER")
user = getenv("PYMSSQL_TEST_USERNAME")
password = getenv("PYMSSQL_TEST_PASSWORD") conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor(as_dict=False)
cursor.execute("""
IF OBJECT_ID('persons', 'U') IS NOT NULL
DROP TABLE persons
CREATE TABLE persons (
id INT NOT NULL,
name VARCHAR(100),
salesrep VARCHAR(100),
PRIMARY KEY(id)
)
""")
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() cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
row = cursor.fetchone()
while row:
print("ID=%d, Name=%s" % (row[0], row[1]))
row = cursor.fetchone() conn.close()

2,以字典集返回数据行

conn = pymssql.connect(server, user, password, "tempdb")
cursor = conn.cursor(as_dict=True) cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
print("ID=%d, Name=%s" % (row['id'], row['name'])) conn.close()

3,使用with语句

with是上下文管理器,可以自动关闭上下文。

使用with语句来创建连接对象和Cursor对象,那么就不需要显式的关闭连接和Cursor对象:

with pymssql.connect(server, user, password, "tempdb") as conn:
with conn.cursor(as_dict=True) as cursor:
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
print("ID=%d, Name=%s" % (row['id'], row['name']))

六,附上代码库

附上代码,以飨读者。

import pymssql
from sqlalchemy import create_engine
import pandas as pd
from sqlalchemy.sql import text as sql_text class DBHelper:
def __init__(self):
self.name='DB Helper'
self.db_host = r'sql server'
self.db_name = 'db name'
self.db_user = r'sa'
self.db_password = r'pwd' ######################################################
## data connection ##
###################################################### def get_engine(self):
str_format = 'mssql+pymssql://{0}:{1}@{2}/{3}?charset=utf8'
connection_str = str_format.format(self.db_user,self.db_password,self.db_host,self.db_name)
engine = create_engine(connection_str,echo=False)
return engine def get_pymssql_conn(self):
conn = pymssql.connect(self.db_host, self.db_user, self.db_password, self.db_name)
return conn ######################################################
## common SQL APIs ##
###################################################### def write_data(self,df,destination,if_exists='append',schema='dbo'):
engine = self.get_engine()
df.to_sql(destination, con=engine, if_exists=if_exists,index = False, schema=schema
, method='multi', chunksize=1000) def read_data(self,sql):
engine = self.get_engine()
df = pd.read_sql(sql, con=engine)
return df def exec_sql(self,sql):
engine = self.get_engine()
con = engine.connect()
with con.begin() as tran:
con.execute(sql_text(sql).execution_options(autocommit=True)) def exec_sp(self,sp_name,*paras):
with pymssql.connect(self.db_host, self.db_user, self.db_password, database=self.db_name) as conn:
with conn.cursor(as_dict=False) as cursor:
try:
cursor.callproc(sp_name, paras)
conn.commit()
except Exception as e:
print(e) def exec_sp_result(self,sp_name,*paras):
with pymssql.connect(self.db_host, self.db_user, self.db_password, database=self.db_name) as conn:
with conn.cursor(as_dict=True) as cursor:
try:
cursor.callproc(sp_name, paras)
cursor.nextset()
result=cursor.fetchall() conn.commit()
df=pd.DataFrame.from_records(result) return df
except Exception as e:
print(e)

参考文档:

pymssql introduction

pymssql 介绍的更多相关文章

  1. win 下python2.7 pymssql连接ms sqlserver 2000

    python DB-API 连接mysql 要用到库pymssql 下载请到https://pypi.python.org/pypi/pymssql/2.0.1我这里下载的是ms windows in ...

  2. centos下python的pymssql模块安装及简单使用

    1.安装pymssq模块 1-1.环境准备: 1-1-1.unixODBC安装 yum install unixODBC unixODBC-devel -y 1-1-2.freetds安装 下载 fr ...

  3. python:利用pymssql模块操作SQL server数据库

    python默认的数据库是 SQLlite,不过它对MySql以及SQL server的支持也可以.这篇博客,介绍下如何在Windows下安装pymssql库并进行连接使用... 环境:Windows ...

  4. Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

    转载自 https://www.cnblogs.com/luyingfeng/p/6386093.html 安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上 ...

  5. pymssql连接Azure SQL Database

    使用pymssql访问Azure SQL Database时遇到"DB-Lib error message 20002, severity 9:\nAdaptive Server conne ...

  6. pymssql默认关闭自动模式开启事务行为浅析

    使用Python采集SQL Server数据库服务器磁盘信息时,遇到了一个错误"CONFIG statement cannot be used inside a user transacti ...

  7. CSS3 background-image背景图片相关介绍

    这里将会介绍如何通过background-image设置背景图片,以及背景图片的平铺.拉伸.偏移.设置大小等操作. 1. 背景图片样式分类 CSS中设置元素背景图片及其背景图片样式的属性主要以下几个: ...

  8. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  9. Windows Server 2012 NIC Teaming介绍及注意事项

    Windows Server 2012 NIC Teaming介绍及注意事项 转载自:http://www.it165.net/os/html/201303/4799.html Windows Ser ...

随机推荐

  1. 【python接口自动化】- logging日志模块

    前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间.描述信息以及错误或者异常发生时候的特定上下文信息. logging模块介绍 ​ Pyth ...

  2. 微信小程序订阅消息调研

    相关资料 背景:微信模板消息已正式下架,改为订阅消息,详情如下: 服务变更通知 订阅消息:订阅消息相关内容如下: 订阅消息 接口设计 获取接口访问凭证 :根据appId和secret获取接口访问凭证a ...

  3. 解惑4:java是值传递还是引用传递

    一.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:"传参数就是值传递,传对象就是引用传递",后面进一步查找了相关资料和文章以后, ...

  4. 太鸡冻了!我用 Python 偷偷查到暗恋女生的名字

    1 目 标 场 景 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人 ...

  5. Java高级篇XML和正则表达式

    常见的XML解析技术: 1.DOM(基于XML树结构,比较耗资源,适用于多次访问XML): 2.SAX(基于事件,消耗资源小,适用于数量较大的XML): 3.JDOM(比DOM更快,JDOM仅使用具体 ...

  6. 【工具】之001-CentOS7 最小化安装配置

    写在前面 我很懒,,,不想敲一个命令一个命令敲... "偷懒是有前提的,不是之前,就是之后." 简述 CentOS 7 最小化安装版本:CentOS-7-x86_64-Minima ...

  7. Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...

  8. 2020-07-26:如何用 socket 编程实现 ftp 协议?

    福哥答案2020-07-26: 功能用户输入user username.pass password注册,注册后输入dir查看服务器文件列表,输入get filename path下载文件到指定路径. ...

  9. 使用 codeblocks 编写C++ udp组播程序遇到的问题

    编译错误 会出现好多undefined reference to'WSAStartup to@8之类的错误,都是undefind开头的 解决方法: Settings -> Compiler se ...

  10. JAVA设计模式简介及六种常见设计模式详解

    一.什么是设计模式                                                                                           ...