mysql及python交互


  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類,然后就可以使用了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM