Python高級 -- 08 MySQL與Python交互

一、準備MySQL數據


-- 創建 "京東" 數據庫
create database jing_dong charset=utf8;

-- 使用 "京東" 數據庫
use jing_dong;

-- 創建一個商品goods數據表
create table goods(
    id int unsigned primary key auto_increment not null,
    name varchar(150) not null,
    cate_name varchar(40) not null,
    brand_name varchar(40) not null,
    price decimal(10,3) not null default 0,
    is_show bit not null default 1,
    is_saleoff bit not null default 0
);

-- 向goods表中插入數據

insert into goods values(0,'r510vc 15.6英寸筆記本','筆記本','華碩','3399',default,default); 
insert into goods values(0,'y400n 14.0英寸筆記本電腦','筆記本','聯想','4999',default,default);
insert into goods values(0,'g150th 15.6英寸遊戲本','遊戲本','雷神','8499',default,default); 
insert into goods values(0,'x550cc 15.6英寸筆記本','筆記本','華碩','2799',default,default); 
insert into goods values(0,'x240 超極本','超級本','聯想','4880',default,default); 
insert into goods values(0,'u330p 13.3英寸超極本','超級本','聯想','4299',default,default); 
insert into goods values(0,'svp13226scb 觸控超極本','超級本','索尼','7999',default,default); 
insert into goods values(0,'ipad mini 7.9英寸平板電腦','平板電腦','蘋果','1998',default,default);
insert into goods values(0,'ipad air 9.7英寸平板電腦','平板電腦','蘋果','3388',default,default); 
insert into goods values(0,'ipad mini 配備 retina 顯示屏','平板電腦','蘋果','2788',default,default); 
insert into goods values(0,'ideacentre c340 20英寸一體電腦 ','臺式機','聯想','3499',default,default); 
insert into goods values(0,'vostro 3800-r1206 臺式電腦','臺式機','戴爾','2899',default,default); 
insert into goods values(0,'imac me086ch/a 21.5英寸一體電腦','臺式機','蘋果','9188',default,default); 
insert into goods values(0,'at7-7414lp 臺式電腦 linux )','臺式機','宏碁','3699',default,default); 
insert into goods values(0,'z220sff f4f06pa工作站','服務器/工作站','惠普','4288',default,default); 
insert into goods values(0,'poweredge ii服務器','服務器/工作站','戴爾','5388',default,default); 
insert into goods values(0,'mac pro專業級臺式電腦','服務器/工作站','蘋果','28888',default,default); 
insert into goods values(0,'hmz-t3w 頭戴顯示設備','筆記本配件','索尼','6999',default,default); 
insert into goods values(0,'商務雙肩揹包','筆記本配件','索尼','99',default,default); 
insert into goods values(0,'x3250 m4機架式服務器','服務器/工作站','ibm','6888',default,default); 
insert into goods values(0,'商務雙肩揹包','筆記本配件','索尼','99',default,default);


二、SQL演練


1、將查詢結果插入到另一張表中


(1)、創建商品分類表


-- 創建商品分類表
create table if not exists goods_cates(
    id int unsigned primary key auto_increment,
    name varchar(40) not null
);


(2)、查詢goods中的所有商品種類


select cate_name from goods group by cate_name;


(3)、將查詢結果插入到商品分類表中


insert into goods_cates (name) select cate_name from goods group by cate_name;




2、根據商品分類表中的數據更新商品表數據


update goods as g inner join goods_cates as c on g.cate_name=c.name set g.cate_name=c.id;




3、修改商品表中的字段並且和商品分類表關聯


(1)、修改表字段


alter table goods change cate_name cate_id int unsigned not null;


(2)、關聯外鍵


alter table goods add foreign key (cate_id) references goods_cates(id);


4、創建商品品牌表的同時插入數據


create table goods_brands (
    id int unsigned primary key auto_increment,
    name varchar(40) not null) 
    select brand_name as name from goods group by brand_name;




5、取消表中關聯的外鍵


-- 需要先獲取外鍵約束名稱,該名稱系統會自動生成,可以通過查看錶創建語句來獲取名稱
show create table goods;
-- 獲取名稱之後就可以根據名稱來刪除外鍵約束
alter table goods drop foreign key 外鍵名稱;


三、Python與MySQL交互


1、ubuntu中安裝pymysql模塊


