开发者社区> 数量烦恼> 正文

Pyhton连接SQL Server数据库解决方案

简介: 为了提高工作效率及便利性,拟自主开发一款一键自动化运维小工具;其中主要一项功能用于与SQL Server数据库进行交互,程序可以根据数据库中数据情况,调用对应函数逻辑,做出相应的操作,以达到自动化运维的效果;
+关注继续查看

为了提高工作效率及便利性,拟自主开发一款一键自动化运维小工具;其中主要一项功能用于与SQL Server数据库进行交互,程序可以根据数据库中数据情况,调用对应函数逻辑,做出相应的操作,以达到自动化运维的效果;
关于Python连接SQL Server的方法,调研了一些Python模块,最终选取了pyodbc模块:

pymysql模块
最开始计划选取pymysql模块,安装比较顺利,但连接始终失败,提示异常“pymysql.err.OperationError:[Errorno10054]”;经过排查,连接所需要的信息均正确,但经过确认后发现,pymysql模块仅适用于连接mysql数据库,而无法连接sqlserver数据库,之前也由于调研时意外看错,实际计划选用的Python拓展包实际应为“pymssql”。

pymssql模块
pymssql模块在安装时就问题频发,不论是在线直接安装,还是在Python官网下载安装文件离线安装均未成功;

最初安装过程中提示“_mssql.c(266) : fatal error C1083: Cannot open include file: 'sqlfront.h': No such file or directory”,经过排查,发现是由于缺少'sqlfront.h'等头文件造成,需要下载对应版本的“freeTDS”,以获得对应的头文件,但将“freeTDS”包中的头文件及dll文件放置在Python安装对应的目录下后,再次安装pymssql,依然提示较多异常:

经过排查,是由于Python的底层语言是C,而系统中缺少相关环境,研究较长时间无有效解决方案,遂放弃使用pymssql模块;之前选择的版本是pymssql_2.1.3_cp27,在前几天8月28日又最新发布了2.1.4版本,待校验是否问题依然存在。

pyodbc模块
pyodbc模块可以直接在线安装,安装过程很顺利:

使用import验证pyodbc安装成功:

pyodbc连接SQLServer
下面开始使用pyodbc尝试连接已经建立完成的模拟待访问的sqlserver数据库;pyodbc连接sqlserver有两种形式:
sqlconn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=database;UID=name;PWD=pass')
或者
sqlconn = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',DATABASE='database',UID='name',PWD='pass')
两种形式可以根据个人习惯进行选择,我个人比较倾向于第二种,在编译器中会高亮关键字,从而便于维护,下面的代码中大家会看到;

上述可以看到对于connect()函数连接sqlserver时需要传入5个参数值,分别为DRIVER、SERVER、DATABASE、UID及PWD,参数值的准确很关键,因为任何一个出错也无法正常的连接到sqlserver,而尤其对sqlserver的配置不太熟悉更是比较分不清到底每个参数实际应赋予的值是什么?下面来说明一下:

DRIVER:一般为固定的{SQL Server}即可,当然换成对应的Native Client的版本信息也是可以连接成功的,例如{SQL Server Native Client 10.0};

SERVER:填写在SQL Server登录时的服务器名称即可,可以是SQL Server配置管理器中-SQL Server网络配置-实例的协议-TCP/IP中任意有效的可访问信息;

DATABASE:
这个就很好理解了,上述服务器中任意数据库的名称即可;

UID:数据库登录名,但使用的登录名一定要允许登录,且允许连接到数据库引擎:

PWD:登录密码;
使用准确的信息进行尝试连接,验证连接正常:

pyodbc模块的基本使用
pyodbc模块在使用connect()成功连接sqlserver数据库后,会返回一个connect对象,使用该对象我们可以对数据库进行一些列的操作,如果之前已经了解过Python其他连接数据库模块,例如cx_Oracle、pymysql等,pyodbc模块对数据库操作的方法与它们是基本一致的;

cursor()
如果需要对已连接的数据库进行数据操作,那么必须得先从connect对象中获取游标,然后再使用游标进行sql语句的操作;
游标的获取直接使用connect对象调用cursor()函数即可:

!usr/python/bin

-- coding:utf-8 --

import pyodbc

sqlconn = pyodbc.connect(DRIVER='{SQL Server}',

                     SERVER='127.0.0.1,1433',
                     DATABASE='OIW11111',
                     UID='sa',
                     PWD='123')

cursor = sqlconn.cursor()
关于游标的概念:可以将游标(Cursor)形象地看做成一个变动的光标。它实际上是一个指针,它在一段数据库存放数据查询结果集或数据操作结果集的内存中,这个指针可以指向结果集中的任何一条记录 。这样就可以得到它所指向的数据了,但初始时它指向首记录。

