Python-視圖 觸發器 事務 存儲過程

1.視圖
2.觸發器***
在某個時間發生了某個事件時 會自動觸發一段sql語句
3.事務*****
4.存儲過程*****

5.函數
6.備份與恢復***
mysqldump -u -p (庫名 [表名] | --all--databases --databases 庫名1 庫名2) > 文件路徑
恢復
1.mysql -u -p < 文件路徑
2.source 文件路徑
7.流程控制

----------------
1. 視圖
視圖是一個虛擬表(非真實存在),其本質是【根據SQL語句獲取動態的數據集,併爲其命名】,
用戶使用時只需使用【名稱】便可獲取結果集,能夠將該結果集當作表來使用。

使用視圖咱們能夠把查詢過程當中的臨時表摘出來,用視圖去實現,
這樣之後再想操做該臨時表的數據時就無需重寫複雜的sql了,直接去視圖中查找便可,
但視圖有明顯地效率問題,而且視圖是存放在數據庫中的,若是咱們程序中使用的sql過度依賴數據庫中的視圖,
即強耦合,那就意味着擴展sql極爲不便,所以並不推薦使用
100個SQL:
88: v1

select .. from v1
select asd from v1
某個查詢語句設置別名,往後方便使用

- 建立
create view 視圖名稱 as SQL

PS: 虛擬
- 修改
alter view 視圖名稱 as SQL

- 刪除
drop view 視圖名稱;

2. 觸發器

當對某張表作:增刪改操做時,可使用觸發器自定義關聯行爲

insert into tb (....)

-- delimiter //
-- create trigger t1 BEFORE INSERT on student for EACH ROW
-- BEGIN
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- INSERT into teacher(tname) values(NEW.sname);
-- END //
-- delimiter ;
--

-- insert into student(gender,class_id,sname) values('女',1,'陳濤'),('女',1,'張根');

-- NEW,代指新數據
-- OLD,代指老數據

