Python 使用 Pymysql 套件來在 Python 中執行資料庫 (for windows)

內容說明

寫程式如果需要讀取大量資料或抓取資料時,使用資料庫是在好不過的選擇了!這裡就來說說 MySQL 應用在 Python 的教學八!

此文章只針對 Windows OS,沒有對 Linux 進行解說,未來有機會會寫一篇

MySQL 語法連結

安裝 MySQL

沒有資料庫,你要怎麼應用資料庫XD。

下載 MySQL (for windows)

這裡的下載 MySQL 以 Windows 為主,如果想要知道 Linux 的使用方法話,就去看其他文章吧!作者目前還沒遇到此問題www,相信以後就會碰到QQ。

從這裡 下載 MySQL後,點選此下載

下載後,在點擊下方的 No thanks, just start my download. 後則立即下載。

  • 開啟安裝檔後,點 Developer Default,之後點選 Next

  • 接下來設定 MySQL 的資料庫帳號,必須設置,無法跳過

  • 設置完成後接下來則需要登入帳密檢查

  • 之後點擊灰色方塊即可,並輸入帳號密碼即可

建立 MySQL 資料庫

  • 登入成功並進去後,點擊資料庫圖示,建立資料庫,改成自己想要的名子、並將 Charset 改成 UTF-8,並點選右下角的 Apply 建立資料庫,並一直點擊 apply、Finish 就可以建立成功。

  • 接下來找到 Schemas 點擊

  • 點擊 table(1),再來點 table 右鍵為新增資料表(英文為 create table),新增資料庫欄位(2),完成後點擊 Apply(3)
    注意:新增資料庫欄位(2),Primary key 一定要對 PK、NN 打勾。

    MySQL pk、nn、qu、b、un、zf、ai、g 的意思

  • PK primary key 主键

  • NN not null 欄位不可為空

  • UQ unique 唯一索引

  • BIN binary 二進位資料,比 text 更大的二進位資料

  • UN unsigned 沒有正負符號

  • ZF zero fill 將剩餘的位數填 0,舉例: int(4) 內容顯現為 0001

  • AI auto increment 自增

  • G generated column 生成列

  • \g 等同於 MySQL 中的 “;”

  • \G 等同於將資料轉向,舉例:縱向資料表轉變成橫向資料表

在 Python 操作 MySQL

MySQL 建置完成後,透過 Python 進行操作。

安裝套件

  • 在 cmd 安裝 pip install pymysql

測試資料庫

如果下方程式碼成功印出連線成功,就表示資料庫連線成功了!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

db_settings = {
"host" : "127.0.0.1",
"port" : 3306,
"user" : "資料庫管理員帳號" ,
"password" : "資料庫管理員密碼" ,
"db" : "demo" , # 根據你的資料庫名稱
"charset" : "utf8" 
}
conn = pymysql.connect(**db_settings)

try:
# 建立Connection物件
conn = pymysql.connect(**db_settings)
print("連線成功")

with conn.cursor() as cursor:
#稍微注意一下 with statement 完成後,會自動關閉資料庫的連線操作,詳請需要 with 指令
#資料表相關操作

except Exception as ex: # 出現意外時印出
print(ex)

新增資料

檢查 MySQL Workbench 如果成功有出現一筆資料則表示成功!

應該會出現如下:

P.S. 需要點擊 MySQL 指令的閃電,才會重新執行指令呦!位置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import pymysql

db_settings = {
"host" : "127.0.0.1",
"port" : 3306,
"user" : "資料庫管理員帳號" ,
"password" : "資料庫管理員密碼" ,
"db" : "demo" ,
"charset" : "utf8"
}
conn = pymysql.connect(**db_settings)

try:
with conn.cursor() as cursor:
command = f"INSERT INTO class(id,name) VALUES (%s,%s)"
# 需要特別注意,我們要新增的值,並不是根據資料庫的類型,而是要能夠符合 Python String 要求
# 於是全部的值都設定成 %s
cursor.execute(command,("1","science")) #後面則是我們 %s 要傳給 MySQL 的值
# 記住: 一定要用小括號包住,即使是只有傳回一個值也是如此,語法規定。
print("新增資料完成")
conn.commit() #這是最重要的,如果沒有儲存變更,則 Py 會一直操作 MySQL 不會退出
# 而導致 MySQL 被占用,而無法被其他程式呼叫或使用
except Exception as ex:
print(ex)

