Python操作MSSQL

 

Python连接SQL Server数据库 - pymssql使用基础:https://www.cnblogs.com/baiyangcao/p/pymssql_basic.html

廖雪峰官网 之 Python 访问数据库(SQLLite / MySQL / SQLAlchemy)

 

pymssql examples :http://pymssql.org/en/stable/pymssql_examples.html

python-整理--连接MSSQL:https://www.cnblogs.com/mirrortom/p/5218865.html

 

Python 操作SQLServer 需要使用 pymssql 模块,使用pip install pymssql安装。然后import该包即可。安装成功后,使用如下语句和 MSSql 数据库交互。

( pymssql 需要安装 Cython:https://pypi.org/project/Cython   和   freetds:linux下利用freetds 访问sqlserver数据库  )

下载 FreeTDS,地址:www.freetds.org
下载后解压: tar -zxvf XXX.tar.gz
然后执行
        ./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib
        make
        make install

 

示例代码(游标使用注意事项):

import pymssql# 可以进入 connect 方法里面查看更多参数
conn=pymssql.connect(server='192.168.0.110', port=9526, user='sa', password='pwd', database='test')# 游标使用注意事项
# 一个连接一次只能有一个游标的查询处于活跃状态,如下:
cursor_1 = conn.cursor()
cursor_1.execute('SELECT * FROM persons')cursor_2 = conn.cursor()
cursor_2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')print( "all persons" )
print( cursor_1.fetchall() )  # 显示出的是cursor_2游标查询出来的结果print( "John Doe" )
print( cursor_2.fetchall() )  # 不会有任何结果

为了避免上述的问题可以使用以下两种方式:
    1. 创建多个连接来保证多个查询可以并行执行在不同连接的游标上
    2. 使用fetchall方法获取到游标查询结果之后再执行下一个查询, 
        示例如下:
            c1.execute('SELECT ...')
            c1_list = c1.fetchall()
            
            c2.execute('SELECT ...')
            c2_list = c2.fetchall()

 

游标返回字典变量
    上述例子中游标获取的查询结果的每一行为元组类型,
    可以通过在创建游标时指定as_dict参数来使游标返回字典变量,

    字典中的键为数据表的列名

import pymssql# 可以进入 connect 方法里面查看更多参数
conn = pymssql.connect(server, user, password, database)  # 可以在连接时指定参数 as_dict=True
cursor = conn.cursor(as_dict=True)                        # 也可以在创建游标时指定参数 as_dict=Truecursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:print("ID=%d, Name=%s" % (row['id'], row['name']))
cursor.close()
conn.close()

 

使用with语句(上下文管理器)

    可以通过使用with语句来省去显示的调用close方法关闭连接和游标

import pymssqlwith pymssql.connect(server, user, password, database) 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 pymssqlconn = pymssql.connect(server, user, password, database)
cur=conn.cursor() 
cur.execute('select top 5 * from [dbo].[Dim_Area]')# 如果 update/delete/insert 记得要 conn.commit() ,否则数据库事务无法提交
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
# conn.commit()
print (cur.fetchall())
cur.close()cursor = conn.cursor()
cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)",[(1, 'John Smith', 'John Doe'),(2, 'Jane Doe', 'Joe Dog'),(3, 'Mike T.', 'Sarah H.')])
# 如果没有指定autocommit属性为True的话就需要调用commit()方法
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()# 也可以使用for循环来迭代查询结果
# for row in cursor:
#     print("ID=%d, Name=%s" % (row[0], row[1]))# 关闭连接
conn.close()

示例代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-import pymssqldb_host = '192.168.0.5'
db_port = '9526'
db_user = 'test'
db_pwd = 'test'
db_name = 'TestDB'
tb_name = 'TestTB'class SqlServerOperate(object):def __init__(self, server, port, user, password, db_name):self.server = serverself.port = portself.user = userself.password = passwordself.db_name = db_namepassdef __del__(self):# 其他地方不关闭连接,可以在这个地方统一关闭# self.conn.close()passdef __get_connect(self):self.conn = pymssql.connect(server=self.server,port=self.port,user=self.user,password=self.password,database=self.db_name,as_dict=True,charset="utf8")cur = self.conn.cursor()if not cur:raise (NameError, "连接数据库失败")else:return curdef exec_query(self, sql):cur = self.__get_connect()cur.execute(sql)result_list = list(cur.fetchall())self.conn.close()  # 查询完毕后必须关闭连接# 使用with语句(上下文管理器)来省去显式的调用close方法关闭连接和游标print('****************使用 with 语句******************')with self.__get_connect() as cur:cur.execute(sql)val = list(cur.fetchall())   # 把游标执行后的结果转换成 listprint(val)return result_listdef exec_non_query(self, sql):cur = self.__get_connect()cur.execute(sql)self.conn.commit()self.conn.close()  # 完毕后必须关闭连接def test():ms = SqlServerOperate(db_host, db_port, db_user, db_pwd, db_name)sql_string = "select * from SpiderItem where ResourceType = 20"temp_result_list = ms.exec_query(sql_string)for i in temp_result_list:print(i)passif __name__ == "__main__":test()pass

 

