Python必學模塊之pymysql (操作數據庫)


在這裏插入圖片描述

一、MySQL數據庫介紹

Mysql是最流行的關係型數據庫管理系統,在WEB應用方面MySQL是最好的RDBMS(Relational Database Management System:關係數據庫管理系統)應用軟件之一。MySQL是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

1.1 MySQL特點和優勢

MySQL開放源代碼且無版權制約,自主性及使用成本低。

MySQL性能卓越、服務穩定,很少出現異常宕機。

MySQL支持多種操作系統,提供多種API接口,支持多種開發語言。這些開發語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。

MySQL支持大型數據庫,支持5000萬條記錄的數據倉庫,32位系統表文件最大可支持4GB,64位系統支持最大的表文件爲8TB。

MySQL體積小,安裝方便,易於維護。

MySQL是可以定製的,採用了GPL協議,你可以修改源碼來開發自己的MySQL系統。

1.2 RDBMS 特點

數據庫(DATABASE)是按照數據結構來組織、存儲和管理數據的倉儲;
關係型數據庫管理系統(RDBMS)來存儲和管理的大數據量,所謂的關係型數據庫是建立在關係模型

  • 數據以表的形式出現
  • 每行爲各種記錄名稱
  • 每列爲記錄名稱所對應的數據域
  • 許多的行和列組成一張表單
  • 若干的表單組成database

自己的理解:

數據庫服務器:裝有MySQL軟件的計算機
數據庫管理軟件:MySQL
數據庫/庫:文件夾
表:文件
記錄:一個事物的一系列典型的特徵:金鞍少年,male,18
數據 :事務的特徵,如 name=“金鞍少年”

1.3 RDBMS 術語

