【参考Pyodbc使用: https://code.google.com/archive/p/pypyodbc/wikis/A_HelloWorld_sample_to_access_mssql_with_python.wiki】
【windows版本的 python在刚刚对接pyodbc的时候可能会有一些问题,请参考另一篇文章:https://blog.csdn.net/qq_36622490/article/details/104038680 】
使用Pyodbc的优点:
- 可以使用sql语句,提高效率
- 简便,自由,可以随意封装组合
使用Pyodbc的缺点:
- 网上中文资料不多,需要自己去查找翻译
- 对开发人员要求稍高,需要考虑东西多
为了省钱,公司在Azure服务器上把oracle换了sqlserver数据库,为了封装pyodbc数据库连接,自己摸索了几天在google和百度上一直查找,期间也通过app,current_app,g这些上下文对象和应用变量来存储,但是效果都不太满意。老大给我定的目标是,查询都使用一个连接,不同的cursor游标就行了 ,防止反复查询连接数据库影响性能。最后无奈自己尝试封装了一个,贴上项目目录。
import pyodbc
class MyDb:
"""以面向对象方式封装数据库和数据库连接"""
server = '服务器地址' # 端口在init函数中直接1433初始化了,可以自己适当改变
database = '数据库名字'
username = '登录用户名'
password = '登录密码'
driver = '{驱动名字}'
#驱动名字 我再windows上用的是17版本的所以我的是‘ODBC Driver 17 for SQL Server’
def __init__(self):
# 获取数据库连接和游标
self.conn = pyodbc.connect('SERVER=' + self.server + ';PORT=1433;DATABASE=' + self.database + ';UID=' + self.username + ';PWD=' + self.password + ';DRIVER=' + self.driver)
self.db = self.conn
self.cur = self.db.cursor()
def select_db(self, sql_code):
# 查询sql数据
self.cur.execute(sql_code)
return self.cur.fetchall()
def __del__(self):
# 对象销毁,断开连接
self.cur.close()
self.db.close()
我个人理解的是,在不同的api蓝图初始化的时候就对数据库连接进行初始化,然后就是用这个初始化过后的连接进行创建游标和数据查询,而数据库和游标关闭直接在这个封装的MyDb类中操作,这个蓝图对象销毁的时候就自动断开数据库和游标的连接。【不明白python对象的销毁的可以去查一下python的对象销毁机制】
在蓝图对象中如下,将数据库的连接直接存储到蓝图对象里面,这样也不会影响其他蓝图数据库连接和游标。
测试之后可以在Console上看到,输出的连接对象的地址都是一样的,上面哪些不一样是因为在期间我重启了下项目,所以同一个蓝图对象的时候,连接对象就是同一个,游标不能用同一个。【一个连接一次只能有一个游标的查询处于活跃状态】
下面是我的项目目录,特别简单的一个Flask框架,Flask的简介真的不是盖的,随便自己扩展,但是就是比较麻烦,需要自己封装大量的工具和功能,而且好多工具都不是现存的,需要查阅大量资料。有些欠缺的还有就是Python的Web运行速度比较慢,在windowsServer上运行的时候dos窗口上有时候会莫名其妙需要请求两次才可以收到数据。
接下来我会跟着这个项目,把Flask再温习一下,遇到问题之后再记录,共学习。