cursor.execute(sqlStatement)
获取游标完成后,我们可以使用游标的execute()方法来执行我们需要的sql语句,execute()内传入需要执行语句的字符串形式,例如:
cursor.execute("select * from OIW11111..ashare_ordwth")
或者
sqlStatement = "select * from OIW11111..ashare_ordwth"
cursor.execute(sqlStatement)

cursor.fetchone()/fetchall()/fetchmany([size])
使用execute()执行完sql语句后,尤其是select语句会返回一些结果行,我们可以使用fetch系列的方法去对执行结果进行检索获取;
fetchone():
仅获取一条结果行,将以元组的形式返回,若查询结果为空,则返回None;

fetchall():
获取全部结果行,将以列表的形式返回,每条结果行以元组形式作为列表元素,若查询结果为空,则返回空列表,即[ ];

fetchmany([size]):
获取指定size数量的结果行,将以列表的形式返回,每条结果行以元组形式作为列表元素,若查询结果为空,则返回空列表,即[ ];

connect.commit()

提交当前事务,当使用游标对已连接的数据库进行修改,例如insert操作时,需要使用connect对象执行commit(),与sql中的commit起到相同的作用;
但如果修改完成不执行commit(),则已进行的变更将不会更新到连接的数据库中。

cursor.close()

关闭游标,虽然当Python程序执行完成后,会释放资源,小程序中如果不去关闭也不会有什么影响,但保证每次手动释放资源,是良好的习惯;

connect.close()

断开连接,与cursor.close()一样,但保证每次手动释放资源,是良好的习惯;

其他使用
关于pyodbc模块的实际应用远远不止上述所提及的,还有很多方法,后续也需要继续研究学习,比如执行多条sql语句的方法cursor.executemany(),以及游标移动的方法;
网上所提及的其他操作数据的拓展模块会有scroll()方法用于移动游标定位到指定的位置,对于文件对象的操作也可以使用seek()方法移动光标定位,但对于pyodbc模块暂时还未发现可用的游标移动方法,所以现在能想到的代替移动游标的方法只能使用sql语句条件的过滤减少数据量,对于查询结果使用fetchall()全部获取后再进行遍历或者定位。

完成代码
需求:遍历SqlServer中指定数据库表,如果表中存在非当日数据,则进行清空,否则不进行任何操作,以完成对SqlServer中指定数据库的初始化操作;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
my.httpReqeust安卓出现Alipay-Mobile-Proxy-Server(502_BAD_GATEWAY)的解决方案
报错原因: 出现Alipay-Mobile-Proxy-Server(502_BAD_GATEWAY)是因为目前 Android设备有安全代理,不允许请求非公网地址,如局域网 解决方案: 请使用公网请求地址。
552 0
SAP Server Side JavaScript解决方案
SAP Server Side JavaScript解决方案
31 0
电商行业解决方案及数据库搬站最佳实践
该方案适用于新零售领域的电商行业,包括电商公司初创,满足快速搭建平台;以及中型企业应对发展阶段,满足业务快速占领市场。
1260 0
【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
原文:【终极解决方案】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
2431 0
OAF_JDBC系列2 - 通过JDBC连接SQLSERVER数据库DriverManager.getConnection
d          try{          Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");          String connectionSQLServer = "jdbc:sqlserver://gavinmysql.
780 0
MSSQL SERVER 2008 R2 无法连接到数据库,用户sa登录失败,错误:18456
原因:勾选了强制实施密码策略,但是设置的密码很简单依然可以,比如:123456 这是为什么?原来,这个功能要用到NetValidatePasswordPolicy() API这个函数。 (该功能只有在安全要求较高的时候才用) 解决方法:在运行里输入 gpedit.msc 打开 “本地策略”编辑器依次 展开“计算机配置” “Windows设置”-“安全设置”-“帐户策略”-“密码策略",“密码必须符合复杂性要求”应该是禁用状态, 改为已启用,之后再创建SQL Server用户即可。
1519 0
mysql太多连接问题及解决方案
不管是JavaEE开发还是其他,只要是Linux系统下安装的mysql,通常默认最大连接为270。 如果你的客户端连接超过这个数,通常要么是配置文件修改,或者是命令行修改,配置文件修改和命令行修改的区别是,配置文件,既然是文件通常持久化到硬盘,保存最长,如果是命令行的话,仅仅只能保持在Mysql运行状态,如果一旦MySQL因为某种原因宕机或者关闭了,命令行的方式就失效了。
1065 0
sql server 索引阐述系列六 碎片查看与解决方案
原文:sql server 索引阐述系列六 碎片查看与解决方案 一 . dm_db_index_physical_stats 重要字段说明   1.1 内部碎片:是avg_page_space_used_in_percent字段。
772 0
无法打开到SQL Server的连接 (Microsoft SQL Server, 错误:53) .
标题: 连接到服务器 ------------------------------ 无法连接到 MSSQLSERVER。 ------------------------------ 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。
2580 0
+关注
2
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载