Python中操作MySQL和SQL Server數(shù)據(jù)庫(kù)的實(shí)戰(zhàn)指南
在Python中,我們經(jīng)常需要與各種數(shù)據(jù)庫(kù)進(jìn)行交互,其中MySQL和SQL Server是兩個(gè)常見(jiàn)的選擇。本文將介紹如何使用pymysql和pymssql庫(kù)進(jìn)行基本的數(shù)據(jù)庫(kù)操作,并通過(guò)實(shí)際代碼示例來(lái)展示這些操作。
1. 安裝依賴庫(kù)
在開(kāi)始之前,首先需要安裝pymysql和pymssql庫(kù)。你可以使用以下命令進(jìn)行安裝:
pip install pymysql pip install pymssql
2. 連接MySQL數(shù)據(jù)庫(kù)
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 執(zhí)行SQL查詢
cursor.execute("SELECT * FROM your_table")
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 打印結(jié)果
for row in result:
print(row)
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
3. 連接SQL Server數(shù)據(jù)庫(kù)
import pymssql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymssql.connect(
host='your_sql_server_host',
user='your_username',
password='your_password',
database='your_database'
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 執(zhí)行SQL查詢
cursor.execute("SELECT * FROM your_table")
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 打印結(jié)果
for row in result:
print(row)
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
4. 實(shí)戰(zhàn):插入數(shù)據(jù)
下面是一個(gè)簡(jiǎn)單的示例,演示如何插入數(shù)據(jù)到MySQL數(shù)據(jù)庫(kù):
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 插入數(shù)據(jù)
insert_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
data_to_insert = ('value1', 'value2')
cursor.execute(insert_query, data_to_insert)
# 提交事務(wù)
connection.commit()
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
5. 實(shí)戰(zhàn):更新數(shù)據(jù)
以下是一個(gè)演示如何使用pymssql更新SQL Server數(shù)據(jù)庫(kù)中的數(shù)據(jù)的示例:
import pymssql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymssql.connect(
host='your_sql_server_host',
user='your_username',
password='your_password',
database='your_database'
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 更新數(shù)據(jù)
update_query = "UPDATE your_table SET column1 = %s WHERE column2 = %s"
data_to_update = ('new_value', 'condition_value')
cursor.execute(update_query, data_to_update)
# 提交事務(wù)
connection.commit()
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
通過(guò)這些簡(jiǎn)單的代碼示例,你可以開(kāi)始在Python中使用pymysql和pymssql庫(kù)執(zhí)行基本的數(shù)據(jù)庫(kù)操作。根據(jù)實(shí)際需求,你可以進(jìn)一步學(xué)習(xí)高級(jí)用法和優(yōu)化技巧。
6. 實(shí)戰(zhàn):查詢數(shù)據(jù)并處理結(jié)果
使用pymysql和pymssql進(jìn)行查詢并處理結(jié)果也是常見(jiàn)的操作,以下是一個(gè)示例:
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 查詢數(shù)據(jù)
select_query = "SELECT * FROM your_table WHERE column1 = %s"
condition_value = 'desired_value'
cursor.execute(select_query, (condition_value,))
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 處理結(jié)果
for row in result:
print(row)
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
7. 實(shí)戰(zhàn):異常處理
在實(shí)際應(yīng)用中,異常處理是至關(guān)重要的。以下是一個(gè)簡(jiǎn)單的異常處理的示例:
import pymysql
try:
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 執(zhí)行SQL查詢
cursor.execute("SELECT * FROM your_table")
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 打印結(jié)果
for row in result:
print(row)
except pymysql.Error as e:
print(f"Error: {e}")
finally:
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
9. 實(shí)戰(zhàn):使用參數(shù)化查詢
參數(shù)化查詢是防止SQL注入攻擊的一種重要方法。以下是一個(gè)使用參數(shù)化查詢的實(shí)例:
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 參數(shù)化查詢
parametrized_query = "SELECT * FROM your_table WHERE column1 = %s AND column2 = %s"
query_params = ('value1', 'value2')
cursor.execute(parametrized_query, query_params)
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 處理結(jié)果
for row in result:
print(row)
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
10. 實(shí)戰(zhàn):使用上下文管理器
使用上下文管理器可以確保在操作完成后及時(shí)關(guān)閉數(shù)據(jù)庫(kù)連接,以下是一個(gè)使用with語(yǔ)句的實(shí)例:
import pymysql
# 使用上下文管理器確保在操作完成后關(guān)閉數(shù)據(jù)庫(kù)連接
with pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
) as connection:
# 創(chuàng)建游標(biāo)對(duì)象
with connection.cursor() as cursor:
# 執(zhí)行SQL查詢
cursor.execute("SELECT * FROM your_table")
# 獲取查詢結(jié)果
result = cursor.fetchall()
# 處理結(jié)果
for row in result:
print(row)
11. 實(shí)戰(zhàn):批量插入數(shù)據(jù)
如果需要插入大量數(shù)據(jù),最好使用批量插入以提高性能。以下是一個(gè)簡(jiǎn)單的批量插入示例:
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
# 批量插入數(shù)據(jù)
insert_query = "INSERT INTO your_table (column1, column2) VALUES (%s, %s)"
data_to_insert = [('value1', 'value2'), ('value3', 'value4'), ('value5', 'value6')]
cursor.executemany(insert_query, data_to_insert)
# 提交事務(wù)
connection.commit()
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
通過(guò)這些實(shí)戰(zhàn)示例,你可以更深入地了解如何在Python中使用pymysql和pymssql庫(kù)進(jìn)行數(shù)據(jù)庫(kù)操作,包括使用參數(shù)化查詢、上下文管理器以及批量插入等高級(jí)用法。這些技術(shù)將幫助你更有效地處理數(shù)據(jù)庫(kù)交互,并確保代碼的性能和安全性。
12. 實(shí)戰(zhàn):使用ORM框架
除了直接使用數(shù)據(jù)庫(kù)連接庫(kù),你還可以考慮使用ORM(對(duì)象關(guān)系映射)框架來(lái)簡(jiǎn)化數(shù)據(jù)庫(kù)操作。這里以SQLAlchemy為例進(jìn)行示范:
首先,確保已經(jīng)安裝SQLAlchemy:
pip install sqlalchemy
然后,以下是一個(gè)使用SQLAlchemy進(jìn)行簡(jiǎn)單查詢的實(shí)例:
from sqlalchemy import create_engine, Column, String, Integer
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# 定義數(shù)據(jù)模型
Base = declarative_base()
class YourTable(Base):
__tablename__ = 'your_table'
id = Column(Integer, primary_key=True)
column1 = Column(String)
column2 = Column(String)
# 創(chuàng)建數(shù)據(jù)庫(kù)連接引擎
engine = create_engine('mysql+pymysql://your_username:your_password@your_mysql_host:3306/your_database')
# 創(chuàng)建數(shù)據(jù)表
Base.metadata.create_all(engine)
# 創(chuàng)建會(huì)話
Session = sessionmaker(bind=engine)
session = Session()
# 查詢數(shù)據(jù)
result = session.query(YourTable).filter_by(column1='desired_value').all()
# 處理結(jié)果
for row in result:
print(row.column1, row.column2)
14. 實(shí)戰(zhàn):處理事務(wù)
事務(wù)是數(shù)據(jù)庫(kù)操作中的重要概念,用于確保一組相關(guān)操作要么全部成功,要么全部失敗。以下是一個(gè)簡(jiǎn)單的事務(wù)處理實(shí)例:
import pymysql
# 建立數(shù)據(jù)庫(kù)連接
connection = pymysql.connect(
host='your_mysql_host',
user='your_username',
password='your_password',
database='your_database',
port=3306
)
# 創(chuàng)建游標(biāo)對(duì)象
cursor = connection.cursor()
try:
# 開(kāi)始事務(wù)
connection.begin()
# 執(zhí)行多個(gè)SQL語(yǔ)句
cursor.execute("UPDATE your_table SET column1 = %s WHERE column2 = %s", ('new_value', 'condition_value'))
cursor.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", ('value1', 'value2'))
# 提交事務(wù)
connection.commit()
except pymysql.Error as e:
# 出現(xiàn)錯(cuò)誤時(shí)回滾事務(wù)
connection.rollback()
print(f"Error: {e}")
finally:
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
在這個(gè)示例中,如果執(zhí)行的所有SQL語(yǔ)句成功,commit()將提交事務(wù),否則rollback()將回滾事務(wù)。這有助于保持?jǐn)?shù)據(jù)的一致性。
15. 實(shí)戰(zhàn):使用連接池
在高并發(fā)環(huán)境中,使用數(shù)據(jù)庫(kù)連接池能夠有效地管理和復(fù)用數(shù)據(jù)庫(kù)連接,提高性能和效率。以下是一個(gè)使用pymysql連接池的實(shí)例:
首先,確保已經(jīng)安裝DBUtils庫(kù):
pip install DBUtils
然后,使用連接池的代碼示例:
from DBUtils.PooledDB import PooledDB
import pymysql
# 配置連接池
pool = PooledDB(
creator=pymysql, # 使用pymysql庫(kù)創(chuàng)建連接
maxconnections=5, # 連接池允許的最大連接數(shù)
mincached=2, # 初始化時(shí)連接池中至少創(chuàng)建的空閑的連接,0表示不創(chuàng)建
maxcached=5, # 連接池中最多閑置的連接,0和None表示不限制
maxshared=3, # 連接池中最多共享的連接數(shù)量,0和None表示全部共享
blocking=True, # 當(dāng)連接池達(dá)到最大數(shù)量時(shí),是否阻塞等待連接釋放
maxusage=None, # 單個(gè)連接最多被重復(fù)使用的次數(shù),None表示無(wú)限制
)
# 從連接池獲取連接
connection = pool.connection()
# 使用連接進(jìn)行操作
cursor = connection.cursor()
cursor.execute("SELECT * FROM your_table")
result = cursor.fetchall()
for row in result:
print(row)
# 關(guān)閉游標(biāo)和連接
cursor.close()
connection.close()
連接池的使用可以顯著提高數(shù)據(jù)庫(kù)連接的效率,尤其在并發(fā)訪問(wèn)高的情況下。
總結(jié)
在本篇文章中,我們深入探討了在Python中使用pymysql和pymssql庫(kù)進(jìn)行MySQL和SQL Server數(shù)據(jù)庫(kù)操作的基礎(chǔ)與實(shí)戰(zhàn)。通過(guò)一系列的代碼示例,我們覆蓋了以下關(guān)鍵方面:
- 基礎(chǔ)操作: 介紹了連接數(shù)據(jù)庫(kù)、查詢數(shù)據(jù)、插入、更新、異常處理等基本操作,通過(guò)簡(jiǎn)單的代碼展示了如何使用
pymysql和pymssql庫(kù)完成這些任務(wù)。 - 高級(jí)用法: 涵蓋了參數(shù)化查詢、上下文管理器、批量插入等高級(jí)用法,以及使用ORM框架SQLAlchemy進(jìn)行數(shù)據(jù)庫(kù)操作的實(shí)例。這些技術(shù)有助于提高代碼的安全性、可讀性和可維護(hù)性。
- 事務(wù)處理: 介紹了如何使用事務(wù)處理來(lái)確保一系列數(shù)據(jù)庫(kù)操作的原子性,以維護(hù)數(shù)據(jù)的一致性。
- 連接池: 講解了連接池的概念以及如何使用
DBUtils庫(kù)中的PooledDB創(chuàng)建連接池,以提高數(shù)據(jù)庫(kù)連接的效率和性能。 - 實(shí)際應(yīng)用: 提供了多個(gè)實(shí)際場(chǎng)景下的代碼示例,包括查詢、更新、事務(wù)處理和連接池的應(yīng)用,幫助讀者更好地理解和應(yīng)用所學(xué)知識(shí)。
通過(guò)學(xué)習(xí)本文所涵蓋的內(nèi)容,讀者可以建立起對(duì)Python中操作MySQL和SQL Server數(shù)據(jù)庫(kù)的全面理解,并掌握一系列實(shí)用的技術(shù),從而更加自信地應(yīng)對(duì)各種數(shù)據(jù)庫(kù)交互場(chǎng)景。在實(shí)際項(xiàng)目中,選擇適合自身需求的技術(shù)和工具,并根據(jù)最佳實(shí)踐進(jìn)行優(yōu)化,將有助于提高應(yīng)用程序的性能、可靠性和安全性。希望本文能成為讀者學(xué)習(xí)和應(yīng)用數(shù)據(jù)庫(kù)操作的有力指南。
以上就是Python中操作MySQL和SQL Server數(shù)據(jù)庫(kù)的實(shí)戰(zhàn)指南的詳細(xì)內(nèi)容,更多關(guān)于Python操作MySQL和SQL Server的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
解決Building?wheel?for?wrapt?(setup.py)?...?error的問(wèn)題
這篇文章主要介紹了解決Building?wheel?for?wrapt?(setup.py)?...?error的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python子進(jìn)程中創(chuàng)建多線程的完整指南
在操作系統(tǒng)中,進(jìn)程是資源分配的基本單位,每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間、文件描述符等系統(tǒng)資源,而線程是進(jìn)程內(nèi)的執(zhí)行單元,多個(gè)線程共享同一進(jìn)程的資源,本文給大家介紹了Python子進(jìn)程中創(chuàng)建多線程的完整指南,需要的朋友可以參考下2025-08-08
python psutil監(jiān)控進(jìn)程實(shí)例
今天小編就為大家分享一篇python psutil監(jiān)控進(jìn)程實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息
這篇文章主要介紹了基于Python爬蟲(chóng)采集天氣網(wǎng)實(shí)時(shí)信息,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式
Python?3中的urllib模塊可以用來(lái)處理URL,包括下載和上傳文件、創(chuàng)建和讀取cookie、訪問(wèn)Web?API等,本文給大家介紹Python3中urllib庫(kù)添加請(qǐng)求頭的兩種方式,感興趣的朋友一起看看吧2023-10-10
實(shí)現(xiàn)用python算法計(jì)算圓周率的小訣竅
什么!你不會(huì)背圓周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 但是,我會(huì)算啊,本文用一個(gè)簡(jiǎn)單的python代碼,教你計(jì)算圓周率2021-08-08
Python實(shí)現(xiàn)基于socket的udp傳輸與接收功能詳解
這篇文章主要介紹了Python實(shí)現(xiàn)基于socket的udp傳輸與接收功能,結(jié)合實(shí)例形式詳細(xì)分析了Python使用socket進(jìn)行udp文件傳輸與接收相關(guān)操作技巧及注意事項(xiàng),需要的朋友可以參考下2019-11-11
Python可視化mhd格式和raw格式的醫(yī)學(xué)圖像并保存的方法
今天小編就為大家分享一篇Python可視化mhd格式和raw格式的醫(yī)學(xué)圖像并保存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01

