在學(xué)習(xí)的過(guò)程中總免不了需要使用大量的數(shù)據(jù)节芥。而這些數(shù)據(jù)一般都存在數(shù)據(jù)庫(kù)中,當(dāng)需要使用的時(shí)候就可以通過(guò)連接數(shù)據(jù)庫(kù)進(jìn)行增刪改查等操作宛官。
而數(shù)據(jù)庫(kù)又可以分為關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)迹缀。關(guān)系型數(shù)據(jù)庫(kù)中常見(jiàn)的有mysql,oracle等种远。非關(guān)系型數(shù)據(jù)庫(kù)有MongoDB等涩澡。相信在學(xué)習(xí)爬蟲(chóng)的過(guò)程中對(duì)MongoDB的基本使用都已經(jīng)了解了。那今天看一下mysql的基本使用方法坠敷。
python與mysql的橋梁
python是非常不錯(cuò)的"兩門(mén)語(yǔ)言"妙同,所以在py2和py3中使用的連接mysql的模塊有點(diǎn)變化;py2中一般使用MySqldb來(lái)調(diào)用Mysql膝迎,但是在py3中不支持該包粥帚,則使用pymysql來(lái)代替了。
現(xiàn)在python的版本都到3.7了限次,所以還是老老實(shí)實(shí)的使用pymysql吧芒涡。安裝pymysql非常簡(jiǎn)單,只需要pip一下就可以了
pymysql的簡(jiǎn)單操作
數(shù)據(jù)庫(kù)的連接卖漫,基本操作增刪改查费尽,還有事務(wù)處理的能力可以說(shuō)是程序員的基本功。所以從這幾個(gè)方面入手羊始,了解一下pymysql旱幼。
1.連接
連接非常簡(jiǎn)單只需要使用pymysql的connect方法就可以了。
例如:
import pymysql
connection = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456',
database='test',
charset='utf8')
host為數(shù)據(jù)庫(kù)的主機(jī)IP地址突委,port為MySQL的默認(rèn)端口號(hào)柏卤,user為數(shù)據(jù)的用戶名冬三,password為數(shù)據(jù)庫(kù)的登錄密碼,db為數(shù)據(jù)庫(kù)的名稱(chēng)缘缚。
注意:charset="utf8",中間沒(méi)有空格勾笆,因?yàn)閙ySql不支持
看到?jīng)]有password=‘123456’
,這就是前段時(shí)間華住脫庫(kù)的元兇忙灼。當(dāng)然我們只是在本機(jī)測(cè)試匠襟,123456就123456吧钝侠,誰(shuí)叫它簡(jiǎn)單又好記呢该园。
2.MySQL的游標(biāo)
在開(kāi)始操作mysql之前,先介紹一下MySQL的游標(biāo)(cursor)帅韧。它是mysql中一個(gè)重要的概念里初,它有幾個(gè)特性:
- 有數(shù)據(jù)緩沖的思想:游標(biāo)的設(shè)計(jì)是一種數(shù)據(jù)緩沖區(qū)的思想,用來(lái)存放SQL語(yǔ)句執(zhí)行的結(jié)果忽舟。
- 有數(shù)據(jù)基礎(chǔ):游標(biāo)是在先從數(shù)據(jù)表中檢索出數(shù)據(jù)之后才能繼續(xù)靈活操作的技術(shù)双妨。
- 類(lèi)似于指針:游標(biāo)類(lèi)似于指向數(shù)據(jù)結(jié)構(gòu)堆棧中的指針,用來(lái)pop出所指向的數(shù)據(jù)叮阅,并且只能每次取一個(gè)刁品。
上面看讀懂沒(méi)關(guān)系『评眩總的來(lái)說(shuō)挑随,想要操作數(shù)據(jù)庫(kù),就先要拿到游標(biāo)勒叠,具體獲取方法兜挨,參考下面的例子。
假設(shè)接下來(lái)的例子都是建立在數(shù)據(jù)庫(kù)中已經(jīng)新建好的user
表的基礎(chǔ)上運(yùn)行的:
CREATE TABLE `user` (
`id` varchar(20) NOT NULL,
`name` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.增加
使用insert來(lái)將數(shù)據(jù)插入數(shù)據(jù)庫(kù)
import pymysql
connection = pymysql.connect(
port=3306,
user='root',
password='123456',
database='test')
cursor = connection.cursor() # 獲取cursor
cursor.execute('INSERT INTO USER(name, id) VALUES (%s, %s);',['DonLex', 1]) # 執(zhí)行sql語(yǔ)句
connection.close()# 關(guān)閉數(shù)據(jù)連接
可以看到眯分,cursor的獲取非常簡(jiǎn)單拌汇。執(zhí)行sql語(yǔ)句也是易于理解的。
最后一定不要忘記了使用close()
關(guān)閉數(shù)據(jù)連接弊决。
4.刪除
有一句話:“從刪庫(kù)到跑路”噪舀;可見(jiàn)刪除數(shù)據(jù)是一件非常危險(xiǎn)的操作。而一般做這些危險(xiǎn)操作飘诗,都需要添加事務(wù)与倡,這里為了簡(jiǎn)單,就不添加事務(wù)了疚察。
import pymysql
connection = pymysql.connect(
port=3306,
user='root',
password='123456',
database='test')
cursor = connection.cursor() # 獲取cursor
sql = "DELETE FROM USER WHERE id=%s;" #使用%s進(jìn)行占位
cursor.execute(sql, [0])
connection.close()# 關(guān)閉數(shù)據(jù)連接
5.修改
使用update來(lái)修改蒸走,通過(guò)set設(shè)置新的值,where代表選擇條件
import pymysql
connection = pymysql.connect(
port=3306,
user='root',
password='123456',
database='test')
cursor = connection.cursor() # 獲取cursor
# 修改數(shù)據(jù)的SQL語(yǔ)句
sql = "UPDATE USER SET id=%s WHERE name=%s;"
id = 0
name = "DonLex"
# 執(zhí)行SQL語(yǔ)句
cursor.execute(sql, [id, name])
connection.close()# 關(guān)閉數(shù)據(jù)連接
6.查詢
查詢則使用select來(lái)選擇貌嫡,from后面跟著表名比驻,where是選擇條件
import pymysql
connection = pymysql.connect(
port=3306,
user='root',
password='123456',
database='test')
cursor = connection.cursor() # 獲取cursor
cursor.execute('select * from user where id = %s', ('0',)) # 執(zhí)行sql語(yǔ)句
values = cursor.fetchone() # 獲取單條數(shù)據(jù)
print(values)
connection.close()# 關(guān)閉數(shù)據(jù)連接
獲取單條數(shù)據(jù)使用fecthone()
;當(dāng)獲取多條數(shù)據(jù)時(shí)该溯,則需要使用fecthall()
:
#查詢數(shù)據(jù)庫(kù)多條數(shù)據(jù)
result = cursor.fetchall()
for data in result:
print(data)
7.事務(wù)
終于到數(shù)據(jù)庫(kù)的重量級(jí)內(nèi)容了。查了一下别惦,關(guān)于事務(wù)的定義如下:
事務(wù)就是一組原子性的SQL查詢狈茉,或者說(shuō)一個(gè)獨(dú)立的工作單元。如果數(shù)據(jù)庫(kù)引擎能夠成功地對(duì)數(shù)據(jù)應(yīng)用該組查詢的全部語(yǔ)句掸掸,那么久執(zhí)行該組查詢氯庆。如果其中任何一條語(yǔ)句因?yàn)楸罎⒒蚱渌驘o(wú)法執(zhí)行,那么所有語(yǔ)句都不會(huì)執(zhí)行扰付。也就是說(shuō)堤撵,事務(wù)內(nèi)的語(yǔ)句,要么全部執(zhí)行成功羽莺,要么全部執(zhí)行失敗实昨。
事務(wù)的四大特性(ACID):
- 原子性(atomicity)
- 一致性(consistency)
- 隔離性(isolation)
- 持久性(durability)
實(shí)現(xiàn)代碼
import pymysql
connection = pymysql.connect(
port=3306,
user='root',
password='123456',
database='test')
cursor = connection.cursor()
sql = "DELETE FROM USER WHERE id=%s;"
try:
cursor.execute(sql, [1])
# 提交事務(wù)
connection.commit()
except Exception as e:
# 有異常,回滾事務(wù)
connection.rollback()
connection.close()
從上面的代碼中可以看到盐固,execute()
執(zhí)行刪除操作使用try...except
包起來(lái)了荒给。如果在執(zhí)行try
的部分出錯(cuò)的話,就回滾刁卜,否則就提交事務(wù)志电。
更多精彩內(nèi)容,敬請(qǐng)關(guān)注微信公眾號(hào):Python綠洲