mysql在之前寫過一次,那時是我剛剛進入博客,今天介紹一下mysql的python交互,當然前面會把mysql基本概述一下。 一、命令腳本 1、基本命令 (1)啟動服務 以管理員身份運行cmd net start 服務名稱 以管理員身份運行cmd net start 服務名稱 (2)停止服務 以管 ...
mysql在之前寫過一次,那時是我剛剛進入博客,今天介紹一下mysql的python交互,當然前面會把mysql基本概述一下。
目錄: 一、命令腳本(mysql) 1、基本命令 2、資料庫操作命令 3、表操作命令 4、數據操作命令 5、查 6、關聯 二、python交互 1、資料庫連接 2、創建資料庫表 3、插入數據 4、更新資料庫 5、刪除數據 6、資料庫查詢 三、mysql封裝(方便使用) 1、python封裝的my_sql類 2、案例(調用my_sql類)
一、命令腳本
1、基本命令
(1)啟動服務
-
- 以管理員身份運行cmd
- net start 服務名稱
(2)停止服務
-
- 以管理員身份運行cmd
- net stop 服務名稱
(3)連接資料庫
-
- 格式:mysql - u root - p ->輸入密碼
(4)退出登錄(斷開連接)
-
- exit或quit
(5)查看版本(連接後可以執行)
-
- select version()
(6)顯示當前時間(連接後可以執行)
-
- select now()
(7)遠程連接
-
- mysql - h ip地址 - u 用戶名 - p --->輸入對方mysql密碼
2、資料庫操作命令
(1)創建資料庫
-
- create database 資料庫名 charset = utf8
(2)刪除資料庫
-
- drop database 資料庫名
(3)切換資料庫
-
- use 資料庫名
(4)查看當前選擇的資料庫
-
- select database()
3、表操作命令
(1)查看資料庫中所有表
-
- show tables
(2)創建表
-
- create table 表名(列及類型)
eg:create table student(id int auto_increment primary key,
name varchar(20) not null)
註:auto_increment 自增長 primary key 主鍵 not null 非空
(3)刪除表
-
- drop table 表名
(4)查看表結構
-
- desc 表名
(5)查看建表語句
-
- show create table 表名
(6)重命名錶
-
- rename table 原表名 to 新表名
(7)修改表
-
- alter table 表名 add | change | drop 列名
4、數據操作命令
(1)增
a、全列插入
insert into 表名 values(...)
eg:
insert into student values(0, "tom", "北京")
主鍵列是自動增長,但是在全列插入時需要占位,通常使用0,插入成功以後以實際數據為準
b、預設插入
insert into 表名(列1,列2..) values(值1,值2..)
c、同時插入多條數據
insert into 表名 values(...), (...), ...
(2)刪
delete from 表名 where 條件
不寫條件則全刪
(3)改
update 表名 set 列1 = 值1, 列2 = 值2, ... where 條件
(4)查
查詢表中的全部數據
select * from 表名
5、查
(1)基本語法
select * from 表名
-
-
- from關鍵字後面是表名,表示數據來源於這張表
- select後面寫表中的列名,如果是 * 表示在結果集中顯示表中額所有列
- 在select後面的列名部分,可以使用as為列名起別名,這個別名顯示在結果集中
- 如果要查詢多個列,之間使用逗號分隔
-
# eg:select name as a,age from student;
(2)消除重覆行
在select後面列前面使用distinct可以消除重覆的行
eg:select distinct gender from student
(3)條件查詢
a、語法
select * from 表名 where 條件
b、比較運算符
等於(=) 大於(>) 小於(<) 大於等於(>=) 小於等於(<=) 不等於(!= 或 <>)
c、邏輯運算符
and or not
d、模糊查詢
like
% 表示任意多個任意字元
_ 表示一個任意字元
e、範圍查詢
in 表示在一個非連續的範圍內
between。。。and。。。 表示在一個連續的範圍內
eg:where id in (8, 10, 13)
f、空判斷
註意:null與""是不同的
判斷空:is null
判斷非空:is not null
g、優先順序
小括弧,not,比較運算符,邏輯運算符
and比or優先順序高,同時出現並希望先選or,需要結合括弧來使用
(4)聚合
為了快速得到統計數,提供了5個聚合函數
a、count(*) 表示計算總行數,括弧中可以寫 * 或列名
b、max(列) 表示求此列的最大值
c、min(列) 表示求此列的最小值
d、sum(列) 表示求此列的和
e、avg(列) 表示求此列的平均值
(5)分組
按照欄位分組,表示此欄位相同的數據會被放到一個集合中。分組後,只能查詢出相同的數據列,對於有差異的數據列無法顯示在結果集中
可以對分組後的數據進行統計,做聚合運算
select 列1, 列2, 聚合... from 表名 group by 列1, 列2 having 列1, 列2
eg: 查詢男女生總數
select gender, count(*) from student group by gender
where與having的區別:where是對from後面指定的表進行篩選,屬於對原始數據的篩選;having是對group by的結果進行篩選。
(6)排序
select * from 表名 order by 列1 asc | desc, 列2 asc | desc, ...
a、將數據按照列1進行排序,如果某些列1的值相同則按照列2排序
b、預設按照從小到大的順序
c、asc升序
d、desc降序
(7)分頁
select * from 表名 limit start, count
從start開始,看count條
6、關聯
- 建表語句
(1)create table class(id int auto_increment primary key, name varchar(20) not null, stuNum int not null)
(2)create table students(id int auto_increment primary key, name varchar(20) not null, gender bit default 1, classid int not bull, foreign key(classid) references class(id))
- 插入一些數據:
(1)insert into class values(0, "python1", 50), (0, "python2", 60), (0, "python3", 70)
(2)insert into students values(0, "tom", 1, 1)
- 關聯查詢:
(1)select students.name, class.name from class inner join students on class.id = students.classid
- 分類:
(1)表A inner join 表B
表A與表B匹配的行會出現在結果集中
(2)表A left join 表B
表A與表B匹配的行會出現在結果集中,外加表A中獨有的數據,未對應的數據使用null填充
(3)表A right join 表B
表A與表B匹配的行會出現在結果集中,外加表B中獨有的數據,未對應的數據使用null填充
二、python交互
1、連接資料庫
1 import pymysql
2
3
4 # 連接資料庫
5 # 參數一:mysql服務所在主機的IP
6 # 參數二:用戶名
7 # 參數三:密碼
8 # 參數四:要連接的資料庫名
9 db = pymysql.connect("localhost", "root", "111111", "student")
10
11 # 創建一個cursor對象
12 cursor = db.cursor()
13 -----------------------------------------------------------------------------------------
14 # 要執行的sql語句
15 sql = "select version()"
16
17 # 執行sql語句
18 cursor.execute(sql)
19
20 # 獲取返回的信息
21 data = cursor.fetchone()
22 print(data)
23 ----------------------------------------------------------------------------------------
24 # 斷開
25 cursor.close()
26 db.close()
這裡我選擇的是pymysql,其實這個和MySQLdb相差無幾,命令也很像。連接時,主機IP如果是在本機,直接使用localhost即可,也可以寫IP地址,這樣可以實現遠程的連接。虛線中間部分是要進行不同操作時需要更改的部分。
2、創建資料庫表
上面給出了連接資料庫的代碼,其實後面的操作就簡單多了,外部框架不變,只需要改內部的sql語句,以及個別的一些操作。
1 # 檢查表是否存在,如果有則刪除
2 cursor.execute("drop table if exists bancard")
3
4 # 建表
5 sql = "create table bandcard(id int auto_increment primary key, money int not null)"
6 cursor.execute(sql)
3、插入數據
1 sql = "insert into bandcard values(0, 300)"
2 try:
3 cursor.execute(sql)
4 db.commit() # 執行這條語句才插入
5 except:
6 # 如果提交失敗,回滾到上一次數據
7 db.rollback()
4、更新資料庫
1 sql = "update bandcard set money=1000 where id=1"
2 try:
3 cursor.execute(sql)
4 db.commit()
5 except:
6 # 如果提交失敗,回滾到上一次數據
7 db.rollback()
可以看到,後面的操作基本上以及回歸mysql本身,大家記住這樣一個流程就可以了。
5、刪除數據
1 sql = "delete from bandcard where money=200" 2 try: 3 cursor.execute(sql) 4 db.commit() 5 except: 6 # 如果提交失敗,回滾到上一次數據 7 db.rollback()
6、資料庫查詢操作
- fetchone()
功能:獲取下一個查詢結果集,結果集是一個對象
- fetchall()
功能:接收全部的返回的行
- rowcount
是一個只讀屬性,返回execute()方法影響的行數
1 sql = "select * from bandcard where money>200"
2 try:
3 cursor.execute(sql)
4 # 返回查詢結果
5 reslist = cursor.fetchall()
6 for row in reslist:
7 print("%d--%d" % (row[0], row[1]))
8 except:
9 # 如果提交失敗,回滾到上一次數據
10 db.rollback()
三、mysql的封裝(方便以後使用時直接調用)
1 import pymysql
2
3
4 class my_sql():
5
6 def __init__(self, host, user, passwd, dbName):
7 self.host = host
8 self.user = user
9 self.passwd = passwd
10 self.dbName = dbName
11
12 def connect(self):
13 self.db = pymysql.connect(
14 self.host, self.user, self.passwd, self.dbName)
15 self.cursor = self.db.cursor()
16
17 def close(self):
18 self.cursor.close()
19 self.db.close()
20
21 def get_one(self, sql):
22 res = None
23 try:
24 self.connect()
25 self.cursor.execute(sql)
26 res = self.cursor.fetchone()
27 self.close()
28 except:
29 print("查詢失敗")
30 return res
31
32 def get_all(self, sql):
33 res = ()
34 try:
35 self.connect()
36 self.cursor.execute(sql)
37 res = self.cursor.fetchall()
38 self.close()
39 except:
40 print("查詢失敗")
41 return res
42
43 def insert(self, sql):
44 return self.__edit(sql)
45
46 def update(self, sql):
47 return self.__edit(sql)
48
49 def delete(self, sql):
50 return self.__edit(sql)
51
52 def __edit(self, sql):
53 count = 0
54 try:
55 self.connect()
56 count = self.cursor.execute(sql)
57 self.db.commit()
58 self.close()
59 except:
60 print("事務提交失敗")
61 self.db.rollback()
上面的類中封裝了用python封裝了對mysql的連接,增,刪,改,查等功能,在今後使用的時候,完全可以直接調用其中的方法,避免重覆造輪子嘛。下麵給一個使用的案例:
1 from my_sql import my_sql
2
3 # 這個是連接mysql的參數,前面有解釋到,使用時候連接上自己的資料庫就好
4 s = my_sql("xxx.xxx.xx.x", "xxxx", "xxxxxx", "student")
5
6 # 查詢
7 res = s.get_all("select * from bandcard where money>200")
8 for row in res:
9 print("%d--%d" % (row[0], row[1]))
當然在你使用的時候要寫完整調用的類的路徑,我這裡是在同一個目錄下寫的。新建一個自己的文件,引入my_sql中的my_sql類,然後就可以使用了。