查詢資料

剛剛已經新增過資料,那現在我們來測試查詢資料,我們透過 Primary key 來查詢!

查詢的 id = ‘1’,應該要傳回的值如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

db_settings = {
"host" : "127.0.0.1",
"port" : 3306,
"user" : "資料庫管理員帳號" ,
"password" : "資料庫管理員密碼" ,
"db" : "demo" ,
"charset" : "utf8"
}
conn = pymysql.connect(**db_settings)

try:
with conn.cursor() as cursor:
command = f"select * from class where id = %s"
cursor.execute(command,("1"))
print("查詢資料完成")
results = cursor.fetchall() #傳回資料,P.S. 這裡會傳回全部的資料,並使用 tuple 包裝
print(results[0]) #傳回的那行會用 tuple 包裝
conn.commit() #這是最重要的,如果沒有儲存變更,則 Py 會一直操作 MySQL 不會退出
# 而導致 MySQL 被占用,而無法被其他程式呼叫或使用
except Exception as ex:
print(ex)

修改資料

剛剛也成功查詢了,現在我們來修改吧!應該要能夠出來以下的值才表示成功:

P.S. 記住要重新執行一次查詢指令XD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

db_settings = {
"host" : "127.0.0.1",
"port" : 3306,
"user" : "root" ,
"password" : "1234" ,
"db" : "demo" ,
"charset" : "utf8"
}
conn = pymysql.connect(**db_settings)

try:
with conn.cursor() as cursor:
command = f"update class set name= %s where id = %s"
# 需要特別注意,我們要新增的值,並不是根據資料庫的類型,而是要能夠符合 Python String 要求
# 於是全部的值都設定成 %s
cursor.execute(command,("math","1")) #後面則是我們 %s 要傳給 MySQL 的值
# 記住: 一定要用小括號包住,即使是只有傳回一個值也是如此,語法規定。
print("修改資料完成")
conn.commit() #這是最重要的,如果沒有儲存變更,則 Py 會一直操作 MySQL 不會退出
except Exception as ex:
print(ex)

刪除資料

修改完資料後,接下來就是刪除資料拉。刪除資料後資料庫應該要為空,如下:

記住也要重新執行查詢指令XD。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pymysql

db_settings = {
"host" : "127.0.0.1",
"port" : 3306,
"user" : "root" ,
"password" : "1234" ,
"db" : "demo" ,
"charset" : "utf8"
}
conn = pymysql.connect(**db_settings)

try:
with conn.cursor() as cursor:
command = f"delete from class where id =%s"
# 需要特別注意,我們要新增的值,並不是根據資料庫的類型,而是要能夠符合 Python String 要求
# 於是全部的值都設定成 %s
cursor.execute(command,("1")) #後面則是我們 %s 要傳給 MySQL 的值
# 記住: 一定要用小括號包住,即使是只有傳回一個值也是如此,語法規定。
print("刪除資料完成")
conn.commit() #這是最重要的,如果沒有儲存變更,則 Py 會一直操作 MySQL 不會退出
except Exception as ex:
print(ex)

可能會遇到的問題

這裡收錄大衛在學習 Py MySQL 操作時一些遇到的小錯誤,如果讀者也剛好有此問題剛好能看我文章解決那就再好不過了。
Python 套件中 Pymysql 的 fetchone() 與 fetchall() 差別
MySQL 停止在 windows 上的服務

參考連結

[Python實戰應用]掌握Python連結MySQL資料庫的重要操作
mysql pk、nn、qu、b、un、zf、ai、g代表的意思
MySQL 語法連結

心得

寫教學文章真的好難…,其實我發現我寫應用的教學文章比較沒有甚麼心得感言XD,因為都是使用別人的套件,偶爾採坑上網查資料去換另外一種寫法,直到找出可以寫的方法,不得不說有了資料庫與 Python 後我的學習路上一帆風順,我不需要懂基礎知識就可以應用,但這也同時讓我感到害怕,我是不是就只學會如何找工具,並拿來放,有點像是工人,而散播套件的人則是工廠,大量產生工具給我們用。

工人永遠都不懂工具是怎麼被製造而成,但工人會不斷地應用,我覺得這似乎是一件很可怕的事情,應該要懂工具是怎麼被製作、應用,學習才有踏實感也有意義吧,不然感覺現在的我似乎還是沒有像學習演算法時那樣,了解整個套件的應用。

  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: