学习Python⑴:Phthon操作Ms SQL Server数据库

  网络上说,目前最火的开发语言是Python,它的功能强大并且应用范围很广,刚好最近要做一个小项目,就是通过一个小程序来管理交换机,于是在网络找资料来学习。

  现在网络发达,学一门编程语言太容易了,遇到问题找资料容易,不像以前资料少,为了找一个API的使用说明都费劲。

  学Python麻烦之一是搭建编程环境,下载和安装相应的插件,好在有网络,终会解决。

  1、Python版本众多,我下载了3.8、3.9,安装后不太顺利,换成3.7就好了,稳定。

  2、开发工具是PyCharm,我们使用的是代理上网,折腾插件很费劲。

  3、Pymssql的安装在pycharm中安装不顺利,反复折腾,后来使用在dos下安装,即pip install pymssql-2.1.5-cp37-cp37m-win_amd64.whl。

  4、重启了几次的pycharm才安装好,可惜没代码提示,但是可以编程了。

  5、乱码,最后在获取字段(字符串)的后面加.encode('latin1').decode('gbk'))就可以正常显示了。

  6、有用的网址:

    ● https://docs.python.org/zh-cn/3.7/library/  (参考文档)

    ● https://pypi.org/project/paramiko/#files    (paramiko下载)

    ● https://riverbankcomputing.com/software/pyqt/download   (pyQT的下载)

    ● https://www.python.org/downloads/      (Python管网下载)

  建立连接很容易,对数据记录的操作是通过游标进行的。

  下面是成功的代码:2021年1月8日

import pymssql       # 对MS SQL Server的操作
import sys

print(sys.getdefaultencoding())
# 定义数据库的连接
DBSeverIP="1.2.3.4"
DBUser="user"
DBPassword="pass"
DBDatabase="minedb"
DBCharset="utf-8"
DBConn=pymssql.connect(DBSeverIP,DBUser,DBPassword,DBDatabase,DBCharset)
#if DBConn:
#    print("数据库连接成功!")
# 定义访问游标
DBCursor=DBConn.cursor()

# 增加数据记录
StrInsertSQL="insert into HaoRTable values(%s,%s,%s,%s,%s,%s)"
DBCursor.execute(StrInsertSQL,("777","777","23","24","25","26"))
DBConn.commit()

# 删除数据记录
StrInsertSQL="delete from HaoRTable where c01=%s"
DBCursor.execute(StrInsertSQL,("44"))
DBConn.commit()

# 修改数据记录
StrUpdateSQL="update HaoRTable set c02=%s where c01=%s"
DBCursor.execute(StrUpdateSQL,("新的表","33"))
DBConn.commit()

# 查询返回的数据
StrQuerySQL="select * from HaoRTable"
DBQueryResult=DBCursor.execute(StrQuerySQL)

# 读取查询结果(fetchall,获取全部的数据记录)
DBTable=DBCursor.fetchall()
for i in range(len(DBTable)):
#    StrUserName=str(DBTable[i][0]).encode('latin1').decode('gbk')
#    print(StrUserName)
#    print("第{}行".format(i),DBTable[i][1].encode('latin1').decode('gbk'),DBTable[i][2].encode('latin1').decode('gbk'),DBTable[i][3].encode('latin1').decode('gbk'))
    print("第{}行".format(i),DBTable[i][0],DBTable[i][1].encode('latin1').decode('gbk'),DBTable[i][2].encode('latin1').decode('gbk'))

# 读取查询结果(fetchall,获取一条数据记录)
DBQueryResult=DBCursor.execute(StrQuerySQL)
DBTableRow=DBCursor.fetchone()
while DBTableRow:
    #print(DBCursor.fetchone()[0].encode('latin1').decode('gbk'))
#    print(DBTableRow[1].encode('latin1').decode('gbk'),DBTableRow[2].encode('latin1').decode('gbk'),DBTableRow[3].encode('latin1').decode('gbk'))
    print(DBTableRow[0].encode('latin1').decode('gbk'),DBTableRow[1].encode('latin1').decode('gbk'))
    DBTableRow=DBCursor.fetchone()

# 读取查询结果(使用字段名来查询)
DBCursor1=DBConn.cursor(as_dict=True)
DBQueryResult=DBCursor1.execute(StrQuerySQL)
for Row in DBCursor1:
    print(Row["c01"],Row["c02"])

DBCursor.close()   #关闭游标
DBConn.close()     #关闭数据库连接

  1、如果在连接属性里没有设置autocommit=true,那么在对数据进行增、删、改的操作后,作为事务需要提交:DBConn.commit(),可以多条操作指令后一起提交,也可以回滚事务:DBConn.rollback();

  2、注意游标的使用,开始的时候在数据表的第一条记录,一般操作后,游标已经移到数据记录表的末尾,如果再需要读取数据,要么移动游标,要么关闭游标后重新打开。

  3、在使用字段名来查询的时候,需要在定义游标的时候加上:DBCursor1=DBConn.cursor(as_dict=True),即as_dict=True,默认是False。

  根据实际开发需要,定制查询:2021年1月11日

