今天在寫爬蟲時(shí)候狂魔,爬完數(shù)據(jù)進(jìn)行保存時(shí)候,不知道選擇何種數(shù)據(jù)庫以及如何操作淫痰,在網(wǎng)上找了一堆資料最楷,結(jié)合自己需要,寫下這邊日記,方便后面自己回想籽孙,這里推薦一個(gè)博主寫的烈评,個(gè)人比較完善,有興趣的可以去學(xué)習(xí)一波
http://www.reibang.com/p/4e72faebd27f
數(shù)據(jù)庫選擇
目前犯建,數(shù)據(jù)庫主要有兩種形式讲冠,一種是非關(guān)系型數(shù)據(jù)庫,另一種是關(guān)系型數(shù)據(jù)庫适瓦。目前竿开,我們用得非常廣泛的一種數(shù)據(jù)庫類型是關(guān)系型數(shù)據(jù)庫,它可以分為以下幾種:
Oracle:
付費(fèi)產(chǎn)品玻熙,主要是銀行在用(萬一出錯(cuò)了有Oracle背鍋)
SQL Sever:
付費(fèi)產(chǎn)品否彩,微軟產(chǎn)品,windows專用
PostgreSQL:
免費(fèi)產(chǎn)品嗦随,主要是高校學(xué)術(shù)上使用
MySQL:
大眾列荔,免費(fèi),開源枚尼,不過現(xiàn)在被Oracle 收購了贴浙,以后不知道會(huì)不會(huì)收費(fèi),趁著現(xiàn)在免費(fèi)先用著吧
術(shù)語
數(shù)據(jù)庫: 數(shù)據(jù)庫是一些關(guān)聯(lián)表的集合姑原。
數(shù)據(jù)表: 表是數(shù)據(jù)的矩陣悬而。在一個(gè)數(shù)據(jù)庫中的表看起來像一個(gè)簡單的電子表格。
列: 一列(數(shù)據(jù)元素) 包含了相同類型的數(shù)據(jù), 例如郵政編碼的數(shù)據(jù)锭汛。
行:一行(=元組,或記錄)是一組相關(guān)的數(shù)據(jù)袭蝗,例如一條用戶訂閱的數(shù)據(jù)唤殴。
冗余:存儲(chǔ)兩倍數(shù)據(jù),冗余降低了性能到腥,但提高了數(shù)據(jù)的安全性朵逝。
主鍵:主鍵是唯一的。一個(gè)數(shù)據(jù)表中只能包含一個(gè)主鍵乡范。你可以使用主鍵來查詢數(shù)據(jù)配名。
外鍵:外鍵用于關(guān)聯(lián)兩個(gè)表。
復(fù)合鍵:復(fù)合鍵(組合鍵)將多個(gè)列作為一個(gè)索引鍵晋辆,一般用于復(fù)合索引渠脉。
索引:使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)瓶佳。類似于書籍的目錄芋膘。
MySQL 安裝
這里不再贅述,網(wǎng)上資料很多,這里給個(gè)鏈接为朋,可以去學(xué)習(xí):https://www.runoob.com/mysql/mysql-install.html
Python 連接
驅(qū)動(dòng)安裝
目前臂拓,關(guān)于Python操作數(shù)據(jù)庫主要有以下幾種方法,通過模塊調(diào)用:
MySQLdb的使用
MySQLdb是用于Python連接MySQL數(shù)據(jù)庫的接口习寸,它實(shí)現(xiàn)了Python數(shù)據(jù)庫API規(guī)范V2.0胶惰,基于MySQL C API上建立的,目前只支持Python2.x霞溪。
PyMySQL的使用
PyMySQL是Python中用于連接MySQL服務(wù)器的一個(gè)庫孵滞,它支持Python3.x,是一個(gè)純Python寫的MySQL客戶端威鹿,它的目標(biāo)是替代MySQLdb剃斧。PyMySQL在MIT許可下發(fā)布。
mysql.connector
由于 MySQL 服務(wù)器以獨(dú)立的進(jìn)程運(yùn)行忽你,并通過網(wǎng)絡(luò)對(duì)外服務(wù)幼东,所以,需要支持 Python 的 MySQL 驅(qū)動(dòng)來連接到 MySQL 服務(wù)器科雳。
目前根蟹,有兩個(gè) MySQL 驅(qū)動(dòng):
mysql-connector-python:是 MySQL 官方的純 Python 驅(qū)動(dòng)
mysql-connector :不建議這個(gè),8.0以下會(huì)提示“authentication plugin 'calling_sha2_password' is not supported”
SQLAlchem
是一種ORM(Object-Relational Mapping)框架糟秘,將關(guān)系數(shù)據(jù)庫的表結(jié)構(gòu)映射到對(duì)象上简逮,隱藏了數(shù)據(jù)庫操作背后的細(xì)節(jié),簡化了數(shù)據(jù)操作尿赚。
數(shù)據(jù)庫連接
import mysql.connector # 導(dǎo)包
#連接數(shù)據(jù)庫
mydb = mysql.connector.connect(
host="localhost",
user="root",
passwd="Pass1234",
database="cnblog"
)
mycursor = mydb.cursor() #游標(biāo)
# 檢查一個(gè)表是否存在
def tableExists(mycursor, name):
stmt = "SHOW TABLES LIKE '"+name+"'"
mycursor.execute(stmt)
return mycursor.fetchone()
# 刪除一個(gè)表(無論它是否已經(jīng)存在)
def dropTable(mycursor, name):
stmt = "DROP TABLE IF EXISTS "+name
mycursor.execute(stmt)
# buffered=True 不設(shè)的話散庶,查詢結(jié)果沒有讀完會(huì)報(bào)錯(cuò)
# raise errors.InternalError("Unread result found")
mycursor = mydb.cursor(buffered=True)
# 刪除臨時(shí)表
tableName = 'tmp'
dropTable(mycursor, tableName)
# 創(chuàng)建一個(gè)表
mycursor.execute("CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,\
name VARCHAR(255), address VARCHAR(255), \
sex VARCHAR(225), age INT(10))")
增、刪凌净、查悲龟、改
1增 (用的是"INSERT INTO"語句)
# 往表里插入一條記錄
sql="INSERT INTO user (name,address,sex,age) VALUES(%s, %s,%s,%s)"
val = ("xiaoming", "beijing","M",23)
mycursor.execute(sql, val) # 這里
# 往表里插入多條記錄
val=[("xiaolan","shanghai","M",35),
("xinyi","hefei","M",28),
("jide","nanjing","F",30)
]
mycursor.executemany(sql, val) # many
# 提交
mydb.commit()
2刪 DELETE
包含兩部分 ,刪除表格和刪除表記錄
#刪除名字為xiaoming的表記錄
sql="DELETE FROM user WHERE name='xiaoming'"
mycursor.execute(sql)
mydb.commit()
# 刪除表格
sql= "DROP TABLE IF EXISTS user"
mycursor.execute(sql)
mydb.commit()
3查 SELECT
這是用的最多的功能冰寻,包含普通查詢须教、條件查詢、聚合查詢等
例如:
#查詢這里面所有的人:
sql="SELECT * FROM user"
mycursor.execute(sql)
myresult = mycursor.fetchall() # fetchall()表示的是獲得所有記錄斩芭;fetchone()表示只獲取一條數(shù)據(jù)轻腺;fetchmany(size=2)表示獲取兩條記錄
for x in myresult:
print(x)
# 條件查詢WHERE
sql="SELECT * FROM user WHERE age > 30"
mycursor.execute(sql)
myresult = mycursor.fetchall() # fetchall() 獲取所有記錄
for x in myresult:
print(x)
# 模糊搜索查詢 LIKE
#%代表零個(gè)、一個(gè)或者多個(gè)數(shù)字或字符
#_代表一個(gè)單一的數(shù)字或者字符
sql = "SELECT * FROM user WHERE name LIKE '%t%'"
mycursor.execute(sql)
myresult=mycursor.fetchall()
for x in myresult:
print(x)
# 限制性排序查詢 LIMIT
#找出其中年齡最大的3個(gè)人
sql = "SELECT * FROM user ORDER BY age DESC LIMIT 3"
mycursor.execute(sql)
myresult=mycursor.fetchall()
for x in myresult:
print(x)
4修改表記錄 UPDATE
# 將xiaoming改為huiyuanai
sql="UPDATE customers SET name='huiyuanai' WHERE name ='xiaoming'"
mycursor.execute(sql)
mydb.commit()
本文介紹了Python+MySQL的基本操作划乖,包括如何創(chuàng)建連接以及對(duì)數(shù)據(jù)庫進(jìn)行增刪改查等操作贬养。但是,本文涉及到的只是對(duì)單表進(jìn)行操作迁筛,只是數(shù)據(jù)庫操作的冰山一角煤蚌;在實(shí)際的開發(fā)和工作環(huán)境中耕挨,需要根據(jù)實(shí)際內(nèi)容對(duì)多表進(jìn)行操作.