root@ubuntu:/# pip install pymysql



2、Python中操作MySQL步驟



3、引入模塊


在.py文件中引入pymysql模塊


from pymysql import *


4、Connection對象


(1)、作用


        用於創建與數據庫的鏈接


(2)、創建Connection對象


conn=connect(參數列表)


參數host:連接的mysql主機ip,如果本機是'localhost'


參數port:連接的mysql主機的端口,默認是3306


參數database:數據庫的名稱


參數user:連接的用戶名


參數password:連接的密碼


參數charset:通信採用的編碼方式,推薦使用utf8


(3)、對象的方法


close()關閉連接

commit()提交

rollback()回滾

cursor()返回Cursor對象,用於執行sql語句並獲得結果


5、Cursor對象


(1)、作用


        用於執行sql語句,使用頻度最高的語句爲select、insert、update、delete


        獲取Cursor對象:調用Connection對象的cursor()方法


(2)、創建對象的方法


cs1=conn.cursor()


(3)、cursor對象的API


close()關閉

execute(operation [, parameters ])執行語句,返回受影響的行數,主要用於執行insert、update、delete語句,也可以執行create、alter、drop等語句

fetchone()執行查詢語句時,獲取查詢結果集的第一個行數據,返回一個元組

fetchall()執行查詢時,獲取結果集的所有行,一行構成一個元組,再將這些元組裝入一個元組返回


(4)、cursor對象的屬性


rowcount只讀屬性,表示最近一次execute()執行後受影響的行數

connection獲得當前連接對象


6、簡單的增加、查詢案例


from pymysql import connect


class JD(object):

    def __init__(self):
        # 創建鏈接
        self.conn = connect(host='192.168.37.128', port=3306, user='root', password='admin123', database='jing_dong',
                       charset='utf8')
        # 獲取cursor對象
        self.cursor = self.conn.cursor()

    def __del__(self):
        # 關閉cursor對象
        self.cursor.close()
        self.conn.close()

    def execute_sql(self,sql):
        self.cursor.execute(sql)
        # 遍歷數據
        for good in self.cursor.fetchall():
            print(good)

    def show_all_goods(self):
        """顯示所有商品"""
        # 編寫sql
        sql = "SELECT * FROM goods"
        # 執行sql
        self.execute_sql(sql)

    def show_all_cates(self):
        # 編寫sql
        sql = "select * from goods_cates"
        self.execute_sql(sql)

    def insert_goods(self):
        cate = input("請輸入要添加的分類名稱")
        sql = """insert into goods_cates(name) values("%s")""" % cate
        # 執行sql
        self.cursor.execute(sql)
        self.conn.commit()

    @staticmethod
    def print_menu():
        print("---------- welcome to JD ----------")
        print("1:查詢所有商品")
        print("2:查詢所有商品分類")
        print("3:查詢所有商品品牌")
        return input("---------- 請輸入功能對應的序號 ----------")

    def run(self):
        while True:
            num = self.print_menu()
            if num == "1":
                # 查詢所有商品
                self.show_all_goods()
            elif num == "2":
                # 查詢所有分類
                self.show_all_cates()
            elif num == "3":
                # 添加商品
                self.insert_goods()


def main():
    # 1.創建一個京東商城對象
    jd = JD()

    # 2.調用這個對象的run方法,讓其運行
    jd.run()


if __name__ == "__main__":
    main()


7、防止SQL注入的添加


from pymysql import connect


class JD(object):

    def __init__(self):
        # 創建鏈接
        self.conn = connect(host='192.168.37.128', port=3306, user='root', password='admin123', database='jing_dong',
                       charset='utf8')
        # 獲取cursor對象
        self.cursor = self.conn.cursor()

    def __del__(self):
        # 關閉cursor對象
        self.cursor.close()
        self.conn.close()

    def run(self):
        find_name = input("請輸入要查詢的商品名稱:")
        sql = "select * from goods where name = %s"
        """
            將查詢的參數放入列表中,使用execute的帶2個參數的方法執行查詢,即可以防止sql注入問題
        """
        param = [find_name]
        self.cursor.execute(sql, param)
        for temp in self.cursor.fetchall():
            print(temp)


def main():
    # 1.創建一個京東商城對象
    jd = JD()

    # 2.調用這個對象的run方法,讓其運行
    jd.run()


if __name__ == "__main__":
    main()


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