python中使用pymssql庫(kù)操作MSSQL數(shù)據(jù)庫(kù)
前言
在Python中,pymssql是一個(gè)用于與Microsoft SQL Server數(shù)據(jù)庫(kù)進(jìn)行交互的第三方庫(kù)。pymssql提供了連接到數(shù)據(jù)庫(kù)、執(zhí)行SQL查詢(xún)、插入、更新和刪除數(shù)據(jù)等功能。下面我將詳細(xì)介紹如何使用pymssql進(jìn)行MSSQL數(shù)據(jù)庫(kù)操作。
安裝pymssql庫(kù) 首先,確保你的Python環(huán)境已經(jīng)安裝了pymssql庫(kù)。你可以使用pip工具進(jìn)行安裝
pip install pymssql
插入、更新和刪除數(shù)據(jù)
使用pymssql庫(kù),你可以執(zhí)行插入、更新和刪除數(shù)據(jù)的操作。
import pymssql
# 連接參數(shù)
server = 'server_name'
database = 'database_name'
username = 'username'
password = 'password'
# 建立連接
conn = pymssql.connect(server=server, database=database, user=username, password=password)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行SQL查詢(xún)
cursor.execute("SELECT * FROM your_table")
# 獲取查詢(xún)結(jié)果
result = cursor.fetchall()
# 遍歷結(jié)果
for row in result:
print(row)
# 插入數(shù)據(jù)
insert_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
insert_data = ('value1', 'value2')
cursor.execute(insert_query, insert_data)
# 更新數(shù)據(jù)
update_query = "UPDATE your_table SET column1 = %s WHERE id = %s"
update_data = ('new_value', 1)
cursor.execute(update_query, update_data) #參數(shù)化查詢(xún)
# 刪除數(shù)據(jù)
delete_query = "DELETE FROM your_table WHERE id = %s"
delete_data = (1,)
cursor.execute(delete_query, delete_data)
# 提交事務(wù)
conn.commit()
# 關(guān)閉游標(biāo)
cursor.close()管理事務(wù)
以確保一組數(shù)據(jù)庫(kù)操作要么全部成功,要么全部回滾。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
try:
# 開(kāi)始事務(wù)
conn.begin()
# 執(zhí)行數(shù)據(jù)庫(kù)操作
cursor.execute("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')")
cursor.execute("UPDATE your_table SET column1 = 'new_value' WHERE id = 1")
# 提交事務(wù)
conn.commit()
except Exception as e:
# 回滾事務(wù)
conn.rollback()
print("Error:", e)
# 關(guān)閉游標(biāo)
cursor.close()查詢(xún)結(jié)果處理
# pymssql返回的查詢(xún)結(jié)果是一個(gè)元組列表,其中每個(gè)元組表示一行數(shù)據(jù)。你可以通過(guò)遍歷查詢(xún)結(jié)果來(lái)逐行處理數(shù)據(jù)。
# 查詢(xún)結(jié)果處理
# pymssql返回的查詢(xún)結(jié)果是一個(gè)元組列表,其中每個(gè)元組表示一行數(shù)據(jù)。你可以通過(guò)遍歷查詢(xún)結(jié)果來(lái)逐行處理數(shù)據(jù)。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢(xún)
cursor.execute("SELECT column1, column2 FROM your_table")
# 獲取查詢(xún)結(jié)果
result = cursor.fetchall()
# 遍歷結(jié)果
for row in result:
column1_value = row[0]
column2_value = row[1]
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)
cursor.close()處理大型結(jié)果集
如果查詢(xún)結(jié)果集非常大,無(wú)法一次性全部加載到內(nèi)存中,可以使用pymssql提供的fetchone()和fetchmany()方法來(lái)逐步獲取結(jié)果集的數(shù)據(jù)。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢(xún)
cursor.execute("SELECT column1, column2 FROM your_table")
# 獲取一條記錄
row = cursor.fetchone()
while row:
# 處理數(shù)據(jù)
print(row)
# 獲取下一條記錄
row = cursor.fetchone()
# 關(guān)閉游標(biāo)
cursor.close()批量插入數(shù)據(jù)
# 如果你需要插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù),一次插入一行可能效率較低。pymssql允許你使用executemany()方法進(jìn)行批量插入,一次插入多行數(shù)據(jù)。
# 批量插入數(shù)據(jù)
# 如果你需要插入大量數(shù)據(jù)到數(shù)據(jù)庫(kù),一次插入一行可能效率較低。pymssql允許你使用executemany()方法進(jìn)行批量插入,一次插入多行數(shù)據(jù)。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 準(zhǔn)備插入數(shù)據(jù)
data = [('value1', 'value2'),
('value3', 'value4'),
('value5', 'value6')]
# 執(zhí)行批量插入
insert_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
cursor.executemany(insert_query, data)
# 提交事務(wù)
conn.commit()
# 關(guān)閉游標(biāo)
cursor.close()存儲(chǔ)過(guò)程調(diào)用
# pymssql也支持調(diào)用MSSQL數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。你可以使用execute_proc()方法來(lái)執(zhí)行存儲(chǔ)過(guò)程。
# 存儲(chǔ)過(guò)程調(diào)用
# pymssql也支持調(diào)用MSSQL數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程。你可以使用execute_proc()方法來(lái)執(zhí)行存儲(chǔ)過(guò)程。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行存儲(chǔ)過(guò)程
cursor.execute_proc('your_stored_procedure_name', ('param1', 'param2'))
# 獲取結(jié)果
result = cursor.fetchall()
# 關(guān)閉游標(biāo)
cursor.close()分頁(yè)查詢(xún)
當(dāng)處理大量數(shù)據(jù)時(shí),分頁(yè)查詢(xún)是一種常見(jiàn)的需求??梢允褂胮ymssql的OFFSET和FETCH語(yǔ)句來(lái)實(shí)現(xiàn)分頁(yè)查詢(xún)。通過(guò)調(diào)整page_size和page_number參數(shù),可以獲取指定頁(yè)數(shù)的數(shù)據(jù)。
# 定義分頁(yè)參數(shù)
page_size = 10
page_number = 1
# 執(zhí)行分頁(yè)查詢(xún)
query = f"SELECT column1, column2 FROM your_table ORDER BY column1 OFFSET {page_size * (page_number - 1)} ROWS FETCH NEXT {page_size} ROWS ONLY"
cursor.execute(query)
result = cursor.fetchall()
for row in result:
# 處理數(shù)據(jù)# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 定義分頁(yè)查詢(xún)語(yǔ)句
page_size = 10 # 每頁(yè)的記錄數(shù)
page_number = 1 # 頁(yè)碼
offset = (page_number - 1) * page_size # 計(jì)算偏移量
query = f"SELECT column1, column2 FROM your_table ORDER BY column1 OFFSET {offset} ROWS FETCH NEXT {page_size} ROWS ONLY"
# 執(zhí)行分頁(yè)查詢(xún)
cursor.execute(query)
# 處理查詢(xún)結(jié)果
result = cursor.fetchall()
for row in result:
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)
cursor.close()處理數(shù)據(jù)庫(kù)連接錯(cuò)誤
在連接數(shù)據(jù)庫(kù)時(shí),可能會(huì)遇到連接錯(cuò)誤??梢酝ㄟ^(guò)捕獲pymssql庫(kù)引發(fā)的pymssql.OperationalError異常來(lái)處理連接錯(cuò)誤。
import pymssql
try:
conn = pymssql.connect(server='server_name', database='database_name', user='username', password='password')
# 連接成功,執(zhí)行數(shù)據(jù)庫(kù)操作
cursor = conn.cursor()
# 執(zhí)行查詢(xún)、插入、更新等操作
# ...
conn.commit()
cursor.close()
conn.close()
except pymssql.OperationalError as e:
# 處理連接錯(cuò)誤
print("Connection Error:", e)import pymssql
try:
# 連接數(shù)據(jù)庫(kù)
conn = pymssql.connect(server='server_name', database='database_name', user='username', password='password')
# 執(zhí)行數(shù)據(jù)庫(kù)操作
cursor = conn.cursor()
cursor.execute("SELECT column1, column2 FROM your_table")
result = cursor.fetchall()
# 處理查詢(xún)結(jié)果
for row in result:
# 處理數(shù)據(jù)
except pymssql.Error as e:
print("Database Error:", e)
finally:
# 關(guān)閉連接
if conn:
conn.close()獲取查詢(xún)結(jié)果的列信息
如果你需要獲取查詢(xún)結(jié)果的列信息,如列名、數(shù)據(jù)類(lèi)型等,可以使用cursor.description屬性。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢(xún)
cursor.execute("SELECT column1, column2 FROM your_table")
# 獲取列名
column_names = [column[0] for column in cursor.description]
# 獲取列類(lèi)型
column_types = [column[1] for column in cursor.description]
# 處理查詢(xún)結(jié)果
result = cursor.fetchall()
for row in result:
for name, value in zip(column_names, row):
print(f"{name}: {value}")
# 關(guān)閉游標(biāo)
cursor.close()處理查詢(xún)結(jié)果中的NULL值
在查詢(xún)結(jié)果中,某些列的值可能為NULL。pymssql將NULL值表示為Python中的None。你可以使用條件語(yǔ)句來(lái)處理查詢(xún)結(jié)果中的NULL值。
cursor.execute("SELECT column1, column2 FROM your_table")
result = cursor.fetchall()
for row in result:
column1_value = row[0] if row[0] is not None else 'N/A'
column2_value = row[1] if row[1] is not None else 'N/A'
# 處理數(shù)據(jù)執(zhí)行存儲(chǔ)過(guò)程并獲取輸出參數(shù)
如果你需要執(zhí)行MSSQL數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程,并獲取輸出參數(shù)的值,可以使用pymssql提供的callproc()方法。使用callproc()方法執(zhí)行名為your_stored_procedure_name的存儲(chǔ)過(guò)程,并傳遞參數(shù)param1和param2。然后,可以使用getoutputparams()方法獲取輸出參數(shù)的值。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行存儲(chǔ)過(guò)程
cursor.callproc('your_stored_procedure_name', (param1, param2))
# 獲取輸出參數(shù)的值
output_param1 = cursor.getoutputparams()[0]
output_param2 = cursor.getoutputparams()[1]
# 關(guān)閉游標(biāo)
cursor.close()批量更新數(shù)據(jù)
如果你需要批量更新數(shù)據(jù)庫(kù)中的數(shù)據(jù),可以使用pymssql的executemany()方法。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 定義更新語(yǔ)句和數(shù)據(jù)
update_query = "UPDATE your_table SET column1 = %s WHERE id = %s"
data = [('new_value1', 1), ('new_value2', 2), ('new_value3', 3)]
# 執(zhí)行批量更新
cursor.executemany(update_query, data)
# 提交事務(wù)
conn.commit()
# 關(guān)閉游標(biāo)
cursor.close()使用with語(yǔ)句自動(dòng)管理連接和事務(wù)
使用with語(yǔ)句可以更方便地管理數(shù)據(jù)庫(kù)連接和事務(wù),確保資源的正確釋放和事務(wù)的提交或回滾。
# 使用with語(yǔ)句管理連接和事務(wù)
with pymssql.connect(server='server_name', database='database_name', user='username', password='password') as conn:
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
try:
# 執(zhí)行數(shù)據(jù)庫(kù)操作
cursor.execute("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')")
cursor.execute("UPDATE your_table SET column1 = 'new_value' WHERE id = 1")
# 提交事務(wù)
conn.commit()
except Exception as e:
# 回滾事務(wù)
conn.rollback()
print("Error:", e)
# 關(guān)閉游標(biāo)
cursor.close()異步操作
如果你需要執(zhí)行異步的MSSQL數(shù)據(jù)庫(kù)操作,pymssql提供了對(duì)異步IO的支持。可以使用pymssql.connect()的asynchronous=True參數(shù)來(lái)創(chuàng)建異步連接,以及cursor.execute()的as_dict=True參數(shù)來(lái)執(zhí)行異步查詢(xún)并返回字典格式的結(jié)果。使用asyncio模塊創(chuàng)建了一個(gè)異步的主函數(shù)main(),在其中創(chuàng)建了異步連接和游標(biāo),并執(zhí)行了異步查詢(xún)。最后,我們使用事件循環(huán)運(yùn)行異步任務(wù)。
import asyncio
import pymssql
async def main():
# 創(chuàng)建異步連接
conn = await pymssql.connect(server='server_name', database='database_name', user='username', password='password', asynchronous=True)
# 創(chuàng)建異步游標(biāo)
cursor = conn.cursor(as_dict=True)
# 執(zhí)行異步查詢(xún)
await cursor.execute("SELECT * FROM your_table")
# 獲取結(jié)果
result = await cursor.fetchall()
# 處理查詢(xún)結(jié)果
for row in result:
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)和連接
await cursor.close()
await conn.close()
# 創(chuàng)建事件循環(huán)并運(yùn)行異步任務(wù)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())使用連接池
連接池是一種用于管理數(shù)據(jù)庫(kù)連接的技術(shù),它可以提高應(yīng)用程序的性能和可擴(kuò)展性。pymssql支持使用連接池來(lái)管理數(shù)據(jù)庫(kù)連接。使用連接池可以減少連接的創(chuàng)建和銷(xiāo)毀開(kāi)銷(xiāo),并提供連接的復(fù)用,從而提高應(yīng)用程序的性能和可擴(kuò)展性。
from pymssql import pool
# 創(chuàng)建連接池
pool = pool.ConnectionPool(server='server_name', database='database_name', user='username', password='password', max_connections=5)
# 從連接池獲取連接
conn = pool.get_connection()
# 執(zhí)行數(shù)據(jù)庫(kù)操作
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
# 處理查詢(xún)結(jié)果
for row in result:
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()總結(jié)
到此這篇關(guān)于python中使用pymssql庫(kù)操作MSSQL數(shù)據(jù)庫(kù)的文章就介紹到這了,更多相關(guān)python pymssql操作MSSQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Python和Flask編寫(xiě)一個(gè)留言簿
本文將通過(guò)創(chuàng)建一個(gè)簡(jiǎn)單的留言簿應(yīng)用來(lái)入門(mén)Flask,這個(gè)項(xiàng)目可以幫助我們理解Flask的基本概念和功能,如路由、模板、表單處理等,感興趣的可以了解下2024-12-12
python Django里CSRF 對(duì)應(yīng)策略詳解
這篇文章主要介紹了python Django里CSRF 對(duì)應(yīng)策略詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
Python如何利用struct進(jìn)行二進(jìn)制文件或數(shù)據(jù)流
這篇文章主要介紹了Python如何利用struct進(jìn)行二進(jìn)制文件或數(shù)據(jù)流問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Python&Matlab實(shí)現(xiàn)灰狼優(yōu)化算法的示例代碼
灰狼優(yōu)化算法是一種群智能優(yōu)化算法,它的獨(dú)特之處在于一小部分擁有絕對(duì)話語(yǔ)權(quán)的灰狼帶領(lǐng)一群灰狼向獵物前進(jìn)。本文具體介紹了灰狼優(yōu)化算法的兩種實(shí)現(xiàn)示例代碼,需要的可以參考一下2022-03-03
opencv-python 提取sift特征并匹配的實(shí)例
今天小編就為大家分享一篇opencv-python 提取sift特征并匹配的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12

