1. 程式人生 > >python3入門教程(二)操作數據庫一

python3入門教程(二)操作數據庫一

pri 只需要 圖片 pytho 對象 ima cdc 一行 結果

概述

  最近在準備寫一個爬蟲的練手項目,基本想法是把某新聞網站的內容分類爬取下來,保存至數據庫,再通過接口對外輸出(提供後臺查詢接口)。那麽問題就來了,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()  # 關閉連接

python3入門教程(二)操作數據庫一