3.事務*****

 

    是邏輯上的一組sql語句   他們要麼都成功 要麼都失敗  從此只要執行sql就會有事務    使用事務        start transaction; --開啓事物,在這條語句以後的sql將處在同一事務,並不會當即修改數據庫        commit;--提交事務,讓這個事物中的sql當即執行數據的操做,        rollback;--回滾事務,取消這個事物,這個事物不會對數據庫中的數據產生任何影響    四個特性        原子性:事務是一組不可分割的單位,要麼同時成功,要麼同時不成功        一致性:​ 事物先後的數據完整性應該保持一致        隔離性:多個用戶併發訪問數據時,一個用戶的事物不能被其它用戶的事務所幹擾,多個併發事務之間數據要相互隔離        持久性:一個事物一旦被提交,它對數據的改變就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響    四個隔離級別        讀未提交:read uncommitted --不作任何隔離,可能髒讀,幻讀        讀已提交:read committed----能夠防止髒讀,不能防止不可重複讀,和幻讀,        可重複讀:Repeatable read --能夠防止髒讀,不可重複讀,不能防止幻讀        序列化執行(串行):Serializable--數據庫運行在串行化實現,全部問題都沒有,就是性能低    修改隔離級別:        select @@tx_isolation;--查詢當前級別        set[session|global] transaction isolation level .... ;修改級別    實例:        set global transaction isolation level Repeatable read ;    pymysql事務測試        import pymysql        conn = pymysql.connect(            user="root",            password="root",            database="day48",            charset="utf8"        )        cursor = conn.cursor(pymysql.cursors.DictCursor)        # cursor.execute("delete from account where id =1")        # conn.commit()        sql = "update account set money = money - 100    where id = 2"        sq2 = "update account set moneys = money + 100    where id = 3"        try:            cursor.execute(sql)            cursor.execute(sq2)            conn.commit()            print("提交了!")        except:            print("回滾了!")            conn.rollback()    # 把你須要放在同一事務的sql執行 放在try中  最後加上commit    # 若是捕獲到異常則執行rollback4. 函數      def f1(a1,a2):         return a1 + a2      f1()      bin()      內置函數:         執行函數 select CURDATE();         blog         id       title            ctime          1        asdf        2019-11          2        asdf        2019-11          3        asdf        2019-10          4        asdf        2019-10         select ctime,count(1) from blog group ctime         select DATE_FORMAT(ctime, "%Y-%m"),count(1) from blog group DATE_FORMAT(ctime, "%Y-%m")         2019-11   2         2019-10   2      自定義函數(有返回值):         delimiter \\            create function f1(               i1 int,               i2 int)            returns int            BEGIN               declare num int default 0;               set num = i1 + i2;               return(num);            END \\         delimiter ;         SELECT f1(1,100);   4. 存儲過程      保存在MySQL上的一個別名 => 一坨SQL語句      別名()      用於替代程序員寫SQL語句      方式一:         MySQL: 存儲過程         程序:調用存儲過程      方式二:         MySQL:。。         程序:SQL語句      方式三:         MySQL:。。         程序:類和對象(SQL語句) 是一堆sql語句的集合,至關於一個py的函數    優勢:    應用程序開發者,工做量下降,    提升程序的執行效率 由於網絡io減小了    缺點:學習成本高,擴展性 維護性差    部門間溝通成本pymysql調用存儲過程    import pymysql    conn = pymysql.connect(        user="root",        password="root",        database="day48",        charset="utf8"    )    cursor = conn.cursor(pymysql.cursors.DictCursor)    cursor.callproc("p1",(2,5,1)) #pymysql 會給參數全都建立對應的變量    # 命名方式 @_p1_0  @_p1_1 @_p1_2    print(cursor.fetchall()) # 若是過程當中包含多個查詢語句  獲得的是第一條查詢語句的結果    cursor.execute("select @_p1_2")    print(cursor.fetchone())      1. 簡單         create procedure p1()         BEGIN            select * from student;            INSERT into teacher(tname) values("ct");         END         call p1()         cursor.callproc('p1')      2. 傳參數(in,out,inout)         delimiter //         create procedure p2(            in n1 int,            in n2 int         )         BEGIN            select * from student where sid > n1;         END //         delimiter ;         call p2(12,2)         cursor.callproc('p2',(12,2))      3. 參數 out         delimiter //         create procedure p3(            in n1 int,            inout n2 int         )         BEGIN            set n2 = 123123;            select * from student where sid > n1;         END //         delimiter ;         set @v1 = 10;         call p2(12,@v1)         select @v1;         set @_p3_0 = 12         ser @_p3_1 = 2         call p3(@_p3_0,@_p3_1)         select @_p3_0,@_p3_1         cursor.callproc('p3',(12,2))         r1 = cursor.fetchall()         print(r1)         cursor.execute('select @_p3_0,@_p3_1')         r2 = cursor.fetchall()         print(r2)         =======> 特殊               a. 可傳參: in   out   inout               b. pymysql                     cursor.callproc('p3',(12,2))                     r1 = cursor.fetchall()                     print(r1)                     cursor.execute('select @_p3_0,@_p3_1')                     r2 = cursor.fetchall()                     print(r2)      爲何有結果集又有out僞造的返回值?         delimiter //         create procedure p3(            in n1 int,            out n2 int  用於標識存儲過程的執行結果  1,2         )         BEGIN            insert into vv(..)            insert into vv(..)            insert into vv(..)            insert into vv(..)            insert into vv(..)            insert into vv(..)         END //         delimiter ;      5. 遊標         delimiter //         create procedure p6()         begin            declare row_id int; -- 自定義變量1            declare row_num int; -- 自定義變量2            declare done INT DEFAULT FALSE;            declare temp int;            declare my_cursor CURSOR FOR select id,num from A;            declare CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;            open my_cursor;               xxoo: LOOP                  fetch my_cursor into row_id,row_num;                  if done then                     leave xxoo;                  END IF;                  set temp = row_id + row_num;                  insert into B(number) values(temp);               end loop xxoo;            close my_cursor;         end  //         delimter ;      6. 動態執行SQL(防SQL注入)         delimiter //         create procedure p7(            in tpl varchar(255),            in arg int         )         begin            1. 預檢測某個東西 SQL語句合法性            2. SQL =格式化 tpl + arg            3. 執行SQL語句            set @xo = arg;            PREPARE xxx FROM 'select * from student where sid > ?';            EXECUTE xxx USING @xo;            DEALLOCATE prepare prod;         end  //         delimter ;         call p7("select * from tb where id > ?",9)         ===>         delimiter \\         CREATE PROCEDURE p8 (            in nid int         )         BEGIN            set @nid = nid;            PREPARE prod FROM 'select * from student where sid > ?';            EXECUTE prod USING @nid;            DEALLOCATE prepare prod;         END\\         delimiter ;
相關文章
相關標籤/搜索