掌握MySQL 數據庫必須瞭解一些RDBMS 相關的術語:

  • 數據庫: 數據庫是一些關聯表的集合
  • 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
  • 列: 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
  • :一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
  • 冗餘: 存儲兩倍數據,冗餘可以使系統速度更快。(表的規範化程度越高,表與表之間的關係就越多;查詢時可能經常需要在多個表之間進行連接查詢;而進行連接操作會降低查詢速度。
    • 學生的信息存儲在student表中,學校信息存儲在 school 表中。通過student表中的dept_id字段與school 表建立關聯關係。如果要查詢一個學生所在系的名稱,必須從student表中查找學生所在院系的編號(dept_id),然後根據這個編號去school 查找系的名稱。如果經常需要進行這個操作時,連接查詢會浪費很多的時間。因此可以在student表中增加一個冗餘字段dept_name,該字段用來存儲學生所在院系的名稱。這樣就不用每次都進行連接操作了。
  • 主鍵: 主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據(主鍵是用來標識數據的,假如有多個相同的數據,那麼就需要用主鍵來區分數據;好比同名同姓,可以使用×××號來區分,這個主鍵是唯一的,在數據庫中不會重複。)。
  • 外鍵: 外鍵用於關聯兩個表(當前表中的這個鍵連接了其他表的別的鍵,當前表的這個鍵就叫做外鍵)。
  • 複合鍵: 複合鍵(組合鍵)將多個列作爲一個索引鍵,一般用於複合索引(比如將多列的數據字段,變成一個索引)。
  • 索引: 使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄(比如在5萬條數據中查找一個值,不需要遍歷所有數據來查找,可以類似書籍目錄的方式,直接定位到數據)(查找到數據不是一下就找到,而是通過一種算法來查找,但查找的次數比較少)。
  • 參照完整性: 參照的完整性要求關係中不允許引用不存在的實體。與實體完整性是關係模型必須滿足的完整性約束條件,目的是保證數據的一致性。

二、MySQL的安裝方法

2.1 Window上安裝MySQL

安裝步驟

#1、下載:MySQL Community Server 5.7.29
http://dev.mysql.com/downloads/mysql/
# 最新版本爲8.0.19 但是一般公司爲了數據的穩定性和安全性都傾向於使用穩定可靠的版本,所以我是用的是5.7.29版本

    
#2、解壓
如果想要讓MySQL安裝在指定目錄,那麼就將解壓後的文件夾移動到指定目錄,如:C:\mysql-5.7.16-winx64

#3、添加環境變量
【右鍵計算機】--》【屬性】--》【高級系統設置】--》【高級】--》【環境變量】--》【在第二個內容框中找到 變量名爲Path 的一行,雙擊】 --> 【將MySQL的bin目錄路徑追加到變值值中,用 ; 分割】
 
#4、初始化
mysqld --initialize-insecure

#5、啓動MySQL服務
mysqld # 啓動MySQL服務

#6、啓動MySQL客戶端並連接MySQL服務
mysql -u root -p # 連接MySQL服務器

將MySQL服務設置爲windows服務

在執行【mysqd】啓動MySQL服務器時,當前終端會被hang住,那麼做一下設置即可解決此問題:

注意:--install前,必須用mysql啓動命令的絕對路徑
# 製作MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --install
 
# 移除MySQL的Windows服務,在終端執行此命令:
"c:\mysql-5.7.16-winx64\bin\mysqld" --remove

註冊成服務之後,以後再啓動和關閉MySQL服務時,僅需執行如下命令:
# 啓動MySQL服務
net start mysql
 
# 關閉MySQL服務
net stop mysql

如果出現:Install/Remove of the Service Denied! ,說明權限不夠

找到 C:\Windows\System32目錄下的cmd.exe,右鍵管理員方式運行,重新上述操作即可。

2.2 Linux上安裝MySQL

二進制rpm包安裝

yum -y install mysql-server mysql

源碼安裝

1.解壓tar包
cd /software
tar -xzvf mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz
mv mysql-5.6.21-linux-glibc2.5-x86_64 mysql-5.6.21

2.添加用戶與組
groupadd mysql
useradd -r -g mysql mysql
chown -R mysql:mysql mysql-5.6.21

3.安裝數據庫
su mysql
cd mysql-5.6.21/scripts
./mysql_install_db --user=mysql --basedir=/software/mysql-5.6.21 --datadir=/software/mysql-5.6.21/data

4.配置文件
cd /software/mysql-5.6.21/support-files
cp my-default.cnf /etc/my.cnf
cp mysql.server /etc/init.d/mysql
vim /etc/init.d/mysql   #若mysql的安裝目錄是/usr/local/mysql,則可省略此步
修改文件中的兩個變更值
basedir=/software/mysql-5.6.21
datadir=/software/mysql-5.6.21/data

5.配置環境變量
vim /etc/profile
export MYSQL_HOME="/software/mysql-5.6.21"
export PATH="$PATH:$MYSQL_HOME/bin"
source /etc/profile

6.添加自啓動服務
chkconfig --add mysql
chkconfig mysql on

7.啓動mysql
service mysql start

8.登錄mysql及改密碼與配置遠程訪問
mysqladmin -u root password 'your_password'     #修改root用戶密碼
mysql -u root -p     #登錄mysql,需要輸入密碼
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;     #允許root用戶遠程訪問
mysql>FLUSH PRIVILEGES;     #刷新權限

源碼安裝mariadb

1. 解壓
tar zxvf  mariadb-5.5.31-linux-x86_64.tar.gz   
mv mariadb-5.5.31-linux-x86_64 /usr/local/mysql //必需這樣,很多腳本或可執行程序都會直接訪問這個目錄

2. 權限
groupadd mysql             //增加 mysql 屬組 
useradd -g mysql mysql     //增加 mysql 用戶 並歸於mysql 屬組 
chown mysql:mysql -Rf  /usr/local/mysql    // 設置 mysql 目錄的用戶及用戶組歸屬。 
chmod +x -Rf /usr/local/mysql    //賜予可執行權限 

3. 拷貝配置文件
cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf     //複製默認mysql配置 文件到/etc目錄 

4. 初始化
/usr/local/mysql/scripts/mysql_install_db --user=mysql          //初始化數據庫 
cp  /usr/local/mysql/support-files/mysql.server    /etc/init.d/mysql    //複製mysql服務程序 到系統目錄 
chkconfig  mysql on     //添加mysql 至系統服務並設置爲開機啓動 
service  mysql  start  //啓動mysql

5. 環境變量配置
vim /etc/profile   //編輯profile,將mysql的可執行路徑加入系統PATH
export PATH=/usr/local/mysql/bin:$PATH 
source /etc/profile  //使PATH生效。

6. 賬號密碼
mysqladmin -u root password 'yourpassword' //設定root賬號及密碼
mysql -u root -p  //使用root用戶登錄mysql
use mysql  //切換至mysql數據庫。
select user,host,password from user; //查看系統權限
drop user ''@'localhost'; //刪除不安全的賬戶
drop user root@'::1';
drop user root@127.0.0.1;
select user,host,password from user; //再次查看系統權限,確保不安全的賬戶均被刪除。
flush privileges;  //刷新權限

7. 一些必要的初始配置
1)修改字符集爲UTF8
vi /etc/my.cnf
在[client]下面添加 default-character-set = utf8
在[mysqld]下面添加 character_set_server = utf8
2)增加錯誤日誌
vi /etc/my.cnf
在[mysqld]下面添加:
log-error = /usr/local/mysql/log/error.log
general-log-file = /usr/local/mysql/log/mysql.log
3) 設置爲不區分大小寫,linux下默認會區分大小寫。
vi /etc/my.cnf
在[mysqld]下面添加:
lower_case_table_name=1

