特別提醒:本人看博客園的消息還是比較少,如果對本文有疑問,可以發郵件到 shandongdxl2004@126.com 我看郵箱還是比較勤快的 :)
本文主要涉及:
- 遠程的MySQL環境配置
- Python連接MySQL數據庫
- 對Pymysql庫的封裝
- Python讀寫MySQL數據
系統環境:
- Windows 10 企業版 LTSC 64bit
- Python 3.6.6
- WAMP(3.0.6 32bit)集成的MySQL版本為5.7.14
1. MySQL的環境配置
如果想連接本地數據庫,必須先安裝MySQL服務。可以選擇使用官方安裝包,或者使用PHP集成環境中的數據庫都可以(windows平台上的有wamp或者phpstudy)。
我這里使用的是內網其他電腦上的MySQL數據庫,這就需要在數據庫里開啟遠程訪問。
1.1 啟用MySQL的局域網訪問
想讓局域網中的所有機器都能連接MySQL數據庫,首先要給MySQL開啟遠程連接的功能,在MySQL服務器控制台上執行MySQL命令:
1 grant all privileges on *.* to root@"%" identified by 'abc' with grant option; 2 flush privileges;
其中上面兩行代碼的意思是給從任意ip地址連接的用戶名為root,密碼為abc的用戶賦予所有的權限。其中的"%"為任意的ip地址,如果想設為特定的值也可以設定為特定的值(以通配符%的內容增加主機/IP地址,也可以直接增加IP地址)
例如:
1 grant all privileges on *.* to root@"192.168.1.1" identified by 'abc' with grant option; 2 flush privileges;
這里就是指 192.168.1.1這個IP的機器可以使用 root /abc 這個賬戶遠程訪問MySQL數據庫
PS:數據連接工具推薦使用Navicat,可以同時連接不同的數據庫,非常方便。
我常用的是11.0.16版本 下載地址 提取碼: s5kt
1.2 python環境設置
數據庫配置好之后,在python里,首先要確保已經安裝了pymysql,這里給出關鍵命令。
python -m pip install --upgrade pip python -m pip install -U pip setuptools pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip install pymysql
以上命令的含義是:
1. 更新pip
2. 更新pip的setuptools
3. 將pip的默認源設置為清華大學源
4. 安裝pymysql庫
2. MySQL連接庫函數封裝
在按照上述步驟配置了環境支持后,就可以在python使用代碼連接MySQL了。
原生的用法示例:
import pymysql # IP地址、用戶名、密碼、數據庫 db = pymysql.connect("127.0.0.1", "root", "", "test") # 使用 cursor() 方法創建一個游標對象 cursor cursor = db.cursor() # 使用 execute() 方法執行 SQL 查詢 cursor.execute("SELECT VERSION()") # 使用 fetchone() 方法獲取單條數據. data = cursor.fetchone()
# 打印獲取的單條數據 print("Database version : %s " % data)
# 執行不需要返回值的sql(更新、插入、刪除等) cursor.execute("UPDATE iplist SET ip_address='192.168.1.1' WHERE id IN('2964475','2974661','2986832');")
# 游標提交
cursor.commit()
# 關閉數據庫連接
db.close()
這里給原生的庫做了一個簡單的封裝:
import pymysql # MySQL 操作類 class MySQL: def __init__(self, host, user, pwd, db): self.host = host self.user = user self.pwd = pwd self.db = db def __GetConnect(self): """ 得到連接信息 返回: conn.cursor() """ if not self.db: raise(NameError, "沒有設置數據庫信息") self.conn = pymysql.connect( host=self.host, user=self.user, password=self.pwd, database=self.db) cur = self.conn.cursor() if not cur: raise(NameError, "連接數據庫失敗") else: # print('連接成功!') return cur def ExecQuery(self, sql): """ 執行查詢語句 返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的字段 """ cur = self.__GetConnect() cur.execute(sql) rows = cur.fetchall() resList = [] for row in rows: resList.append(list(row)) # 每一行都轉換成列表 # 查詢完畢后必須關閉連接 self.conn.close() return resList def ExecNonQuery(self, sql): """ 執行非查詢語句 調用示例: cur = self.__GetConnect() cur.execute(sql) self.conn.commit() self.conn.close() """ cur = self.__GetConnect() cur.execute(sql) self.conn.commit() # 注意如果對數據庫有修改,則必須在關閉前對游標執行commit self.conn.close()
調用示例:
mysql_conn = MySQL(host='127.0.0.1', user="root", pwd="", db="test") sql_string = "SELECT VERSION()" result = mysql_conn.ExecQuery(sql_string) print(result)
輸出為:
[['5.7.14']]
至此,數據庫連接成功!
3. Python對MySQL數據庫的 CURD
3.1 讀取MySQL數據
代碼如下:
mysql_conn = MySQL(host='127.0.0.1', user="test1", pwd="123456", db="iplist") sql_string2 = "SELECT ip_address,input_date FROM iplist WHERE id IN('2964475','2974661','2986832');" result = mysql_conn.ExecQuery(sql_string2) for line in result: print(str(line)) # 打印一行 print(str(line[0]) + '____'+str(line[1])) # 打印一行中的指定元素
結果回顯如下:
['192.168.59.101', '20220408'] 192.168.59.101____20220408 ['192.168.59.101', '20220408'] 192.168.59.101____20220408 ['192.168.59.101', '20220409'] 192.168.59.101____20220409
可以看到,如果直接打印其中一行,返回的是一個list。如果指定list的元素,那么就可以拿到它的值。
3.2 其他MySQL操作
所謂對數據庫的 CURD,指的是:
C(Create) 增加操作,即創建表、視圖等,不需要返回值
U(Update)更新操作,即修改表里的值、修改視圖定義等,不需要返回值
R(Read)查詢操作,即使用Selete語句查詢數據庫數據,需要返回值
D(Delete)刪除操作,即刪除表、視圖等的定義,不需要返回值
在我封裝的操作類中,查詢操作使用 ExecQuery方法,會返回一個list,可以通過循環語句對list進行讀取、處理等操作。
其他所有的不需要返回值的操作,統一使用ExecNonQuery方法,沒有返回值。如果需要執行結果查看的話,需要自己再封裝一個帶返回值的方法。
以下是update操作的示例,其他操作用法是一樣的,修改sql語句即可:
mysql_conn = MySQL(host='127.0.0.1', user="test1", pwd="123456", db="iplist") sql_string3 = "UPDATE iplist SET ip_address='192.168.1.1' WHERE id IN('2964475','2974661','2986832');" mysql_conn.ExecNonQuery(sql_string3)
執行完畢后,id為'2964475','2974661','2986832'的三條記錄對應的ip_address字段就被改成'192.168.1.1'了。
示例使用的數據庫創建SQL語句如下,大家可以自己搭建一個測試下效果
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for iplist -- ---------------------------- DROP TABLE IF EXISTS `iplist`; CREATE TABLE `iplist` ( `id` int(15) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主鍵序號', `ip_address` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'ip地址', `input_date` varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '記錄時間', `mac_address` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '網卡MAC地址', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 3419587 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; SET FOREIGN_KEY_CHECKS = 1; INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2367872, '192.168.59.101', '20220311', NULL); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2964475, '192.168.59.101', '20220408', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2974661, '192.168.59.101', '20220408', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2982541, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2986832, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (2999038, '192.168.59.101', '20220409', 'Incomplete'); INSERT INTO `iplist` (`id`, `ip_address`, `input_date`, `mac_address`) VALUES (3013347, '192.168.59.101', '20220409', 'Incomplete');
enjoy it!
特別提醒:本人看博客園的消息還是比較少,如果對本文有疑問,可以發郵件到 shandongdxl2004@126.com 我看郵箱還是比較勤快的 :)