python3入門教程(二)操作資料庫(一)
概述
最近在準備寫一個爬蟲的練手專案,基本想法是把某新聞網站的內容分類爬取下來,儲存至資料庫,再通過介面對外輸出(提供後臺查詢介面)。那麼問題就來了,python到底是怎麼去操作資料庫的呢?我們今天就來研究下。
準備
我這邊資料庫使用的是mysql5.7,python去操作mysql資料庫需要使用到pymysql模組。
安裝pymysql很簡單,可以使用pip,
pip install pymysql
也可以通過pycharm直接新增安裝。
使用操作
我們新建一個數據庫,名字就叫做news,我們再建立一張news表(取名字這種事情真的非常糾結),語句如下:
CREATE TABLE `news` ( `id` bigint(100) NOT NULL AUTO_INCREMENT, `title` varchar(1000) DEFAULT NULL, `url` varchar(1000) DEFAULT NULL, `hash` varchar(1000) DEFAULT NULL, `publish_time` varchar(15) DEFAULT NULL, `catagary` varchar(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
這張表設計的有些隨意,不過這不是重點,重點是我們如何利用python去操作這張表,下面我們就進入主題。
首先,我們新建python file,然後匯入我們要用到的模組
import pymysql
1.獲取資料庫連線及遊標
之前有用過資料庫的同學肯定知道,用程式碼去操作資料庫之前,肯定先要獲取連線,後續的增刪改查都是基於這個連線,當然,相應的操作完成之後,一定要記得把連線關閉,不然會造成一些不好的後果。
python獲取資料庫連線程式碼如下:
import pymysql
# 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
執行之後輸出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001D359180B00>
Process finished with exit code 0
顯然,我們已經成功獲取到了一個連線,當然要執行sql語句,我們好需要獲取一個遊標物件,
import pymysql
# 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 獲取操作sql的遊標物件(這樣寫預設返回的資料型別是元組,我們下面會有介紹)
cursor = conn.cursor()
print(cursor)
執行之後輸出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x0000025F14470B70>
<pymysql.cursors.Cursor object at 0x0000025F14AC8E10>
Process finished with exit code 0
遊標物件已經成功拿到了
2.新增資料
import pymysql # 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式) conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8') print(conn) # 獲取操作sql的遊標物件 cursor = conn.cursor() print(cursor) # 新增一條資料 insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)' row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 引數為元組型別 print(row) print(cursor.lastrowid) # 獲取最後一次自增的ID
執行上面的程式碼,輸出結果如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x0000023455416358>
<pymysql.cursors.Cursor object at 0x00000234559F8E10>
1
2
Process finished with exit code 0
從輸出結果可以看出,似乎已經插入成功了,我們取資料庫看一下,結果是令人失望的,資料庫沒有,什麼情況呢?
原因其實很簡單,我們沒有做commit操作,我們把commit加上,再試下
import pymysql
# 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 獲取操作sql的遊標物件
cursor = conn.cursor()
print(cursor)
# 新增一條資料
insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)' # 使用pymysql的引數化語句防止SQL注入
# 返回受影響的行數
row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 引數為元組型別
print(row)
print(cursor.lastrowid) # 獲取最後一次自增的ID
conn.commit() # 提交資料
cursor.close() # 關閉遊標
conn.close() # 關閉連線
下面我們再執行下,輸出如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py
<pymysql.connections.Connection object at 0x000001D60F605630>
<pymysql.cursors.Cursor object at 0x000001D60FD88E80>
1
3
Process finished with exit code 0
我們查一下資料庫,這下就有了,插入成功了。
當然也可以批量插入,使用executemany
import pymysql
# 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 獲取操作sql的遊標物件
cursor = conn.cursor()
print(cursor)
# 新增一條資料
insert_sql = 'insert into news(title, url, hash, publish_time, catagary) values(%s, %s, %s, %s, %s)' # 使用pymysql的引數化語句防止SQL注入
# 返回受影響的行數
#row = cursor.execute(insert_sql, ('百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')) # 引數為元組型別
#print(row)
#print(cursor.lastrowid) # 獲取最後一次自增的ID
# 新增多條資料
row = cursor.executemany(insert_sql, [('百度1', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),
('百度2', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),
('百度3', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0')])
print(row)
conn.commit() # 提交資料
cursor.close() # 關閉遊標
conn.close() # 關閉連線
執行上面的指令碼,輸出結果如下:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py <pymysql.connections.Connection object at 0x000001A454EF5630> <pymysql.cursors.Cursor object at 0x000001A455678E48> 3 Process finished with exit code 0
查詢資料庫,如下:
批量插入成功。
3.查詢資料
前面插入資料成功了,我們研究下怎麼查詢
import pymysql # 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式) conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8') print(conn) # 獲取操作sql的遊標物件 cursor = conn.cursor() print(cursor) query_sql = 'select * from news where id = %s' row = cursor.execute(query_sql, (3,)) print(row) # 查詢到的行數 print(cursor.fetchall()) # fetchall:獲取所有行的資訊 fetchone:獲取結果集中第一行的資料 fetchmany:獲取結果集中的多行 conn.commit() # 提交資料 cursor.close() # 關閉遊標 conn.close() # 關閉連線
執行上面的查詢,輸出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py <pymysql.connections.Connection object at 0x000001C5D9107320> <pymysql.cursors.Cursor object at 0x000001C5D9748EF0> 1 ((3, '百度', 'http://www.baidu.com', '1qaz2wsx', '2018-11-02', '0'),) Process finished with exit code 0
從輸出結果我們可以看到,最後拿到的結果集是一個元組型別,那假如我們想要的是字典型別呢?
我們只需要在初始化遊標的時候,稍微設定一下
cursor = conn.cursor(pymysql.cursors.DictCursor)
我們加上再試下,
import pymysql
# 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式)
conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8')
print(conn)
# 獲取操作sql的遊標物件
cursor = conn.cursor(pymysql.cursors.DictCursor)
print(cursor)
query_sql = 'select * from news where id = %s'
row = cursor.execute(query_sql, (3,))
print(row) # 查詢到的行數
print(cursor.fetchall()) # fetchall:獲取所有行的資訊 fetchone:獲取結果集中第一行的資料 fetchmany:獲取結果集中的多行
conn.commit() # 提交資料
cursor.close() # 關閉遊標
conn.close() # 關閉連線
執行之後輸出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py <pymysql.connections.Connection object at 0x000002A433136358> <pymysql.cursors.DictCursor object at 0x000002A433778E48> 1 [{'id': 3, 'title': '百度', 'url': 'http://www.baidu.com', 'hash': '1qaz2wsx', 'publish_time': '2018-11-02', 'catagary': '0'}] Process finished with exit code 0
可以看到,結果集的資料型別變了,這樣比較方面去處理具體的資料內容。
4.更新資料
import pymysql # 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式) conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8') print(conn) # 獲取操作sql的遊標物件 cursor = conn.cursor(pymysql.cursors.DictCursor) print(cursor) update_sql = 'update news set title = %s where id = %s' row_upd = cursor.execute(update_sql, ('百度Updata', 3)) # 也可使用executemany實現批量更新 print(row_upd) query_sql = 'select * from news where id = %s' row = cursor.execute(query_sql, (3,)) print(row) # 查詢到的行數 print(cursor.fetchall()) # fetchall:獲取所有行的資訊 fetchone:獲取結果集中第一行的資料 fetchmany:獲取結果集中的多行 conn.commit() # 提交資料 cursor.close() # 關閉遊標 conn.close() # 關閉連線
我們更新id=3的那條資料的標題,執行上面的程式碼,輸出:
E:\pythonsource\venv\Scripts\python.exe E:/pythonsource/study/pymysqldemo.py <pymysql.connections.Connection object at 0x000001FCDBB36390> <pymysql.cursors.DictCursor object at 0x000001FCDC158EB8> 1 1 [{'id': 3, 'title': '百度Updata', 'url': 'http://www.baidu.com', 'hash': '1qaz2wsx', 'publish_time': '2018-11-02', 'catagary': '0'}] Process finished with exit code 0
更新成功。
5.刪除資料
刪除資料其實更上面的更新差不多,只是sql不一樣。
import pymysql # 獲取連線 引數(資料庫IP,埠,使用者名稱,密碼,資料庫名稱,編碼格式) conn = pymysql.connect(host='127.0.0.1', port=3306,user='root', passwd='123456', db='news', charset='utf8') print(conn) # 獲取操作sql的遊標物件 cursor = conn.cursor(pymysql.cursors.DictCursor) print(cursor) delete_sql = 'delete from news where id=%s' row_delete = cursor.execute(delete_sql, (3,)) # 也可以使用executemany實現批量刪除 query_sql = 'select * from news where id = %s' row = cursor.execute(query_sql, (3,)) print(row) # 查詢到的行數 print(cursor.fetchall()) # fetchall:獲取所有行的資訊 fetchone:獲取結果集中第一行的資料 fetchmany:獲取結果集中的多行 conn.commit() # 提交資料 cursor.close() # 關閉遊標 conn.close() # 關閉連線