在Python中,pymssql是一個(gè)用于與Microsoft SQL Server數(shù)據(jù)庫進(jìn)行交互的第三方庫。pymssql提供了連接到數(shù)據(jù)庫、執(zhí)行SQL查詢、插入、更新和刪除數(shù)據(jù)等功能。下面我將詳細(xì)介紹如何使用pymssql進(jìn)行MSSQL數(shù)據(jù)庫操作。
安裝pymssql庫 首先,確保你的Python環(huán)境已經(jīng)安裝了pymssql庫。你可以使用pip工具進(jìn)行安裝
pip install pymssql
-
插入、更新和刪除數(shù)據(jù)
使用pymssql庫,你可以執(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查詢
cursor.execute("SELECT * FROM your_table")
# 獲取查詢結(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ù)化查詢
# 刪除數(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ù)庫操作要么全部成功,要么全部回滾。?
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
try:
# 開始事務(wù)
conn.begin()
# 執(zhí)行數(shù)據(jù)庫操作
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()
-
查詢結(jié)果處理
# pymssql返回的查詢結(jié)果是一個(gè)元組列表,其中每個(gè)元組表示一行數(shù)據(jù)。你可以通過遍歷查詢結(jié)果來逐行處理數(shù)據(jù)。?
# 查詢結(jié)果處理
# pymssql返回的查詢結(jié)果是一個(gè)元組列表,其中每個(gè)元組表示一行數(shù)據(jù)。你可以通過遍歷查詢結(jié)果來逐行處理數(shù)據(jù)。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢
cursor.execute("SELECT column1, column2 FROM your_table")
# 獲取查詢結(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é)果集
如果查詢結(jié)果集非常大,無法一次性全部加載到內(nèi)存中,可以使用pymssql提供的fetchone()
和fetchmany()
方法來逐步獲取結(jié)果集的數(shù)據(jù)。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢
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ù)庫,一次插入一行可能效率較低。pymssql允許你使用executemany()方法進(jìn)行批量插入,一次插入多行數(shù)據(jù)。
# 批量插入數(shù)據(jù)
# 如果你需要插入大量數(shù)據(jù)到數(shù)據(jù)庫,一次插入一行可能效率較低。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ǔ)過程調(diào)用
# pymssql也支持調(diào)用MSSQL數(shù)據(jù)庫中的存儲(chǔ)過程。你可以使用execute_proc()方法來執(zhí)行存儲(chǔ)過程。
# 存儲(chǔ)過程調(diào)用
# pymssql也支持調(diào)用MSSQL數(shù)據(jù)庫中的存儲(chǔ)過程。你可以使用execute_proc()方法來執(zhí)行存儲(chǔ)過程。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行存儲(chǔ)過程
cursor.execute_proc('your_stored_procedure_name', ('param1', 'param2'))
# 獲取結(jié)果
result = cursor.fetchall()
# 關(guān)閉游標(biāo)
cursor.close()
-
?分頁查詢
當(dāng)處理大量數(shù)據(jù)時(shí),分頁查詢是一種常見的需求??梢允褂胮ymssql的OFFSET
和FETCH
語句來實(shí)現(xiàn)分頁查詢。通過調(diào)整page_size
和page_number
參數(shù),可以獲取指定頁數(shù)的數(shù)據(jù)。
# 定義分頁參數(shù)
page_size = 10
page_number = 1
# 執(zhí)行分頁查詢
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()
# 定義分頁查詢語句
page_size = 10 # 每頁的記錄數(shù)
page_number = 1 # 頁碼
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í)行分頁查詢
cursor.execute(query)
# 處理查詢結(jié)果
result = cursor.fetchall()
for row in result:
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)
cursor.close()
?
-
處理數(shù)據(jù)庫連接錯(cuò)誤
在連接數(shù)據(jù)庫時(shí),可能會(huì)遇到連接錯(cuò)誤。可以通過捕獲pymssql庫引發(fā)的pymssql.OperationalError
異常來處理連接錯(cuò)誤。?
import pymssql
try:
conn = pymssql.connect(server='server_name', database='database_name', user='username', password='password')
# 連接成功,執(zhí)行數(shù)據(jù)庫操作
cursor = conn.cursor()
# 執(zhí)行查詢、插入、更新等操作
# ...
conn.commit()
cursor.close()
conn.close()
except pymssql.OperationalError as e:
# 處理連接錯(cuò)誤
print("Connection Error:", e)
import pymssql
try:
# 連接數(shù)據(jù)庫
conn = pymssql.connect(server='server_name', database='database_name', user='username', password='password')
# 執(zhí)行數(shù)據(jù)庫操作
cursor = conn.cursor()
cursor.execute("SELECT column1, column2 FROM your_table")
result = cursor.fetchall()
# 處理查詢結(jié)果
for row in result:
# 處理數(shù)據(jù)
except pymssql.Error as e:
print("Database Error:", e)
finally:
# 關(guān)閉連接
if conn:
conn.close()
-
獲取查詢結(jié)果的列信息
如果你需要獲取查詢結(jié)果的列信息,如列名、數(shù)據(jù)類型等,可以使用cursor.description
屬性。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行查詢
cursor.execute("SELECT column1, column2 FROM your_table")
# 獲取列名
column_names = [column[0] for column in cursor.description]
# 獲取列類型
column_types = [column[1] for column in cursor.description]
# 處理查詢結(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()
-
?處理查詢結(jié)果中的NULL值
在查詢結(jié)果中,某些列的值可能為NULL。pymssql將NULL值表示為Python中的None
。你可以使用條件語句來處理查詢結(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ǔ)過程并獲取輸出參數(shù)
如果你需要執(zhí)行MSSQL數(shù)據(jù)庫中的存儲(chǔ)過程,并獲取輸出參數(shù)的值,可以使用pymssql提供的callproc()
方法。使用callproc()
方法執(zhí)行名為your_stored_procedure_name
的存儲(chǔ)過程,并傳遞參數(shù)param1
和param2
。然后,可以使用getoutputparams()
方法獲取輸出參數(shù)的值。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 執(zhí)行存儲(chǔ)過程
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ù)庫中的數(shù)據(jù),可以使用pymssql的executemany()
方法。
# 創(chuàng)建游標(biāo)對(duì)象
cursor = conn.cursor()
# 定義更新語句和數(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語句自動(dòng)管理連接和事務(wù)
使用with
語句可以更方便地管理數(shù)據(jù)庫連接和事務(wù),確保資源的正確釋放和事務(wù)的提交或回滾。
# 使用with語句管理連接和事務(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ù)庫操作
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ù)庫操作,pymssql提供了對(duì)異步IO的支持??梢允褂?code>pymssql.connect()的asynchronous=True
參數(shù)來創(chuàng)建異步連接,以及cursor.execute()
的as_dict=True
參數(shù)來執(zhí)行異步查詢并返回字典格式的結(jié)果。使用asyncio
模塊創(chuàng)建了一個(gè)異步的主函數(shù)main()
,在其中創(chuàng)建了異步連接和游標(biāo),并執(zhí)行了異步查詢。最后,我們使用事件循環(huán)運(yùn)行異步任務(wù)。文章來源:http://www.zghlxwxcb.cn/news/detail-489791.html
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í)行異步查詢
await cursor.execute("SELECT * FROM your_table")
# 獲取結(jié)果
result = await cursor.fetchall()
# 處理查詢結(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ù)庫連接的技術(shù),它可以提高應(yīng)用程序的性能和可擴(kuò)展性。pymssql支持使用連接池來管理數(shù)據(jù)庫連接。使用連接池可以減少連接的創(chuàng)建和銷毀開銷,并提供連接的復(fù)用,從而提高應(yīng)用程序的性能和可擴(kuò)展性。文章來源地址http://www.zghlxwxcb.cn/news/detail-489791.html
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ù)庫操作
cursor = conn.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
# 處理查詢結(jié)果
for row in result:
# 處理數(shù)據(jù)
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
到了這里,關(guān)于python中的pymssql操作MSSQL數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!