改进版:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @Author      :
# @File        : mongodboperate.py
# @Software    : PyCharm
# @description :import pymssqldb_host = '192.168.0.5'
db_port = '9526'
db_user = 'test'
db_pwd = 'test'
db_name = 'TestDB'
tb_name = 'TestTB'class SqlServerOperate(object):def __init__(self, server, port, user, password, db_name, as_dict=True):self.server = serverself.port = portself.user = userself.password = passwordself.db_name = db_nameself.conn = self.get_connect(as_dict=as_dict)passdef __del__(self):self.conn.close()def get_connect(self, as_dict=True):conn = pymssql.connect(server=self.server,port=self.port,user=self.user,password=self.password,database=self.db_name,as_dict=as_dict,charset="utf8")return conndef exec_query(self, sql):cur = self.conn.cursor()cur.execute(sql)result_list = list(cur.fetchall())cur.close()# 使用with语句(上下文管理器)来省去显式的调用close方法关闭连接和游标# print('****************使用 with 语句******************')# with self.get_connect() as cur:#     cur.execute(sql)#     result_list = list(cur.fetchall())   # 把游标执行后的结果转换成 list#     # print(result_list)return result_listdef exec_non_query(self, sql, params=None):cur = self.conn.cursor()# cur.execute(sql, params=params)cur.execute(sql, params=params)self.conn.commit()cur.close()def exec_mutil_sql(self, sql, data_list):"""执行一次 sql, 批量插入多条数据:param sql: 参数用 %s 代替 : insert into table_name(col1, col2, col3) values(%s, %s, %s):param data_list:  list类型, list中每个元素都是元组:return:"""cur = self.conn.cursor()cur.executemany(sql, data_list)self.conn.commit()cur.close()def test():ms = SqlServerOperate(db_host, db_port, db_user, db_pwd, db_name)sql_string = "select * from SpiderItem where ResourceType = 20"temp_result_list = ms.exec_query(sql_string)for i in temp_result_list:print(i)passif __name__ == "__main__":test()pass

 

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

联想linux笔记本评测,联想(lenovo)G460AL-ITH Linux笔记本电脑接口评测-ZOL中关村在线...

模具和外观的“革新”让我们见识到不一样的联想G460,而在整机的接口扩展能力方面依旧主打实用性。机身左侧从左至右依次是安全锁孔、散热孔、RJ-45以太网接口、VGA视频输出接口、USB2.0接口、e-SATA接口(兼容USB2.0)、Express Card卡槽和HDMI高清视频输出接口。与前…

联合国召开会议讨论“杀手机器人”问题

来源:中国科学报 作者:赵熙熙来自29个国家的57位科学家日前呼吁联合抵制一所韩国大学,因为设立在该校的一个新的中心旨在利用人工智能强化国家安全。人工智能科学家表示,该大学正在开发自主武器,又称“杀手机器人”&a…

Effective Java~38. 用接口模拟可扩展的enum

使用枚举类型有一个很好的方法来实现这种效果。基本思想是利用枚举类型可以通过为 opcode 类型定义一个接口,并实现任意接口。 // Emulated extensible enum using an interface public interface Operation {double apply(double x, double y); } public enum Ba…

C语言的叙述大小写字母e1相同,第1、2章C语言基础练习题

第1章 C语言基础 第2章 顺序结构 练习题 学号: 姓名:单选:1. 当代电子计算机能够自动地处理指定的问题是因为( )。A. 计算机是电动的B. 有解决该问题的计算机程序 C. 事先存储了解决该问题的程序 D. 以上都不是2. C语言源程序的基本单位是( )…

咱也开始玩z-blog了

目前来讲,国内的个人网站基本上用wordPress于z-blog的比较多,wordPress用PHP开发的,z-blog用的是asp,鉴于PHP空间相对asp对一些,维护起来也比asp麻烦一点,众多个人站长中,相信看得懂一点asp的比…

Python 执行 shell命令 的几个方法小结

参考:https://blog.csdn.net/ronnyjiang/article/details/53333538 Python 执行 shell 命令 Python 可以执行 shell 命令的相关 模块 和 函数 有: os.systemos.spawnos.popen --- 废弃popen2.* --- 废弃commands.* --- 废弃&#x…

linux离线安装docker,centos离线安装docker

1.下载依赖包提取码: 3tus2. 先安装如下rpm依赖文件audit-libs-python-2.8.4-4.el7.x86_64.rpmcheckpolicy-2.5-8.el7.x86_64.rpmlibcgroup-0.41-20.el7.x86_64.rpmlibseccomp-2.3.1-3.el7.x86_64.rpmlibsemanage-python-2.5-14.el7.x86_64.rpmpolicycoreutils-2.5-29.el7.x86…

