??前言
??學(xué)習(xí)永無止境,記得每天學(xué)習(xí)新的知識?。?/strong>
在很多業(yè)務(wù)場景中,我們或多或少都要對數(shù)據(jù)庫上的數(shù)據(jù)進(jìn)行的一系列操作,包括讀取數(shù)據(jù)、寫數(shù)據(jù)、更新或修改數(shù)據(jù)、刪除數(shù)據(jù)等。這些操作可以通過編寫SQL語句來實(shí)現(xiàn),也可以通過使用數(shù)據(jù)庫管理系統(tǒng)提供的API接口來實(shí)現(xiàn)。數(shù)據(jù)庫操作是應(yīng)用程序開發(fā)中必不可少的一部分。使用數(shù)據(jù)庫編程接口操作數(shù)據(jù)庫的方式也有很多種,比如Java、Python、C++、PHP等等。其實(shí)各種編程語言操作數(shù)據(jù)庫的方式大同小異,其基本原理還是一樣的,只是實(shí)現(xiàn)方式不同。
本章內(nèi)容基于Python這門編程語言來實(shí)現(xiàn)對MySQL數(shù)據(jù)庫的基本增刪改查操作,通過本章內(nèi)容的學(xué)習(xí),希望大家都能有所收獲,同時(shí)也能掌握使用Python來操作MySQL數(shù)據(jù)庫,實(shí)現(xiàn)對數(shù)據(jù)庫進(jìn)行增刪改查操作。
??數(shù)據(jù)庫編程
??數(shù)據(jù)庫編程基本介紹
數(shù)據(jù)庫編程是指使用編程語言來操作和管理數(shù)據(jù)庫的過程。數(shù)據(jù)庫編程通常包括數(shù)據(jù)庫設(shè)計(jì)、SQL語句編寫、數(shù)據(jù)庫連接、數(shù)據(jù)插入、查詢、更新和刪除等操作。通過數(shù)據(jù)庫編程,可以實(shí)現(xiàn)對數(shù)據(jù)庫的自動(dòng)化管理和數(shù)據(jù)的高效處理,提高數(shù)據(jù)的安全性和可靠性。數(shù)據(jù)庫編程分為數(shù)據(jù)庫客戶端編程與數(shù)據(jù)庫服務(wù)器端編程。數(shù)據(jù)庫客戶端編程主要使用ODBC API、ADO、ADO.NET、OCI、OTL
等方法;數(shù)據(jù)庫服務(wù)端編程主要使用OLE DB
等方法。數(shù)據(jù)庫編程需要掌握一些訪問數(shù)據(jù)庫技術(shù)方法,還需要注意怎么設(shè)計(jì)高效的數(shù)據(jù)庫、數(shù)據(jù)庫管理與運(yùn)行的優(yōu)化、數(shù)據(jù)庫語句的優(yōu)化。
??數(shù)據(jù)庫編程接口
數(shù)據(jù)庫編程接口(Database Programming Interface,簡稱DBAPI) 是一組用于訪問數(shù)據(jù)庫的規(guī)范,它定義了一組API,用于在編程語言中連接數(shù)據(jù)庫、執(zhí)行SQL語句、獲取查詢結(jié)果等操作。DBAPI的出現(xiàn),使得不同編程語言之間可以通過統(tǒng)一的接口來訪問數(shù)據(jù)庫,從而實(shí)現(xiàn)跨語言的數(shù)據(jù)庫編程。DBAPI的實(shí)現(xiàn)可以分為兩種:一種是基于ODBC(Open Database Connectivity)
的實(shí)現(xiàn),如JDBC(Java Database Connectivity)
;另一種是基于SQLAPI(SQL Application Programming Interface)
的實(shí)現(xiàn),如MySQLdb、pymysql
等。
??什么情況下會(huì)使用Python操作MySQL數(shù)據(jù)庫?
Python操作MySQL數(shù)據(jù)庫通常用于需要在Python程序中對MySQL數(shù)據(jù)庫進(jìn)行增刪改查操作的情況,例如:
- 開發(fā)Web應(yīng)用程序:Web應(yīng)用程序通常需要使用數(shù)據(jù)庫存儲(chǔ)用戶數(shù)據(jù)、文章數(shù)據(jù)等,可以使用Python操作MySQL數(shù)據(jù)庫來實(shí)現(xiàn)。
- 數(shù)據(jù)分析:數(shù)據(jù)分析師通常需要從MySQL數(shù)據(jù)庫中提取數(shù)據(jù)進(jìn)行分析,可以使用Python操作MySQL數(shù)據(jù)庫來實(shí)現(xiàn)。
- 數(shù)據(jù)遷移:數(shù)據(jù)遷移是指將數(shù)據(jù)從一個(gè)數(shù)據(jù)庫遷移到另一個(gè)數(shù)據(jù)庫,可以使用Python操作MySQL數(shù)據(jù)庫來實(shí)現(xiàn)。
- 自動(dòng)化腳本:自動(dòng)化腳本通常需要對MySQL數(shù)據(jù)庫進(jìn)行操作,例如備份數(shù)據(jù)庫、恢復(fù)數(shù)據(jù)庫等,可以使用Python操作MySQL數(shù)據(jù)庫來實(shí)現(xiàn)。
??Java和Python操作MySQL數(shù)據(jù)庫有何不同?
Java和Python都可以操作MySQL數(shù)據(jù)庫,但它們之間有一些區(qū)別:
- 語言特性:Java是一種面向?qū)ο蟮木幊陶Z言,而Python是一種面向?qū)ο蟮慕忉屝驼Z言。Java需要編譯后才能運(yùn)行,而Python可以直接在解釋器中運(yùn)行。
- 數(shù)據(jù)庫連接方式:Java可以使用
JDBC(Java Database Connectivity)
來連接MySQL數(shù)據(jù)庫,而Python可以使用多種庫來連接MySQL數(shù)據(jù)庫,如MySQLdb、pymysql
等。 - SQL語句:Java和Python都可以使用SQL語句來操作MySQL數(shù)據(jù)庫,但它們的語法略有不同。
- 數(shù)據(jù)類型:Java和Python對MySQL數(shù)據(jù)庫中的數(shù)據(jù)類型支持略有不同。例如,Java中可以使用
Long類型
來表示MySQL數(shù)據(jù)庫中的整數(shù)類型,而Python中需要使用int類型
。 - 性能:Java通常比Python更快,因?yàn)镴ava是編譯型語言,而Python是解釋型語言。但是,這種差異在實(shí)際應(yīng)用中并不明顯,因?yàn)镻ython也可以使用JIT(Just-In-Time)編譯器來提高性能。
總之,Java和Python都可以操作MySQL數(shù)據(jù)庫,但它們之間存在一些區(qū)別,開發(fā)者需要根據(jù)實(shí)際需求選擇適合自己的語言和庫。
??Python數(shù)據(jù)庫編程接口
Python有多種數(shù)據(jù)庫編程接口,其中最常用的是Python標(biāo)準(zhǔn)庫中的sqlite3模塊、MySQL驅(qū)動(dòng)程序和第三方庫pymysql、psycopg2等。
??pymysql簡介
pymysql是一個(gè)Python庫,用于連接MySQL數(shù)據(jù)庫并執(zhí)行SQL語句。它是基于MySQLdb的升級版,支持Python3.x和MySQL5.x
及以上版本。pymysql提供了簡單易用的API,可以方便地進(jìn)行數(shù)據(jù)庫操作,如連接數(shù)據(jù)庫、執(zhí)行SQL語句、獲取查詢結(jié)果等。pymysql還支持事務(wù)處理、連接池、數(shù)據(jù)庫連接監(jiān)控等功能,可以滿足不同場景的需求。
??使用Python操作MySQL數(shù)據(jù)庫
首先,使用Python操作MySQL數(shù)據(jù)庫這里我們需要使用到三方庫PyMySQl
,利用本地的pip來下載我們所需要的第三方庫。win + R ---> 輸入cmd
打開控制臺,輸入代碼完成下載。
執(zhí)行命令
pip install pymysql
可以通過命令查看第三方庫是否安裝成功
執(zhí)行命令
pip list
當(dāng)然,有些小伙伴在執(zhí)行上述命令可能會(huì)出現(xiàn)以下這種情況(這里我做舉例),這是因?yàn)樵诎惭bPython的時(shí)候沒有配置環(huán)境變量,只需要配置以下Python的環(huán)境變量即可。
接下來,就可以新建一個(gè)項(xiàng)目,然后進(jìn)行對MySQL數(shù)據(jù)庫的操作了。
# 導(dǎo)入第三方庫
import pymysql
# 連接數(shù)據(jù)庫
conn = pymysql.connect(host='localhost', user='root', password='123456', database='test')
?補(bǔ)充
connect函數(shù)的參數(shù)說明
參數(shù) | 說明 |
---|---|
host | 數(shù)據(jù)庫的地址,可以是IP地址或者主機(jī)名 |
user | 用戶名 |
password | 密碼 |
database | 數(shù)據(jù)庫名 |
port | 數(shù)據(jù)庫的端口號,默認(rèn)為3306 |
charset | 數(shù)據(jù)庫的字符集,默認(rèn)為utf8mb4 |
cursorclass | 游標(biāo)的類,默認(rèn)為pymysql.cursors.DictCursor |
use_unicode | 是否使用Unicode編碼,默認(rèn)為True |
connect_timeout | 用于設(shè)置連接超時(shí)時(shí)間,其默認(rèn)值為10秒 |
connect函數(shù)的返回值是一個(gè)連接對象
,用于建立與MySQL服務(wù)器的連接。連接對象可以用于執(zhí)行SQL語句、獲取查詢結(jié)果等操作。
接下來需要?jiǎng)?chuàng)建一個(gè)游標(biāo)對象,游標(biāo)對象用于管理查詢結(jié)果集。游標(biāo)對象可以用于遍歷查詢結(jié)果集,也可以用于執(zhí)行多條SQL語句。然后執(zhí)行SQL查詢語句查詢數(shù)據(jù),并將查詢到的結(jié)果返回并打印,最后關(guān)閉連接。
# 創(chuàng)建游標(biāo)
cursor = conn.cursor()
# 執(zhí)行SQL語句
cursor.execute("SELECT * FROM users")
# 獲取查詢結(jié)果
rows = cursor.fetchall()
# 打印查詢結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
?補(bǔ)充
connect函數(shù)常用方法
方法 | 語法 | 說明 |
---|---|---|
close() | conn.close() | 關(guān)閉連接 |
cursor() | cursor = conn.cursor() | 創(chuàng)建游標(biāo)對象 |
execute() | cursor.execute(sql) | 執(zhí)行SQL語句,sql表示要執(zhí)行的SQL語句 |
executemany() | cursor.executemany(sql, args) | 批量執(zhí)行SQL語句,sql表示要執(zhí)行的SQL語句,args表示SQL語句中的參數(shù) |
commit() | conn.commit() | 提交事務(wù) |
ollback() | conn.rollback() | 回滾事務(wù) |
setinputsizes() | cursor.setinputsizes(size1, size2, …) | 設(shè)置輸入?yún)?shù)的大小,size1、size2等表示輸入?yún)?shù)的大小 |
setoutputsize() | cursor.setoutputsize(size) | 設(shè)置輸出參數(shù)的大小,size表示輸出參數(shù)的大小 |
description屬性 | description = cursor.description | 獲取查詢結(jié)果的描述信息 |
游標(biāo)對象的常用方法
方法 | 語法 | 說明 |
---|---|---|
fetchone() | row = cursor.fetchone() | 獲取查詢結(jié)果的第一行數(shù)據(jù) |
fetchmany() | row = cursor.fetchone() | 獲取查詢結(jié)果的多行數(shù)據(jù),size表示要獲取的數(shù)據(jù)行數(shù) |
fetchall() | rows = cursor.fetchall() | 獲取查詢結(jié)果的所有數(shù)據(jù) |
nextset() | cursor.nextset() | 獲取下一個(gè)查詢結(jié)果集 |
close() | cursor.close() | 關(guān)閉游標(biāo)對象 |
lastrowid屬性 | id = cursor.lastrowid | 獲取最后一行數(shù)據(jù)的ID |
以上就是對MySQL數(shù)據(jù)庫的基本操作,完整代碼和運(yùn)行結(jié)果如下:
完整代碼
import pymysql
# 連接數(shù)據(jù)庫
conn = pymysql.connect(host='localhost', user='root', password='123456', database='test')
# 創(chuàng)建游標(biāo)
cursor = conn.cursor()
# 執(zhí)行SQL語句
cursor.execute("SELECT * FROM users")
# 獲取查詢結(jié)果
rows = cursor.fetchall()
# 打印查詢結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
運(yùn)行結(jié)果
??查詢數(shù)據(jù)
import pymysql
# 連接數(shù)據(jù)庫
# host表示數(shù)據(jù)庫的地址,user表示用戶名,password表示密碼,database表示數(shù)據(jù)庫名。
coon = pymysql.connect(host='localhost', user='root', password='123456', database='test')
# 創(chuàng)建游標(biāo)
cursor = coon.cursor()
# 執(zhí)行SQL語句 查詢?nèi)繑?shù)據(jù)
cursor.execute("SELECT * FROM users")
# 獲取查詢結(jié)果 此時(shí)獲取全部數(shù)據(jù)
rows = cursor.fetchall()
# 獲取查詢結(jié)果 此時(shí)獲取第一條數(shù)據(jù)
# rows = cursor.fetchone()
# 獲取查詢結(jié)果 此時(shí)獲取多條數(shù)據(jù)
# rows = cursor.fetchmany(2)
# 打印結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
coon.close()
??新增數(shù)據(jù)
import pymysql
# 連接數(shù)據(jù)庫
# host表示數(shù)據(jù)庫的地址,user表示用戶名,password表示密碼,database表示數(shù)據(jù)庫名。
coon = pymysql.connect(host='localhost', user='root', password='123456', database='test', autocommit=True)
# 創(chuàng)建游標(biāo)
cursor = coon.cursor()
# 執(zhí)行SQL語句 新增數(shù)據(jù) 并返回影響行數(shù)
rows = cursor.execute('INSERT INTO user(name, age) VALUES ("小明", 20)')
# 手動(dòng)提交
# coon.commit()
# 打印結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
coon.close()
??值得注意的是,如果遇到插入數(shù)據(jù)不報(bào)錯(cuò)但是未成功插入的情況,這是因?yàn)樵贘ava中,jdbc默認(rèn)自動(dòng)幫我們提交事務(wù)。但在Python中,則需要自己手動(dòng)提交一下,有兩種解決方式:
1.在連接數(shù)據(jù)庫時(shí)加上
autocommit=True
(自動(dòng)提交事務(wù)),這種方式在執(zhí)行execute
時(shí)就會(huì)立即向數(shù)據(jù)庫發(fā)出操作請求,完成插入操作2.在進(jìn)行數(shù)據(jù)庫的增刪改操作時(shí),需要在具體操作后添加
commit()
函數(shù),手動(dòng)提交事務(wù),保證在執(zhí)行操作的時(shí)候,能立刻向數(shù)據(jù)庫發(fā)送請求。
??修改數(shù)據(jù)
import pymysql
# 連接數(shù)據(jù)庫
# host表示數(shù)據(jù)庫的地址,user表示用戶名,password表示密碼,database表示數(shù)據(jù)庫名。
coon = pymysql.connect(host='localhost', user='root', password='123456', database='tset', autocommit=True)
# 創(chuàng)建游標(biāo)
cursor = coon.cursor()
# 執(zhí)行SQL語句 新增數(shù)據(jù) 并返回影響行數(shù)
rows = cursor.execute('UPDATE user SET age=25 WHERE name="張三"')
# 手動(dòng)提交
# coon.commit()
# 打印結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
coon.close()
??刪除數(shù)據(jù)
import pymysql
# 連接數(shù)據(jù)庫
# host表示數(shù)據(jù)庫的地址,user表示用戶名,password表示密碼,database表示數(shù)據(jù)庫名。
coon = pymysql.connect(host='localhost', user='root', password='123456', database='test', autocommit=True)
# 創(chuàng)建游標(biāo)
cursor = coon.cursor()
# 執(zhí)行SQL語句 新增數(shù)據(jù) 并返回影響行數(shù)
rows = cursor.execute('DELETE FROM user WHERE name="張麗"')
# 手動(dòng)提交
# coon.commit()
# 打印結(jié)果
print(rows)
# 關(guān)閉游標(biāo)和連接
cursor.close()
coon.close()
以上就是基于Python對MySQL數(shù)據(jù)庫的一些基本操作,在編寫代碼的同時(shí),需要注意數(shù)據(jù)庫連接的信息是否有誤,SQL語句是否正確,以及使用方法是否規(guī)范,以保證在運(yùn)行時(shí),不會(huì)出錯(cuò)。當(dāng)然,遇到錯(cuò)誤時(shí),應(yīng)及時(shí)尋找錯(cuò)誤并糾正,保證程序可執(zhí)行性。
??封裝數(shù)據(jù)庫操作
在實(shí)際開發(fā)當(dāng)中,我們并不是每一次連接數(shù)據(jù)庫都需要單獨(dú)再創(chuàng)建一個(gè)新的文件,然后一次又一次反復(fù)的配置和具體操作,這樣做無疑加大了業(yè)務(wù)工作量,同時(shí)也降低了代碼的可維護(hù)性和安全性,所以,通常,我們都是單獨(dú)把數(shù)據(jù)庫操作封裝成一個(gè)類,需要使用的時(shí)候,只需要調(diào)用這個(gè)類就可以實(shí)現(xiàn)具體操作,并且,封裝數(shù)據(jù)庫操作可以將數(shù)據(jù)庫操作相關(guān)的代碼集中在一起,便于閱讀和維護(hù),將常用的數(shù)據(jù)庫操作封裝成函數(shù),可以在多個(gè)地方復(fù)用,避免重復(fù)編寫相同的代碼,同時(shí),我們可以根據(jù)需要修改數(shù)據(jù)庫操作的實(shí)現(xiàn),而不需要修改調(diào)用方的代碼,又避免了直接操作數(shù)據(jù)庫,減少了出錯(cuò)的可能性,提高了代碼的安全性。
# 簡單封裝
# 導(dǎo)入第三方庫
import pymysql
#連接數(shù)據(jù)庫
conn = pymysql.connect(host='localhost', user='root', password='123456', database='test')
# 創(chuàng)建游標(biāo)對象
cursor = conn.cursor()
# 定義數(shù)據(jù)庫操作函數(shù)
# 添加數(shù)據(jù)
def add_user(name, age):
#具體SQL語句可根據(jù)自己實(shí)際需求編寫
sql = "INSERT INTO users(name, age) VALUES (%s, %s)"
cursor.execute(sql, (name, age))
#提交事務(wù)
conn.commit()
# 修改數(shù)據(jù)
def update_user(name, age):
#具體SQL語句可根據(jù)自己實(shí)際需求編寫
sql = "UPDATE users SET age=%s WHERE name=%s"
cursor.execute(sql, (age, name))
#提交事務(wù)
conn.commit()
# 刪除數(shù)據(jù)
def delete_user(name):
#具體SQL語句可根據(jù)自己實(shí)際需求編寫
sql = "DELETE FROM users WHERE name=%s"
cursor.execute(sql, (name,))
#提交事務(wù)
conn.commit()
# 查詢數(shù)據(jù)
def query_user():
#具體SQL語句可根據(jù)自己實(shí)際需求編寫
sql = "SELECT * FROM users"
cursor.execute(sql)
result = cursor.fetchall()
return result
# 調(diào)用數(shù)據(jù)庫操作函數(shù)
add_user('Tom', 20)
update_user('Tom', 21)
delete_user('Tom')
result = query_user()
#關(guān)閉游標(biāo)和連接
cursor.close()
conn.close()
上述代碼只是一個(gè)簡單的封裝,具體封裝步驟要根據(jù)自己的業(yè)務(wù)實(shí)現(xiàn)邏輯進(jìn)行設(shè)計(jì),同時(shí)也只是提供封裝的思路,供小伙伴們學(xué)習(xí)和參考。將數(shù)據(jù)庫的具體操作操作封裝成一個(gè)類的話,又比上述代碼復(fù)雜一點(diǎn),但實(shí)際運(yùn)用也更為廣泛,同時(shí),也進(jìn)一步簡化了對數(shù)據(jù)庫的具體操作,只需要用到的時(shí)候調(diào)用即可。
??總結(jié)
以上就是Python數(shù)據(jù)庫編程的基本操作,對數(shù)據(jù)庫的操作在實(shí)際開發(fā)過程中也很常用,所以,希望小伙伴們在看完文章后,能夠掌握Python連接以及操作MySQL數(shù)據(jù)庫的方法,在實(shí)際應(yīng)用場景中,根據(jù)自己業(yè)務(wù)需要,對數(shù)據(jù)庫操作進(jìn)行具體設(shè)計(jì),對數(shù)據(jù)庫操作進(jìn)行封裝,提高代碼的可讀性、可維護(hù)性、復(fù)用性和安全性。同時(shí),注意連接數(shù)據(jù)庫時(shí)要指定正確的數(shù)據(jù)庫地址、用戶名、密碼和數(shù)據(jù)庫名;執(zhí)行SQL語句時(shí)要注意SQL語句的正確性;獲取查詢結(jié)果時(shí)要注意查詢結(jié)果的類型和數(shù)量;關(guān)閉游標(biāo)和連接時(shí)要確保游標(biāo)和連接已經(jīng)正確關(guān)閉。
??覺得不錯(cuò)的話記得點(diǎn)贊收藏呀!!??文章來源:http://www.zghlxwxcb.cn/news/detail-708620.html
??別忘了給我關(guān)注~~??文章來源地址http://www.zghlxwxcb.cn/news/detail-708620.html
到了這里,關(guān)于Python——操作MySQL數(shù)據(jù)庫的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!