視圖是什麼?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 //