python學習----9.18----視圖,sql注入問題,事務,存儲過程

視圖是什麼?python

  本質是一張虛擬的表,他的數據來自select語句mysql

有什麼用?sql

  功能1:原表安全,隱藏部分數據,開放指定的數據數據庫

  功能2:由於視圖能夠將查詢結果保存特性 我能夠用視圖來達到減小書寫sql的次數編程

    例如:select *from emp where dept_id=(select id from dept where name="市場");安全

      要查詢市場的人服務器

      create view test_view as select *from emp where dept_id=(select id from dept where           name="市場")網絡

      將查詢結果做爲一個視圖,之後在使用到這個需求 就直接查看視圖併發

如何使用?編程語言

  建立視圖:create view test_view as select *from t1;

 

特色:

  1.每次對視圖進行的查詢 其實都是再次執行了 as 後面的查詢語句

  2.能夠對視圖進行修改 修改會同步到原表

  3.視圖是永久存儲的 存儲的不是數據  而就是一條 as sql語句

 

 

 

sql注入問題

  sql注入攻擊指的是 一些瞭解sql一些瞭解sql語法的 用戶 能夠輸入一些關鍵字 或合法sql 來致使原始的sql邏輯發生變化 從而跳過登陸驗證 或者 刪除數據庫

  如何避免 在接受用戶輸入的數據時 能夠加上限制 好比 不能輸 -- ' ; where 等等

  上面這種方式 只能避免 黑客 從你的客戶端軟件注入 sql可是沒法避免 中間人攻擊(在你的客戶端和服務器中間加一箇中轉服務器)這樣就繞過了客戶端的輸入限制 此時 只能將sql合法性驗證放在服務器端

  

  總結: python如何避免sql注入? 把你的slq(用戶輸入的)參數 放execute函數的arg參數中  讓pymysql 自動幫你屏蔽注入攻擊

 

 

  

import  pymysql

conn = pymysql.Connect(
    user="root",
    password="admin",
    host="localhost",
    database="mysql2",
    charset="utf8"
)

cursor = conn.cursor(pymysql.cursors.DictCursor)

#sql = "select *from user where user = '%s' and pwd = '%s';" % (input("input userName"),input("input password"))

# 當用戶輸入的用戶名爲字符串 爲 yy' --   時
# 最終產生的sql  select *from user where user = 'yy' -- ' and pwd = '987657890';
# -- 用於mysql註釋  意思是 後面的內容忽略掉
# 從而致使 密碼是否正確都能登陸成功
# "select *from user where user = 'axxax' or 1=1;

#print(sql)
count = cursor.execute("select *from tec where user = %s and pwd = %s;",args=(input("user"),input("pwd")))

print(count)
if count:
    print("login success")
else:
    print("login error")

cursor.close()
conn.close()

 

 

事務

  是一組sql語句的集合

  事務的特性:

      1.原子性

        事務是一個總體 不可分割

      2.隔離性

        事務之間要相互隔離,爲了維護數據完整性

        由於併發訪問 致使的一些問題:

            1.髒讀:一個事務讀到了另外一個事務未提交的數據 查詢以前要保證全部更新都已經完成

            2.幻讀: 一個查詢事務沒有結束時,數據被另外一個事務 執行insert  delete操做

            3.不可重複讀: 一個事務在查詢 另外一個事務在update

        四種隔離級別:讀未提交   讀已提交   可重複讀   串行化

      3.一致性

          當事務執行後 全部的數據都是完整的(外鍵約束 非空約束)

      4.持久性

          一旦事務提交 數據就永久保存

      強調:事務就是 一堆sql語句的集合  他們是原子性的 要麼所有執行  要麼都不執行

      mysql 這個客戶端 默認開啓自動提交 一條sql語句就是一個單獨的事務

      事務須要掌握: start transaction; 開啓一個事務

              commit 提交事務

              rollback  回滾事務

 

 

存儲過程是什麼?
    你能夠理解爲mysql的編程語言
    爲何 有了python 還要弄出來這種編程語言?

    他的做用  能夠將你的程序業務邏輯 放到mysql中來處理
        這樣能夠下降網絡訪問次數 從而提升你的程序效率

    既然如此 你能不能把全部與數據存儲相關的業務邏輯 全都放mysql中?
        能
    可是 對於公司而言 須要再請一個 mysql開發者
    對於你我的來講 提升溝通成本

    三種開發的模型
    對於一樣一個業務  你能夠放到python也能夠放到mysql 有什麼區別?


       1. 應用程序  處理邏輯
            須要手動編寫 sql語句
            優勢:執行效率高
            缺點: 開發效率低
          mysql


       2.
          應用程序

          mysql 處理邏輯
            特色: 應用程序開發者不須要須要手動編寫 sql語句
                  mysql開發者來編寫

            優勢: 應用程序開發效率高
            缺點: 執行效率略低,溝通成本增高

        3.使用 ORM(object relation map) 對象關係映射
            自動幫你生成對應的sql語句 好比你要註冊用戶 原本要寫insert 語句  如今使用orm調用save(用戶對象)
            優勢:開發效率高
            缺點:執行效率下降


        存儲過程至關於python中的一個函數
        簡單地說 學習存儲過程就是學習 如何使用mysql編寫一個函數

        語法:
            create procedure 過程的名稱 ({in,out,inout} 參數名稱 數據類型)
            begin
                具體的sql代碼
            end
            參數前面須要指定參數的做用
            in 表示該參數用於傳入數據
            out 用於返回數據
            inout 便可傳入 也可返回

            參數類型是 mysql中的數據類型

         案例:建立一個存儲過程 做用是將兩個整數相加
            create procedure add_p (in a int,in b int)
            begin
                select a + b;
            end

            //
      調用 call add_p(1,2)

         案例:建立一個存儲過程 做用是將兩個整數相加 將結果保存在變量中
        定義一個變量
        set @su = 100;
            create procedure add_p2 (in a int,in b int,out su int)
            begin
                set su = a + b;
            end

            //
    
    定義變量 set @su = 100;
    調用過程 call  add_p2(10,20,@su);

          注意  在存儲過程當中 須要使用分號來結束一行 可是分號有特殊含義
          得將原始的結束符 修改成其餘符號
            delimiter // 結束符更換爲//
            delimiter;

          mysql中的if語句
          if 條件 then
            代碼
          elseif 條件 then
            代碼
          else then
            代碼
          end if;

     案例:
         使用存儲過程 完成  輸入 一個 數字 1或2   顯示 壹 或 貳
            create procedure show_p (in a int)
            begin
            if a = 1 then
                select "";
            elseif a = 2 then
                select "";
            else
                select "other";
            end if;
            end //
存儲過程
相關文章
相關標籤/搜索