Effective Java~42. Lambda 优于匿名类

在 Java 8 中,添加了函数式接口, lambda 表达式和方法引用,以便更容易地创建函数对象。下面是一段代码片段,按照字符串长度顺序对列表进行排序,使用匿名类创建排序的比较方法 (强制排序顺序)&am…

Python 远程部署利器 Fabric2 模块

fabric 官网英文文档:http://www.fabfile.org/ 《Python自动化运维技术与最佳实践》 如何用 Fabric 实现无密码输入提示的远程自动部署: fabric实现远程操作和部署: 简介 Fabric 是一个 Python 的库,同时它也是一个命令行工具。…

【转】近期Coolite控件的技术点总结

1。Coolite下如何自定义控件样式表Code1<style type"text/css"> 2 .x-grid3-td-fullName .x-grid3-cell-inner {}{ 3 font-family:tahoma, verdana; 4 display:block; 5 font-weight:normal; 6 font-style…

Anaconda 完全入门指南

From&#xff1a;https://www.jianshu.com/p/eaee1fadc1e9 Anaconda官网&#xff1a;https://www.anaconda.com/ Anaconda 官网 文档&#xff1a;http://docs.anaconda.com/anaconda/user-guide Anaconda介绍、安装及使用教程&#xff1a;https://zhuanlan.zhihu.com/p/32925…

Effective Java~43. 方法引用优于Lambda

Java 提供了一种生成函数对象的方法&#xff0c;比 lambda 还要简洁&#xff0c;那就是&#xff1a;方法引用&#xff08; method references&#xff09;。下面是一段程序代码片段&#xff0c;它维护一个从任意键到整数值的映射。如果将该值解释为键的实例个数&#xff0c;则该…

linux资源使用统计指南,指南:工作量分析文档

指南&#xff1a;工作量分析文档工作量分析文档工作量分析文档用于在不同的性能测试中确定要使用的变量并定义变量值&#xff0c;利用这些性能测试可以模拟主角特征、最终用户业务功能(用例)、负载和容量。主题软件质量要从不同的维度来进行评估&#xff0c;其中包括可靠性、功…

linux 下修改日期和时间

我们一般使用“date -s”命令来修改系统时间。比如将系统时间设定成2009年11月13日的命令如下。 #date -s 11/13/09 将系统时间设定成下午1点12分0秒的命令如下。#date -s 13:12:00 ---- 注意&#xff0c;这里说的是系统时间&#xff0c;是linux由操作系统维护的。 ---- 在系统…

Linux 输入输出重定向 2>/dev/null和>/dev/null 2>1和2>1>/dev/nul

From&#xff1a;https://www.cnblogs.com/520playboy/p/6275022.html 2>/dev/null 和 >/dev/null 2>&1 和 2>&1>/dev/null &#xff1a;https://blog.csdn.net/zhongqi2513/article/details/78613768 连接远程机器执行 shell 命令的一个使用示例&…

c语言向指定文件写入程序,C语言同时向不同的文件写入不同的数据

C语言同时向不同的文件写入不同的数据这个我写了好久才写出来的&#xff0c;之前不知道是什么原因总是不能同时一起写&#xff0c;而且写完一个程序就死了&#xff0c;后来在网上查到一篇文章 http://blog.csdn.net/feixiaoxing/article/details/7237649通过修改变成以下代码。…

Effective Java~44. 坚持使用标准的函数接口

在 java.util.Function 中有 43 个接口。不能指望全部记住它们&#xff0c;但是如果记住了六个基本接口&#xff0c;就可以在需要它们时派生出其余的接口。基本接口操作于对象引用类型。 Operator 接口表示方法的结果和参数类型相同。 Predicate 接口表示其方法接受一个参数并…

SQL Server 执行 字符串

EXEC (字符串或变量) 例&#xff1a; EXEC (SELECT * FROM Orders) 或 DECLARE sql nvarchar(50)SET sqlSELECT * FROM OrdersEXEC (sql)转载于:https://www.cnblogs.com/duwx/archive/2009/11/19/1606152.html

Python爬取大量数据时防止被封IP

From&#xff1a;http://blog.51cto.com/7200087/2070320 基于scrapy框架的爬虫代理IP设置&#xff1a;https://www.jianshu.com/p/074c36a7948c Scrapy: 针对特定响应状态码&#xff0c;使用代理重新请求&#xff1a;http://www.cnblogs.com/my8100/p/scrapy_middleware_aut…

c语言错误c4430,声明*C某类::Getdocument();(已声明,不兼容)

创建了一个CRightWindow类&#xff0c;基类为CScrollView&#xff0c;在.h文件中如下&#xff1a;public:CMy2015Doc* GetDocument(); // error C2143: 语法错误 : 缺少“;”(在“*”的前面)// error C4430: 缺少类型说明符 – 假定为 int。注意: C 不支持默认 int在…