修改完重啓:#service  mysql  restartmysql

2.3 MySQL5.7安裝包

由於MySQL官網下載速度太慢了 ,特意將下載好的包提供給大家

windows版本:mysql-5.7.16.7z

三、MySQL簡單實用方法

由於博主對linux還處於 草色煙光殘照裏,無言誰會憑闌意。 的地步,關於mysql的一些操作以windows爲主。

參考學習視頻: https://www.bilibili.com/video/BV1nE411176d?p=161

3.1 啓動服務

# win+R > cmd > 進入命令行

# 第一步 首次安裝一定記得初始化
mysqld --initialize-insecure 

# 啓動MySQL客戶端並連接MySQL服務
mysql -u root -p # 連接MySQL服務器

3.2 登陸設置密碼

# 初始狀態下,管理員root,密碼爲空,默認只允許從本機登錄localhost
# 設置密碼
C:\Users\Administrator> mysqladmin -uroot -p password "123"        # 設置初始密碼 由於原密碼爲空,因此-p可以不用

# 修改密碼
C:\Users\Administrator> mysqladmin -uroot -p"123" password "456"      # 修改mysql密碼,因爲已經有密碼了,所以必須輸入原密碼才能設置新密碼

命令格式:
C:\Users\Administrator> mysql -uroot -p          # 無密碼登錄本機
C:\Users\Administrator> mysql                    # 以root用戶登錄本機,密碼爲空
C:\Users\Administrator> mysql -uroot -p123  # 有密碼登錄本機
    

3.3 命令行相關命令

# 連接到本機上的MYSQL
mysql -u root -p  # 回車後輸入密碼

# 連接到遠程主機上的MYSQL 地址爲110.110.110.110。
mysql -h110.110.110.110 -u root -p 123

#退出mysql命令
exit # 回車

# 查看當前登錄的用戶
select user();

# 設置密碼
mysqladmin -uroot -p password "123"

# 增加新用戶
# 格式:grant select on 數據庫.* to 用戶名@登錄主機 identified by “密碼”
grant select,insert,update,delete on *.* to user1@localhost Identified by "password1";

# 新建數據庫
# 建立一個名爲testdb的數據庫
create database testdb;

# 顯示所有數據庫
show databases;

# 刪除數據庫
drop database 數據庫名;

# 鏈接數據庫
# use 數據庫名
use testdb;

#當前選擇數據庫
select database();

# 顯示庫中的數據表
use mysql;
show tables;

