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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 为了提高工作效率及便利性,拟自主开发一款一键自动化运维小工具;其中主要一项功能用于与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中指定数据库的初始化操作;

相关文章
|
2月前
|
运维 监控 关系型数据库
AI 时代的 MySQL 数据库运维解决方案
本文探讨了大模型与MySQL数据库运维结合所带来的变革,介绍了构建结构化运维知识库、选择合适的大模型、设计Prompt调用策略、开发MCP Server以及建立监控优化闭环等关键步骤。通过将自然语言处理能力与数据库运维相结合,实现了故障智能诊断、SQL自动优化等功能,显著提升了MySQL运维效率和准确性。
296 18
|
4月前
|
关系型数据库 数据库 RDS
【瑶池数据库训练营及解决方案本周精选(探索PolarDB,参与RDS迁移、连接训练营)】(5.30-6.8)
本周精选聚焦数据库迁移训练营、快速连接云数据库RDS训练营及智能多模态搜索解决方案。为用户提供模拟教程与实战演练,学习RDS MySQL实例连接与数据管理技能,助力企业智能化发展。每周解锁数据库实战新场景,抓紧时间,精彩不容错过!
|
5月前
|
SQL 数据库 数据安全/隐私保护
数据库数据恢复——sql server数据库被加密的数据恢复案例
SQL server数据库数据故障: SQL server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。 数据库备份被加密,文件名字被篡改。
|
3月前
|
运维 监控 关系型数据库
AI 时代的 MySQL 数据库运维解决方案
本方案将大模型与MySQL运维深度融合,构建智能诊断、SQL优化与知识更新的自动化系统。通过知识库建设、大模型调用策略、MCP Server开发及监控闭环设计,全面提升数据库运维效率与准确性,实现从人工经验到智能决策的跃迁。
406 26
|
4月前
|
Cloud Native 关系型数据库 分布式数据库
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
阿里云瑶池数据库与沃趣科技将继续深化合作,共同推动国产数据库技术的持续创新与广泛应用,为行业生态的繁荣注入更强劲的技术动力。
阿里云PolarDB与沃趣科技携手打造一体化数据库解决方案,助推国产数据库生态发展
|
2月前
|
SQL 安全 关系型数据库
数据库安全管理新范式:DBKEEPER一体化数据库权限管控堡垒机解决方案
在数字化时代,数据库安全至关重要。DBKEEPER提供一站式数据库安全访问与权限管控解决方案,支持多种数据库,具备精细化权限管理、数据脱敏、高危操作拦截、全面审计等功能,助力企业实现智能、安全的数据治理,满足金融、医疗、互联网等行业合规需求。选择DBKEEPER,让数据库安全管理更高效!
数据库安全管理新范式:DBKEEPER一体化数据库权限管控堡垒机解决方案
|
2月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
216 0
|
4月前
|
存储 SQL 数据库连接
C#程序调用Sql Server存储过程异常处理:调用存储过程后不返回、不抛异常的解决方案
本文分析了C#程序操作Sql Server数据库时偶发的不返回、不抛异常问题,并提出了解决思路。首先解析了一个执行存储过程的函数`ExecuteProcedure`,其功能是调用存储过程并返回影响行数。针对代码执行被阻塞但无异常的情况,文章总结了可能原因,如死锁、无限循环或网络问题等。随后提供了多种解决方案:1) 增加日志定位问题;2) 使用异步操作提升响应性;3) 设置超时机制避免阻塞;4) 利用线程池分离主线程;5) 通过信号量同步线程;6) 监控数据库连接状态确保可用性。这些方法可有效应对数据库操作中的潜在问题,保障程序稳定性。
336 11
|
5月前
|
负载均衡 算法 关系型数据库
大数据新视界--大数据大厂之MySQL数据库课程设计:MySQL集群架构负载均衡故障排除与解决方案
本文深入探讨 MySQL 集群架构负载均衡的常见故障及排除方法。涵盖请求分配不均、节点无法响应、负载均衡器故障等现象,介绍多种负载均衡算法及故障排除步骤,包括检查负载均衡器状态、调整算法、诊断修复节点故障等。还阐述了预防措施与确保系统稳定性的方法,如定期监控维护、备份恢复策略、团队协作与知识管理等。为确保 MySQL 数据库系统高可用性提供全面指导。
|
6月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
135 16

热门文章

最新文章