在企業(yè)應(yīng)用開發(fā)中,經(jīng)常用到應(yīng)用程序訪問數(shù)據(jù)庫的開發(fā)模式,中小企業(yè)使用的數(shù)據(jù)庫中,以ms SQL Server居多。本文就以一個簡單的實(shí)例模型,簡單介紹一下python訪問ms sql sever數(shù)據(jù)庫的方法。
一、數(shù)據(jù)庫模型
本文中以下面的本地SQL Server數(shù)據(jù)庫為例進(jìn)行數(shù)據(jù)庫連接,數(shù)據(jù)表的查詢、增加、刪除、修改等操作。
主機(jī)地址:localhost(我的是本地服務(wù)器,使用localhost,在linx系統(tǒng)下測試時使用了遠(yuǎn)程的數(shù)據(jù)庫)
端口:默認(rèn)的1433
用戶名:sa
密碼:sa1234
數(shù)據(jù)庫名:myTestDb
數(shù)據(jù)庫myTestDb中預(yù)設(shè)一個表tab_product,表結(jié)構(gòu)如下:
Tab_product中已經(jīng)包括以下5行試驗(yàn)數(shù)據(jù):
二、pymssql庫及簡介
python訪問ms SQL Server 需要用到Pymssql庫,如沒有安裝,可以在命令行模式下輸入:
pip install pymssql
進(jìn)行下載安裝。
1、使用pymssql創(chuàng)建數(shù)據(jù)連接,需要將SQL Server服務(wù)器的參數(shù)傳給pymssql的connect方法,成功后建立連接。如下:
2、查詢數(shù)據(jù)方法:查詢數(shù)據(jù)使用標(biāo)準(zhǔn)的SQL查詢語句為作cursor對象execute方法的參數(shù),注意返回值results為一個數(shù)據(jù)集合,result為集合中的每一行,res為每一行中的相關(guān)字段。
3、數(shù)據(jù)操作:包括數(shù)據(jù)的增加、刪除、修改等。也是使用標(biāo)準(zhǔn)的SQL語句。如下為增加一行數(shù)據(jù):
注意所有操作完成后,需要使用conn.close()關(guān)閉和數(shù)據(jù)庫的連接。
三、實(shí)例演示
演示界面使用pyqt5開發(fā)。界面如下:
界面上部為數(shù)據(jù)連接的主要參數(shù),包括主機(jī)名,端口,數(shù)據(jù)庫名稱,用戶名和密碼等參數(shù),設(shè)置完成后點(diǎn)擊連接,連接成功后。才能進(jìn)行下面的其它操作。
界面中部為兩個文本框,用于輸入SQL數(shù)據(jù)查詢命令和SQL操作執(zhí)行命令(如刪除、新增、更新等)
界面下部為一個多行文本框,用于顯示、記錄查詢結(jié)果或記錄。
三、完整代碼
實(shí)現(xiàn)的完整代碼如下:代碼中的注釋比較清楚,不再贅述。
需要說明的一點(diǎn)就是關(guān)于python和SQL Server 使用的字符集不同,處理不當(dāng)會出現(xiàn)中文亂碼的情況,這個在需要注意和進(jìn)行轉(zhuǎn)換的代碼中注釋的非常清楚。
#encoding:utf8
'''
code writing:hnkkfan
本代碼用于演示pyqt5訪問查詢和操作sql sever數(shù)據(jù)庫
布局采用一個盒式布局,一個垂直布局里面包括五個水平布局
第一行為連接參數(shù),包括主機(jī)名(地址),端口、數(shù)據(jù)庫名
第二行為:用戶名和密碼,再加一個連接按鈕
第三行為一個文本框,用于輸入數(shù)據(jù)查詢命令,后面跟一個查詢按詢
第四行為一個文本框,用于輸入數(shù)據(jù)執(zhí)行命令,后面跟一個執(zhí)行按詢
第五行為一個多行文本框,用于顯示執(zhí)行效果和錯誤信息
'''
import sys
from PyQt5.Qt import (QApplication, QWidget, QPushButton,QThread,pyqtSignal)
import pymssql
from PyQt5.QtWidgets import QTextEdit, QHBoxLayout, QVBoxLayout, QLineEdit, QLabel
from PyQt5.QtWidgets import QMessageBox
class MyWin(QWidget):
conn=False
def __init__(self):
super().__init__()
self.btn_conn = QPushButton('連接', self)#定義一個按鈕
self.btn_conn.clicked.connect(self.btnClick_conn) # 給按鈕綁定連接函數(shù)
hbox_line1 = QHBoxLayout()
hbox_line1.addWidget(QLabel("服務(wù)器主機(jī)名(IP地址):"))
self.txt_host = QLineEdit("localhost")#數(shù)據(jù)庫服務(wù)器主機(jī)本地為localhost
hbox_line1.addWidget(self.txt_host)
hbox_line1.addWidget(QLabel("端口:"))
self.txt_port = QLineEdit("1433")#數(shù)據(jù)庫服務(wù)器端口,默認(rèn)為1433
self.txt_port.setMaximumWidth(100)
self.txt_port.setMinimumWidth(100)
hbox_line1.addWidget(self.txt_port)
hbox_line2 = QHBoxLayout()
hbox_line2.addWidget(QLabel("數(shù)據(jù)庫:"))
self.txt_dbname = QLineEdit("myTestDb")#數(shù)據(jù)庫名
hbox_line2.addWidget(self.txt_dbname)
hbox_line2.addWidget(QLabel("用戶名:"))
self.txt_user = QLineEdit("sa")#連接數(shù)據(jù)庫的用戶名
self.txt_user.setMaximumWidth(160)
self.txt_user.setMinimumWidth(160)
hbox_line2.addWidget(self.txt_user)
hbox_line2.addWidget(QLabel("密碼:"))
self.txt_pass = QLineEdit("SQL2008r2")#連接數(shù)據(jù)庫的用戶密碼
self.txt_pass.setMaximumWidth(160)
self.txt_pass.setMinimumWidth(160)
self.txt_pass.setEchoMode(QLineEdit.Password)#設(shè)置密碼內(nèi)容用點(diǎn)代替
hbox_line2.addWidget(self.txt_pass)
hbox_line2.addWidget(self.btn_conn)
hbox_line3=QHBoxLayout()
hbox_line3.addWidget(QLabel("查詢語句:"))
self.txt_selelct=QLineEdit("SELECT * FROM tab_product")#示例的查詢語句
self.btn_select = QPushButton('查詢', self) # 查詢按鈕
self.btn_select.clicked.connect(self.btnClick_select) # 給查詢綁定函數(shù)
self.btn_select.setEnabled(False)
hbox_line3.addWidget(self.txt_selelct)
hbox_line3.addWidget(self.btn_select)
hbox_line4 = QHBoxLayout()
hbox_line4.addWidget(QLabel("操作語句:"))
#示例的操作語句,可以使用標(biāo)準(zhǔn)的SLQ 刪除、更新及插入語句
self.txt_do = QLineEdit("update tab_product set p_name='' where p_id=")
self.btn_do = QPushButton('執(zhí)行', self) # 執(zhí)行按鈕
self.btn_do.clicked.connect(self.btnClick_do) # 給執(zhí)行按鈕綁定函數(shù)
self.btn_do.setEnabled(False)
hbox_line4.addWidget(self.txt_do)
hbox_line4.addWidget(self.btn_do)
hbox_line5=QHBoxLayout()
self.txt_PressInfo = QTextEdit()#定義一個顯示操作信息的多行文本框
hbox_line5.addWidget(self.txt_PressInfo)
vbox = QVBoxLayout()
vbox.addLayout(hbox_line1)
vbox.addLayout(hbox_line2)
vbox.addLayout(hbox_line3)
vbox.addLayout(hbox_line4)
vbox.addLayout(hbox_line5)
self.setLayout(vbox) # 把垂直布局器添加到窗口
def btnClick_conn(self):#連接按鈕的點(diǎn)擊事件
#建立與數(shù)據(jù)庫的連接,參數(shù)分別為主機(jī)名,端口,用戶名,用戶密碼和連接的數(shù)據(jù)庫
# 注意:這里字符集使用的python文本常用的utf8(也可不加,因?yàn)槟J(rèn)就是utf8)
try:
self.conn = pymssql.connect(host=self.txt_host.text(),
port=self.txt_port.text(),
user=self.txt_user.text(),
password=self.txt_pass.text(),
database=self.txt_dbname.text(),
charset='utf8')
self.btn_select.setEnabled(True)
self.btn_do.setEnabled(True)
self.txt_PressInfo.append("數(shù)據(jù)庫已經(jīng)連接!")
except:#如不能連接上則讓查詢和執(zhí)行按鈕不可以用并進(jìn)行提示
self.txt_PressInfo.append("數(shù)據(jù)庫連接失??!")
def btnClick_select(self):#查詢按鈕的點(diǎn)擊事件
cursor=self.conn.cursor()#建立游標(biāo)
try:#用一個try來進(jìn)行查詢,成功則返回查詢結(jié)果,不成功則提示查詢失敗
cursor.execute(self.txt_selelct.text())
results=cursor.fetchall()
for result in results:#對數(shù)據(jù)集合中的每行進(jìn)行操作
showTxt=""
for col in range(len(result)):#對每行中每列數(shù)據(jù)進(jìn)行操作
# 因?yàn)镾QL Server返回的是GBK字符串,在uft8下中文會出現(xiàn)亂碼,
# 通過.encode('latin-1').decode('gbk')轉(zhuǎn)碼解決問題
# strip()用于清除字符串前后的空格,
# ljust()用于將所有字段長度固定(不足時補(bǔ)齊)
showTxt=showTxt+str(result[col]).strip().ljust(20).encode('latin-1').decode('gbk')
self.txt_PressInfo.append(showTxt)#把本行查詢結(jié)果追加到多行文本框中顯示
except:
self.txt_PressInfo.append("查詢數(shù)據(jù)記錄時發(fā)生錯誤!")
def btnClick_do(self):#數(shù)據(jù)操作按鈕的點(diǎn)擊事件
cursor = self.conn.cursor()
try:#通過一個try對數(shù)據(jù)進(jìn)行操作,成功則提示操作成功,否則提示操作錯誤。
sqldo=self.txt_do.text()
cursor.execute(sqldo)
self.conn.commit()
self.txt_PressInfo.append("執(zhí)行數(shù)據(jù)操作完成!")
except:
self.txt_PressInfo.append("執(zhí)行數(shù)據(jù)操作時發(fā)生錯誤!")
#定義一個關(guān)閉窗口時的對話框,如確定退出,則關(guān)閉conn的連接。
def closeEvent(self, event): # 關(guān)閉窗口觸發(fā)以下事件
a = QMessageBox.question(self, '退出', '你確定要退出嗎?', QMessageBox.Yes | QMessageBox.No,
QMessageBox.No) # "退出"代表的是彈出框的標(biāo)題,"你確認(rèn)退出.."表示彈出框的內(nèi)容
if a == QMessageBox.Yes:
if self.conn:
self.conn.close()
event.accept() # 接受關(guān)閉事件
else:
event.ignore() # 忽略關(guān)閉事件
if __name__ == "__main__":
app = QApplication(sys.argv)
myshow = MyWin()
myshow.setWindowTitle("Pyqt5連接SQL Server 演示")
myshow.setMinimumHeight(640)
myshow.setMinimumWidth(720)
myshow.show()
sys.exit(app.exec_())
四、運(yùn)行效果:
1、數(shù)據(jù)庫連接成功時:
2、數(shù)據(jù)庫連接失敗時:
3、查詢數(shù)據(jù)成功時:
4、查詢數(shù)據(jù)失敗時:
5、執(zhí)行數(shù)據(jù)操作成功時:
6、執(zhí)行數(shù)據(jù)操作失敗時:
7 、關(guān)閉窗口時提示:文章來源:http://www.zghlxwxcb.cn/news/detail-690472.html
五、測試環(huán)境:
這段代碼在windows和linux下都測試通過。
1、windows下:windows11家庭版+python3.11.1+PyCharm2022.3.2(Community Edition)
2、linux下:deepin os 20.8+python 3.7.1+PyCharm Community 2022.3。(數(shù)據(jù)庫采用公司服務(wù)器上遠(yuǎn)程的SQL Server進(jìn)行測試)。文章來源地址http://www.zghlxwxcb.cn/news/detail-690472.html
到了這里,關(guān)于Python 通過pymssql訪問查詢操作 SQL Server數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!