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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 为了提高工作效率及便利性,拟自主开发一款一键自动化运维小工具;其中主要一项功能用于与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中指定数据库的初始化操作;

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
16天前
|
SQL 数据库
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面、断电或者文件系统问题导致页面丢失。
82 12
数据库数据恢复—SQL Server数据库报错“错误823”的数据恢复案例
|
11天前
|
SQL 关系型数据库 MySQL
创建包含MySQL和SQLServer数据库所有字段类型的表的方法
创建一个既包含MySQL又包含SQL Server所有字段类型的表是一个复杂的任务,需要仔细地比较和转换数据类型。通过上述方法,可以在两个数据库系统之间建立起相互兼容的数据结构,为数据迁移和同步提供便利。这一过程不仅要考虑数据类型的直接对应,还要注意特定数据类型在不同系统中的表现差异,确保数据的一致性和完整性。
22 4
|
8天前
|
关系型数据库 MySQL 数据库
6-2|测试连接数据库的命令
6-2|测试连接数据库的命令
|
9天前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
9天前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
9天前
|
SQL 关系型数据库 MySQL
php学习笔记-连接操作mysq数据库(基础)-day08
本文介绍了PHP中连接操作MySQL数据库的常用函数,包括连接服务器、设置字符集、关闭连接、选择数据库、结果集释放、获取影响行数以及遍历结果集等操作。通过书籍查询的实例演示了如何使用这些函数进行数据库操作,并提供了一个PHP操纵MySQL数据库的模板。
php学习笔记-连接操作mysq数据库(基础)-day08
|
11天前
|
SQL JavaScript 关系型数据库
Node服务连接Mysql数据库
本文介绍了如何在Node服务中连接MySQL数据库,并实现心跳包连接机制。
25 0
Node服务连接Mysql数据库
|
25天前
|
SQL 存储 数据管理
SQL Server数据库
SQL Server数据库
41 11
|
2月前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
119 3
|
2月前
|
SQL 关系型数据库 MySQL
SQL数据库和 SQLserver数据库
【8月更文挑战第19天】SQL数据库和 SQLserver数据库
47 2
下一篇
无影云桌面