- Python 操作 MySQL 數據庫需要是使用到 PyMySQL 驅動
-
- PyMySQL 是在 Python3.x 版本中用於連接 MySQL 服務器的一個庫,Python2 中則使用 mysqldb。
- PyMySQL 遵循 Python 數據庫 API v2.0 規范,並包含了 pure-Python MySQL 客戶端庫。
Python 操作 MySQL 前提是要安裝好 MySQL 數據庫並能正常連接使用,安裝步驟詳見下文。
-
操作流程
- 安裝 MySQL 數據庫
- pymysql 模塊安裝與使用
- 獲取數據庫的連接
- 執行 sql 語句或存儲過程
- 關閉數據庫連接
安裝 MySQL 數據庫
注意: 安裝過程我們需要通過開啟管理員權限來安裝,否則會由於權限不足導致無法安裝。
-
Linux 上安裝 MySQL
1、檢測系統是否自帶安裝 MySQL:
rpm -qa | grep mysql
2、如果查看到系統有安裝 MySQL,那可以選擇進行卸載:
rpm -e mysql… # 普通刪除模式
rpm -e --nodeps mysql… # 強力刪除模式,如果使用上面命令刪除時,提示有依賴的其它文件,則用該命令可以對其進行強力刪除
3、安裝 MySQL
首先需要先下載 MySQL 安裝包,官網下載地址下載對應版本即可,或直接在網上拉取並安裝:
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm # 獲取安裝包
rpm -ivh mysql-community-release-el7-5.noarch.rpm # 安裝
yum update
yum install mysql-server
權限設置:
chown mysql:mysql -R /var/lib/mysql
初始化 MySQL:
mysqld --initialize
啟動 MySQL:
systemctl start mysqld
查看 MySQL 運行狀態:
systemctl status mysqld
4、修改默認密碼
Mysql安裝成功后,默認的root用戶密碼為空,你可以使用以下命令來創建root用戶的密碼:
mysqladmin -u root password "new_password";
登陸:
mysql -uroot -p'new_password'
-
Windows 上安裝
1、下載
Windows 上安裝 MySQL 相對來說會較為簡單,5.7 版本下載地址
下載完后,將 zip 包解壓到自定義目錄,這里我將解壓后的文件夾放在 D:\Software\MySQL\mysql-5.7.28 下;
2、配置
接下來需要配置下 MySQL 的配置文件,打開剛剛解壓的文件夾 D:\Software\MySQL\mysql-5.7.28 ,在該文件夾下創建 my.ini 配置文件,編輯 my.ini 配置以下基本信息:
-
[client] # 設置mysql客戶端默認字符集 default-character-set=utf8 [mysqld] # 設置3306端口 port = 3306 # 設置mysql的安裝目錄 basedir=D:\\Software\\MySQL\\mysql-5.7.28 # 設置 mysql數據庫的數據的存放目錄,MySQL 8+ 不需要以下配置,系統自己生成即可,否則有可能報錯 datadir=D:\\Software\\MySQL\\SqlData # 允許最大連接數 max_connections=20 # 服務端使用的字符集默認為8比特編碼的latin1字符集 character-set-server=utf8 # 創建新表時將使用的默認存儲引擎 default-storage-engine=INNODB
- 注意:還需要創建數據庫數據目錄,初始化數據庫的時候需要初始化數據目錄 在 Mysql 安裝目錄下創建數據目錄
datadir=D:\\Software\\MySQL\\SqlData
-
啟動數據庫
以管理員身份打開 cmd 命令行工具,切換至 Mysql 安裝目錄:
cd D:\Software\MySQL\mysql-5.7.28\bin
初始化數據庫:
mysqld --initialize --console
執行完成后,會輸出 root 用戶的初始默認密碼,如下所示:
A temporary password is generated for root@localhost: feKm1E/-ExWM
"feKm1E/-ExWM" 即為 Mysql 初始密碼
輸入以下安裝命令:
-
mysqld install
初始化數據目錄
mysqld --initialize-insecure
啟動 Mysql:
net start mysql
登陸:
mysql -uroot -p
-
剛安裝好的數據庫 默認密碼是空,可根據自身需要修改。
windows 下修改 mysql 密碼:
-
mysql> select User from user; +---------------+ | User | +---------------+ | mysql.session | | mysql.sys | | root | +---------------+ 3 rows in set (0.00 sec) mysql> mysql> update mysql.user set authentication_string=password('123456') where user='root'; Query OK, 1 row affected, 1 warning (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 1 mysql> flush privileges; # 立即生效 Query OK, 0 rows affected (0.01 sec) mysql> quit # 退出重新登陸即可
-
創建數據庫
創建數據庫:
create database test_db;
查看數據庫:
-
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test_db | +--------------------+ 5 rows in set (0.00 sec) mysql> use test_db; Database changed
-
pymysql 模塊安裝與數據庫 CURD
一、安裝
PyMySQL 模塊使用 pip命令進行安裝:
pip3 install PyMySQL
-
假如系統不支持 pip 命令,可以使用以下方式安裝:
-
$ git clone https://github.com/PyMySQL/PyMySQL $ cd PyMySQL/ $ python3 setup.py install
-
pymysql 連接數據庫
pymysql .connect 函數:連接上數據庫
-
# 導入模塊 import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") print(conn) print(type(conn))
- 輸出結果顯示如下:表面數據庫連接成功
-
<pymysql.connections.Connection object at 0x00000000022A54A8> <class 'pymysql.connections.Connection'>
-
使用 pymysql 的 connect() 方法連接數據庫,connect 參數解釋如下:
- host:MySQL服務的地址,若數據庫在本地上,使用 localhost 或者127.0.0.1。如果在其它的服務器上,則寫對應的 IP地址
- port:服務的端口號,默認為3306,不寫則為默認值。
- user:登錄數據庫的用戶名
- passwd:登錄 MySQL 的密碼
- db:數據庫名
- charset:設置為 utf8 編碼,解決存漢字亂碼問題
conn.cursor():獲取游標
如果要操作數據庫,光連接數據是不夠的,咱們必須拿到操作數據庫的游標,才能進行后續的操作,游標的主要作用是用來接收數據庫操作后的返回結果,比如讀取數據、添加數據。通過獲取到的數據庫連接實例 conn 下的 cursor() 方法來創建游標,實例如下:
-
# 導入模塊 import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # print(conn) # print(type(conn)) # 獲取連接下的游標 cursor_test = conn.cursor() print(cursor_test)
- 輸出結果為:
- <pymysql.cursors.Cursor object at 0x000000000A544B00>
-
cursor 返回一個游標實例對象,其中包含了很多操作數據的方法,如執行sql語句,sql 執行命令:
execute()
和executemany()
execute(query,args=None):
- 函數作用:執行單條的sql語句,執行成功后返回受影響的行數
- 參數說明:
- query:要執行的sql語句,字符串類型
- args:可選的序列或映射,用於query的參數值。如果args為序列,query中必須使用%s做占位符;如果args為映射,query中必須使用%(key)s做占位符
executemany(query,args=None):
- 函數作用:批量執行sql語句,比如批量插入數據,執行成功后返回受影響的行數
- 參數說明:
- query:要執行的sql語句,字符串類型
- args:嵌套的序列或映射,用於query的參數值
其他游標對象如下表:
- 完整數據庫連接操作實例如下:
-
# 導入模塊 import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # print(conn) # print(type(conn)) # 獲取連接下的游標 cursor_test = conn.cursor() print(cursor_test) # 使用 execute() 方法執行 SQL 查詢,查詢數據庫版本 cursor_test.execute("SELECT VERSION()") # 使用 fetchone() 方法返回一條數據. data = cursor_test.fetchone() print("Database version : %s " % data) # 關閉數據庫連接 conn.close()
-
以上結果輸出為:
Database version : 5.7.28
-
創建表
創建表代碼如下:
-
import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # 獲取連接下的游標 cursor_test = conn.cursor() # 使用 execute() 方法執行 SQL,如果表存在則刪除 cursor_test.execute("DROP TABLE IF EXISTS EMPLOYEE") # 使用預處理語句創建表 sql = """CREATE TABLE user1 ( FIRST_NAME CHAR(20) NOT NULL, LAST_NAME CHAR(20), AGE INT, SEX CHAR(1), INCOME FLOAT )""" cursor_test.execute(sql) # 關閉數據庫連接 conn.close()
- 如下所示數據庫表創建成功:
-
mysql> desc user1; +------------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+-------+ | FIRST_NAME | char(20) | NO | | NULL | | | LAST_NAME | char(20) | YES | | NULL | | | AGE | int(11) | YES | | NULL | | | SEX | char(1) | YES | | NULL | | | INCOME | float | YES | | NULL | | +------------+----------+------+-----+---------+-------+ 5 rows in set (0.00 sec)
-
插入數據
插入數據實現代碼:
-
import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # 獲取連接下的游標 cursor_test = conn.cursor() # 使用預處理語句創建表 sql = """INSERT INTO user1(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Fei', 'Fei', 20, 'M', 1000)""" try: # 執行sql語句 cursor_test.execute(sql) # 提交到數據庫執行 conn.commit() except: # 如果發生錯誤則回滾 conn.rollback() # 關閉數據庫連接 conn.close()
- 插入數據結果:
-
mysql> select * from user1; +------------+-----------+------+------+--------+ | FIRST_NAME | LAST_NAME | AGE | SEX | INCOME | +------------+-----------+------+------+--------+ | Fei | Fei | 20 | M | 1000 | +------------+-----------+------+------+--------+ 1 row in set (0.00 sec)
-
查詢數據
Python查詢Mysql使用 fetchone() 方法獲取單條數據, 使用fetchall() 方法獲取多條數據。
- fetchone(): 該方法獲取下一個查詢結果集。結果集是一個對象
- fetchall(): 接收全部的返回結果行.
- rowcount: 這是一個只讀屬性,並返回執行 execute()方法后影響的行數。
查詢數據代碼如下:
-
import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # 獲取連接下的游標 cursor_test = conn.cursor() sql = """ select * from user1""" try: # 執行 sql 語句 cursor_test.execute(sql) # 顯示出所有數據 data_result = cursor_test.fetchall() for row in data_result: fname = row[0] lname = row[1] age = row[2] sex = row[3] income = row[4] # 打印結果 print("fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \ (fname, lname, age, sex, income)) except: print("Error: unable to fetch data") # 關閉數據庫連接 conn.close()
-
輸出結果:
fname=Fei,lname=Fei,age=20,sex=M,income=1000.0
-
數據庫表更新操作
-
# 導入模塊 import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # print(conn) # print(type(conn)) # 獲取連接下的游標 cursor_test = conn.cursor() sql = "UPDATE user1 SET AGE = AGE + 1 WHERE SEX = '%c'" % ('M') try: # 執行SQL語句 cursor_test.execute(sql) # 提交到數據庫執行 conn.commit() except: # 發生錯誤時回滾 conn.rollback() # 關閉數據庫連接 conn.close()
-
刪除操作
-
# 導入模塊 import pymysql # 打開數據庫連接 conn = pymysql.connect( host="127.0.0.1", user="root", password="123456", database="test_db", charset="utf8") # print(conn) # print(type(conn)) # 獲取連接下的游標 cursor_test = conn.cursor() sql = "DELETE * FROM user1" try: # 執行SQL語句 cursor_test.execute(sql) # 提交到數據庫執行 conn.commit() except: # 發生錯誤時回滾 conn.rollback() # 關閉數據庫連接 conn.close()
-
錯誤處理
DB API中定義了一些數據庫操作的錯誤及異常,下表列出了這些錯誤和異常:
-
異 常 描 述 Warning 當有嚴重警告時觸發,例如插入數據是被截斷等等。必須是 StandardError 的子類。 Error 警告以外所有其他錯誤類。必須是 StandardError 的子類。 InterfaceError 當有數據庫接口模塊本身的錯誤(而不是數據庫的錯誤)發生時觸發。必須是Error的子類。 DatabaseError 和數據庫有關的錯誤發生時觸發。必須是Error的子類。 DataError 當有數據處理時的錯誤發生時觸發,例如:除零錯誤,數據超范圍等等。必須是DatabaseError的子類。 OperationalError 指非用戶控制的,而是操作數據庫時發生的錯誤。例如:連接意外斷開、 數據庫名未找到、事務處理失敗、內存分配錯誤等等操作數據庫是發生的錯誤。必須是DatabaseError的子類。 IntegrityError 完整性相關的錯誤,例如外鍵檢查失敗等。必須是DatabaseError子類。 InternalError 數據庫的內部錯誤,例如游標(cursor)失效了、事務同步失敗等等。必須是DatabaseError子類。 ProgrammingError 程序錯誤,例如數據表(table)沒找到或已存在、SQL語句語法錯誤、 參數數量錯誤等等。必須是DatabaseError的子類。 NotSupportedError 不支持錯誤,指使用了數據庫不支持的函數或API等。例如在連接對象上 使用.rollback()函數,然而數據庫並不支持事務或者事務已關閉。必須是DatabaseError的子類。