mysql及python交互

  mysql在以前寫過一次,那時是我剛剛進入博客,今天介紹一下mysql的python交互,固然前面會把mysql基本概述一下。python

 

  目錄:
1、命令腳本(mysql)
    一、基本命令
    二、數據庫操做命令
    三、表操做命令
    四、數據操做命令
    五、查
    六、關聯
2、python交互
    一、數據庫鏈接
    二、建立數據庫表
    三、插入數據
    四、更新數據庫
    五、刪除數據
    六、數據庫查詢
3、mysql封裝(方便使用)
    一、python封裝的my_sql類
    二、案例(調用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密碼

二、數據庫操做命令

  (1)建立數據庫

    • create database 數據庫名 charset = utf8

  (2)刪除數據庫

    • drop database 數據庫名

  (3)切換數據庫

    • use 數據庫名

  (4)查看當前選擇的數據庫

    • select database()

三、表操做命令

  (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 非空mysql

  (3)刪除表

    • drop table 表名

  (4)查看錶結構

    • desc 表名

  (5)查看建表語句

    • show create table 表名

  (6)重命名錶

    • rename table 原表名 to 新表名

  (7)修改表

    • alter table 表名 add | change | drop 列名

四、數據操做命令

  (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(...), (...), ...sql

  (2)刪

    delete from 表名 where 條件
    不寫條件則全刪數據庫

  (3)改

    update 表名 set 列1 = 值1, 列2 = 值2, ... where 條件框架

  (4)查

    查詢表中的所有數據
    select * from 表名函數

五、查

  (1)基本語法

    select * from 表名fetch

      • from關鍵字後面是表名,表示數據來源於這張表
      • select後面寫表中的列名,若是是 * 表示在結果集中顯示錶中額全部列
      • 在select後面的列名部分,可使用as爲列名起別名,這個別名顯示在結果集中
      • 若是要查詢多個列,之間使用逗號分隔

    # eg:select name as a,age from student;ui

  (2)消除重複行

    在select後面列前面使用distinct能夠消除重複的行
    eg:select distinct gender from studentspa

  (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,須要結合括號來使用code

  (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條

六、關聯

  • 建表語句

  (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填充

2、python交互

一、鏈接數據庫

 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地址,這樣能夠實現遠程的鏈接。虛線中間部分是要進行不一樣操做時須要更改的部分。

二、建立數據庫表

  上面給出了鏈接數據庫的代碼,其實後面的操做就簡單多了,外部框架不變,只須要改內部的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)

三、插入數據

1 sql = "insert into bandcard values(0, 300)"
2 try: 3  cursor.execute(sql) 4     db.commit() # 執行這條語句才插入
5 except: 6     # 若是提交失敗,回滾到上一次數據
7     db.rollback()

四、更新數據庫

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自己,你們記住這樣一個流程就能夠了。

五、刪除數據

1 sql = "delete from bandcard where money=200"
2 try:
3     cursor.execute(sql)
4     db.commit()
5 except:
6     # 若是提交失敗,回滾到上一次數據
7     db.rollback()

六、數據庫查詢操做

  • 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()

3、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類,而後就可使用了。

相關文章
相關標籤/搜索