import pymssql       # 引用以便对MS SQL Server的操作

# 定义连接数据库的参数
DBSeverIP="1.2.3.4"
DBUser="user"
DBPassword="pass"
DBDatabase="testdb"
DBCharset="utf-8"

# 根据给定的SQL来查询数据
def QueryBySQLDescribe(StrQueryDescribe):
    global DBSeverIP,DBUser,DBPassword,DBDatabase,DBCharset                           # 声明全局变量
    DBConn = pymssql.connect(DBSeverIP, DBUser, DBPassword, DBDatabase, DBCharset)    # 定义数据库连接
    DBCursor = DBConn.cursor(as_dict=True)                                            # 定义游标
    DBCursor.execute(StrQueryDescribe)                                                # 执行
    DBQueryResult=[]                                                                  # 定义一个空列表
    DBTable = DBCursor.fetchall()                                                     # 从游标中获取全部的记录
    for Row in DBTable:                                                               # 依次将行数据提取到列表中
        DBQueryResult.append(Row)
    DBCursor.close()                                                                  # 关闭游标
    DBConn.close()                                                                    # 关闭连接
    return DBQueryResult                                                              # 返回列表

# 删除数据记录
def UpdateOrDelBySQLDescribe(StrDescribe):
    global DBSeverIP,DBUser,DBPassword,DBDatabase,DBCharset,DBCursor
    DBConn = pymssql.connect(DBSeverIP, DBUser, DBPassword, DBDatabase, DBCharset)
    DBCursor = DBConn.cursor(as_dict=True)
    DBQueryResult=DBCursor.execute(StrDescribe)
    DBConn.commit()

def Test1():                                          # 根据给定的SQL查询语句返回记录
    if __name__=="__main__":
        StrTableName='PSPUserSole'
        StrCondition="c04='操作员'"
#        print( """select * from {} where {}""".format(StrTableName,StrCondition) )
        TmpResult=QueryBySQLDescribe( "select * from {} where {}".format(StrTableName,StrCondition) )
        for Row in TmpResult:
            print('', end='\n')
            for Value in Row.values():
                print(Value,end=' ')

def Test2():                                          # 根据给定的SQL语句删除记录
    if __name__ == "__main__":
        StrTableName = 'HaoRTable'
        StrCondition = "c01='777'"
        UpdateOrDelBySQLDescribe(" delete from {} where {}".format(StrTableName, StrCondition))

def Test3():                                          # 根据给定的SQL语句修改记录
    if __name__ == "__main__":
        StrTableName = 'HaoRTable'
        StrSet="c02='2021.1.11的新表'"
        StrCondition = "c01='11'"
        UpdateOrDelBySQLDescribe(" update {} set {} where {}".format(StrTableName,StrSet,StrCondition))

#下面是测试
Test1()

  上面的代码没有出错处理,操作方式就是每次操作都会打开数据库连接、游标,通过游标来进行数据操作,操作完成后关闭游标和数据库,节省资源。

  但这样也有不好的地方,修改数据记录会比较麻烦。

  做一个窗口现实数据:2021年1月11日

import tkinter
from tkinter import ttk  # 导入内部包
from BasePackage.DBOperation import QueryBySQLDescribe                            # 引入查询

WinUserRights = tkinter.Tk()                                                      # 创建一个窗口
WinUserRights.wm_title("计算机型号的参数设置")
Cols=('计算机项目','项目','参数')
TVDataTable = ttk.Treeview(WinUserRights,columns=Cols,show='headings')            # 创建一个TreeView,用于表格显示数据
TVDataTable["columns"] = ("计算机型号", "项目", "参数")                             # 设置3列
TVDataTable.column("计算机型号", width=180)                                        # 设置列宽
TVDataTable.column("项目", width=70)
TVDataTable.column("参数", width=260)

TVDataTable.heading("计算机型号", text="计算机型号")                                # 显示表头
TVDataTable.heading("项目", text="项目")
TVDataTable.heading("参数", text="参数")

# 读取数据
StrTableName = 'jsjxh'
TmpResult = QueryBySQLDescribe("select * from {} ".format(StrTableName))
StrInsert=[]
for Row in TmpResult:
    for Value in Row.values():
        StrInsert.append(Value.encode('latin1').decode('gbk'))
    TVDataTable.insert("", 0, text="", values=StrInsert)          # 插入数据,
    StrInsert.clear()

TVDataTable.pack()
WinUserRights.mainloop()

  弹出窗口如下:

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值