# 查詢時間:
select now();
  
# 查詢數據庫版本:
select version();

# 導出整個數據庫
# 導出文件默認是存在mysql\bin目錄下
# mysqldump -u 用戶名 -p 數據庫名 > 導出的文件名
mysqldump -u user_name -p123456 database_name > outfile_name.sql

# 導出一個表
# mysqldump -u 用戶名 -p 數據庫名 表名> 導出的文件名
mysqldump -u user_name -p database_name table_name > outfile_name.sql

3.4 破解MySQL密碼

windows平臺下,5.7版本mysql,破解密碼的兩種方式:

方式一:

#1 關閉mysql
#2 在cmd中執行:mysqld --skip-grant-tables
#3 在cmd中執行:mysql
#4 執行如下sql:
update mysql.user set authentication_string=password('') where user = 'root';
flush privileges;

#5 tskill mysqld #或taskkill -f /PID 7832
#6 重新啓動mysql

方式二:

#1. 關閉mysql,可以用tskill mysqld將其殺死
#2. 在解壓目錄下,新建mysql配置文件my.ini
#3. my.ini內容,指定
[mysqld]
skip-grant-tables

#4.啓動mysqld
#5.在cmd裏直接輸入mysql登錄,然後操作
update mysql.user set authentication_string=password('') where user='root and host='localhost';

flush privileges;

#6.註釋my.ini中的skip-grant-tables,然後啓動myqsld,然後就可以以新密碼登錄了

3.5 爲MySQL設置配置文件

#在mysql的解壓目錄下,新建my.ini,然後配置
#1. 在執行mysqld命令時,下列配置會生效,即mysql服務啓動時生效
[mysqld]
;skip-grant-tables
port=3306
character_set_server=utf8
default-storage-engine=innodb
innodb_file_per_table=1


#解壓的目錄
basedir=E:\mysql-5.7.19-winx64
#data目錄
datadir=E:\my_data #在mysqld --initialize時,就會將初始數據存入此處指定的目錄,在初始化之後,啓動mysql時,就會去這個目錄裏找數據


#2. 針對客戶端命令的全局配置,當mysql客戶端命令執行時,下列配置生效
[client]
port=3306
default-character-set=utf8
user=root
password=123

#3. 只針對mysql這個客戶端的配置,2中的是全局配置,而此處的則是隻針對mysql這個命令的局部配置
[mysql]
;port=3306
;default-character-set=utf8
user=egon
password=4573


#!!!如果沒有[mysql],則用戶在執行mysql命令時的配置以[client]爲準

my.ini

四、簡單SQL語句

SQL語言主要用於存取數據、查詢數據、更新數據和管理關係數據庫系統,SQL語言由IBM開發。SQL語言分爲3種類型:
1、DDL語句 數據庫定義語言: 數據庫、表、視圖、索引、存儲過程,例如CREATE DROP ALTER
2、DML語句 數據庫操縱語言: 插入數據INSERT、刪除數據DELETE、更新數據UPDATE、查詢數據SELECT
3、DCL語句 數據庫控制語言: 例如控制用戶的訪問權限GRANT、REVOKE

#1. 操作數據庫
        增:create database db1 charset utf8;
        查:show databases;
        改:alter database db1 charset latin1;
        刪除: drop database db1;


#2. 操作數據庫下的數據表
    先切換到數據庫下:use db1
        增:create table t1(id int,name char);
        查:show tables
        改:alter table t1 modify name char(3);
              alter table t1 change name name1 char(2);
        刪:drop table t1;
    

#3. 操作數據表中的內容/記錄
        增:insert into t1 values(1,'egon1'),(2,'egon2'),(3,'egon3');
        查:select * from t1;
        改:update t1 set name='sb' where id=2;
        刪:delete from t1 where id=1;

        清空表:
            delete from t1; #如果有自增id,新增的數據,仍然是以刪除前的最後一樣作爲起始。
            truncate table t1;數據量大,刪除速度比上一條快,且直接從零開始,

            auto_increment 表示:自增
            primary key 表示:約束(不能重複且不能爲空);加速查找

