问题:续接上一篇。说干咱就干呀,勤勤恳恳写程序呀!
目标:此篇开始进入正题了。为实现我们整个项目功能而开始实现各个子模块功能。首先实现第一篇列出的分步功能模块的第五步:
5、python连接SQL Server,读写数据
解决方案:查找python与SQL Server交互的相关资料,编写涉及的功能函数,并将其封装在一个通用的SQLHelper类中。这样方便使用和维护。
具体实践:
1、新建了一个类: SQLHelper.py。首行添加代码:import pymssql,引用 pymssql包。
2、初始化类时,初始化数据库服务名称,登录用户,登录密码,数据库名称。
def __init__(self, host, user, pwd, db_name):
self.host = host
self.user = user
self.pwd = pwd
self.db_name = db_name
3、获取连接数据库的连接信息,返回
def get_connect(self):
"""
得到连接信息
返回: conn.cursor()
"""
if not self.db_name:
Error_Message = "没有设置数据库信息"
raise (NameError, Error_Message)
try:
self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db_name,
charset="utf8")
cur = self.conn.cursor()
except Exception as e:
print(e)
Error_Message = "连接数据库失败"
if not cur:
Error_Message = "连接数据库失败"
raise (NameError, Error_Message)
else:
return cur
4、查询函数,无查询执行函数
def exec_query(self, sql):
"""
执行查询语句
返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
调用示例:
ms = MSSQLHelper(host="localhost/MSSQL2008",user="sa",pwd="xxx",db_name="xxx")
list_data = ms.exec_query("select ID, UserName from dbo.Users")
for (ID, UserName) in list_data:
print str(ID),UserName
"""
cur = self.get_connect()
cur.execute(sql)
list_data = cur.fetchall()
# 查询完毕后必须关闭连接
self.conn.close()
return list_data
def exec_non_query(self, sql):
"""
执行非查询语句
调用示例:
ms = MSSQLHelper(host="localhost/MSSQL2008",user="sa",pwd="xxx",db_name="xxx")
ms.exec_query("insert into Users values('3','风清扬')")
"""
try:
cur = self.get_connect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
return True
except Exception as e:
print(e)
Error_Message = e
return False