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

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 为了提高工作效率及便利性,拟自主开发一款一键自动化运维小工具;其中主要一项功能用于与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
相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
1天前
|
SQL Oracle 关系型数据库
sql语句创建数据库
在创建数据库之前,请确保你有足够的权限,并且已经考虑了数据库的安全性和性能需求。此外,不同的DBMS可能有特定的最佳实践和配置要求,因此建议查阅相关DBMS的官方文档以获取更详细和准确的信息。
|
1天前
|
SQL 缓存 数据库
sql 数据库优化
SQL数据库优化是一个复杂且关键的过程,涉及多个层面的技术和策略。以下是一些主要的优化建议: 查询语句优化: 避免全表扫描:在查询时,尽量使用索引来减少全表扫描,提高查询速度。 使用合适的子查询方式:子查询可能降低查询效率,但可以通过优化子查询的结构或使用连接(JOIN)替代子查询来提高性能。 简化查询语句:避免不必要的复杂查询,尽量使SQL语句简单明了。 使用EXISTS替代IN:在查询数据是否存在时,使用EXISTS通常比IN更快。 索引优化: 建立合适的索引:对于经常查询的列,如主键和外键,应创建相应的索引。同时,考虑使用覆盖索引来进一步提高性能。 避免过多的索引:虽然索引可以提高查询
|
8天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
9天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
9天前
|
JavaScript 关系型数据库 MySQL
❤Nodejs 第二章(Node连接本地数据库)
【4月更文挑战第2天】本文介绍了如何使用Node.js连接本地MySQL数据库。首先,提到了在MySQL官网下载安装数据库和使用Navicat for MySQL进行数据库管理。接着,通过`yarn add mysql`在项目中安装数据库依赖。然后,创建`app.js`文件,设置数据库连接参数,并建立连接进行查询操作。遇到导入模块的错误后,修改导入方式为CommonJS语法。
26 1
|
9天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
34 3
|
12天前
|
SQL 监控 关系型数据库
PG数据库释放闲置连接
PG数据库释放闲置连接
19 0
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例