更多mysql 參考:《深入淺出mysql》學習筆記

五、pymysql模塊

5.1 安裝模塊

pip3 install pymysql

5.2 pymysql基本操作

使用PyMySQL模塊固定不變的執行順序

1. 建立連接
2. 拿到遊標
3. 執行SQL語句
4. 事務處理(提交修改)
5. 關閉(遊標、連接)

5.3 數據庫連接

語法:

 conn= pymysql.connect(host='localhost',
                              user='user',
                              password='passwd',
                              db='db',
                              charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

參數解讀:

參數 解釋
host 數據庫服務器地址,默認 localhost,也可以用127.0.0.1本地地址來表示
user 用戶名,默認爲當前程序運行用戶
password 登錄密碼,默認爲空字符串
database 默認操作的數據庫
port 數據庫端口,默認爲 3306
bind_address 當客戶端有多個網絡接口時,指定連接到主機的接口。參數可以是主機名或IP地址
unix_socket unix 套接字地址,區別於 host 連接
read_timeout 讀取數據超時時間,單位秒,默認無限制
write_timeout 寫入數據超時時間,單位秒,默認無限制
charset 數據庫編碼
sql_mode 指定默認的 SQL_MODE
read_default_file 指定my.cnf文件從[client]部分讀取這些參數。
conv 轉換字典以代替默認字典使用,這用於提供類型的自定義編組和解組。
use_unicode 是否默認爲unicode字符串。在python3中這個選項默認爲true。
client_flag 要發送到MySQL的自定義標記,在constants.CLIENT中找到潛在的價值。
cursorclass 設置默認的遊標類型,默認爲cursor
init_command 當連接建立完成之後執行的初始化 SQL 語句
autocommit 是否自動提交,默認不自動提交,參數值爲 None 表示以服務器爲準
defer_connect 是否惰性連接,默認爲立即連接
max_allowed_packet 發送給服務器的最大數據量,默認爲 16MB
db 參數 database 的別名
passwd 參數 password 的別名
binary_prefix 在字節和字節數組上添加_binary前綴(默認值:False)
connect_timeout 連接超時時間,默認 10,最小 1,最大 31536000
auth_plugin_map A dict of plugin names to a class that processes that plugin. The class will take the Connection object as the argument to the constructor. The class needs an authenticate method taking an authentication packet as an argument. For the dialog plugin, a prompt(echo, prompt) method can be used (if no authenticate method) for returning a string from the user. (experimental)
server_public_key SHA256 authenticaiton plugin公鑰值。(默認值:無)

5.4 遊標

連接完數據庫,接着就該獲取遊標,之後才能進行執行、提交等操作。

什麼是遊標:

遊標(cursor)是系統爲用戶開設的一個數據緩衝區,存放SQL語句的執行結果。每個遊標區都有一個名字。用戶可以用SQL語句逐一從遊標中獲取記錄,並賦給主變量,交由主語言進一步處理。

語法:

cursor = conn.cursor()

查詢時,默認返回的數據類型爲元組,可以修改返回類型

幾種常用遊標類型:

類型 作用
Cursor 默認,元組類型
DictCursor 字典類型
SSCursor 無緩衝元組類型
SSDictCursor 無緩衝字典類型

提示: 無緩衝遊標類型,適用於數據量很大,一次性返回太慢,或者服務端帶寬較小 創建連接時,

方法一:通過cursorclass 參數指定類型:

conn = pymysql.connect(host='localhost',
                             user='root',
                             password='root',
                             db='db',
                             charset='utf8',
                             cursorclass=pymysql.cursors.DictCursor)

方法二: 創建遊標時指定類型

cursor = connection.cursor(cursor=pymysql.cursors.DictCursor)

遊標的移動:

所有的數據查詢操作均基於遊標,我們可以通過cursor.scroll(num, mode)控制遊標的位置。

cursor.scroll(1, mode='relative') # 相對當前位置移動
cursor.scroll(2, mode='absolute') # 相對絕對位置移動

5.5 執行SQL語句

參考上文章節4,簡單SQL語句,將寫好的SQL語句通過 cursor.execute(sql, args) 進行執行。

這裏的參數 args 可以是,(tuple,list,dict), execute 還能返回受影響的行數

# sql執行語句
# INSERT INTO 語句用於向表格中插入新的行。
# INSERT INTO 表名稱 VALUES (值1, 值2,....)
sql = " insert into student(id,name,course ) values (null,%s,%s) " # 往student表中的id,name,coerse字段中添加數據,其中id是自增的,可以設置爲null

cursor.execute(sql, ('張三', '刑法'))  # 執行sql語句
db.commit()  # 提交

批量執行cursor.executemany(sql, args)

5.6 返回執行結果

使用pymysql查詢數據,可以使用fatch*方法

方法 作用
fetchone() 這個方法每次只獲取一條數據
fetchall() 獲取所有數據
fetchmany(size) 可以獲取指定條數數據

5.7 事務處理

事務開始:

conn.begin() 

提交修改:

sql語句執行完之後,需要提交修改才能在數據庫中修改

conn.commit() 

事務回滾:

conn.rollback()

5.8 關閉(遊標、連接)

一般用於最後結束對數據庫的操作,可在 finally 中寫

關閉數據庫連接:

conn.close()

關閉遊標:

cursor.close()

六、增刪改查實例

在這裏插入圖片描述

操作的數據庫爲csdn_python_study,操作的表爲student,其中id爲自增主鍵。

6.1 增實例

import pymysql


# 簡易寫法

# 使用pymysql.connect鏈接數據庫
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 獲取db數據庫上的cursor對象
cursor = db.cursor()

# sql執行語句
# INSERT INTO 語句用於向表格中插入新的行。
# INSERT INTO 表名稱 VALUES (值1, 值2,....)
sql = " insert into student(id,name,course ) values (null,%s,%s) "

cursor.execute(sql, ('張三', '刑法'))  # 執行sql語句
db.commit()  # 提交

db.close()  # 關閉數據庫,回收系統資源



def add_content(host,name,passwd,db,port):
    conn = pymysql.connect(host=host, user=name, password=passwd, database=db, port=port)
    cursor = conn.cursor()

    try:
        add_sql = " insert into student(id,name,course ) values (null,%s,%s) "
        cursor.execute(add_sql,("后羿","王者榮耀"))
        conn.commit()
        print('執行成功!')
    except Exception as e:
        print(u'查詢錯誤...', e)
        conn.rollback()
    finally:
        cursor.close()
        conn.close()


if __name__ == '__main__':
    add_content('127.0.0.1', 'root', "123", 'csdn_python_study', 3306)

6.2 刪除內容實例

import pymysql

# 連接數據庫
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 獲取遊標
cursor = db.cursor()

sql = "delete from student where id = 2"  # 刪除student表中id爲2的行
cursor.execute(sql)

db.commit()  # 事件提交

db.close()   # 管理連接,回收系統資源

6.3 修改實例

import pymysql

# 連接數據庫
db = pymysql.connect(host='127.0.0.1', user='root', password="123", database='csdn_python_study', port=3306)

# 獲取遊標
cursor = db.cursor()

sql = "update student set name='劉亦菲' where id= 3"  # 找到id爲3的行,將name內容改爲劉亦菲
cursor.execute(sql)
db.commit()

db.close()

6.4 查詢實例

import pymysql

db = pymysql.connect(host="127.0.0.1", user="root", password="123",
                 database="csdn_python_study", port=3306)

cursor = db.cursor()

sql = "select name,course from student "
cursor.execute(sql)

# result1 = cursor.fetchone()  # 獲取第一條
#
# result2 = cursor.fetchall()  # 獲取所有

result3 = cursor.fetchmany(2)  # 獲取前2條

print(result3)

cursor.close()
db.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章