1. 程式人生 > >mysql之檢視,事務,儲存過程

mysql之檢視,事務,儲存過程

一,檢視

什麼是檢視,本質就是一張虛擬的表,它的資料來自select語句

有什麼用?

原表的安全性

功能1,隱藏部分資料,開放指定資料

         2,檢視可以將查詢的結果儲存,可以減少書寫sql的次數

如何使用?

建立檢視

create view 檢視名 as select * from 表名;
create view test_view as select * from t1;

強調:1,在硬碟中,檢視只是表的結構檔案,沒有表的資料檔案

         2,檢視通常是用於插敘,儘量不要修改檢視中的資料

特點;1,每次對檢視進行查詢,都是執行了as後面的sql語句

         2,可以對檢視進行修改,修改會同步到原表中

        3,檢視是永久儲存的,儲存的不是資料,而是一條as sql語句

二,sql注入問題:

import pymysql
# 1,與資料庫伺服器建立連結
conn = pymysql.Connect(
    host='127.0.0.1',
    user='root',
    password='admin',
    database='day42',
    port=3306,
    charset='utf8'
)
# 2 獲取遊標物件(用於傳送和接收資料)
cursor = conn.cursor(pymysql.cursors.DictCursor)
# 3,用遊標執行sql語句

# 這樣輸入or 或者'就會使程式只匹配使用者名稱
inp_name = input('使用者名稱>>>:').strip()   #inp_user='egon"--hjkhdkhdk'  --表示後面的內容全部為註釋的
inp_psd = input('密碼>>:').strip()      #inp_psd = ''
sql = 'select * frm user where userword="%s" and password="%s"' %(inp_name,inp_psd)

rows = cursor.execute(sql)
if rows:
    print('登入成功')

else:
    print('登入失敗')
# 5,關閉連結(先關遊標,再關連結)
cursor.close()
conn.close()
# 在服務端防止sql注入問題,不要自己拼接字串
import pymysql

conn = pymysql.Connect(
    host='127.0.0.1',
    user='root',
    password='admin',
    database='day42',
    port=3306,
    charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)

inp_name = input('使用者名稱>>>:').strip()   #inp_user='egon"--hjkhdkhdk'  --表示後面的內容全部為註釋的
inp_psd = input('密碼>>:').strip()      #inp_psd = ''
sql = 'select * frm user where userword=%s and password=%s'

rows = cursor.execute(sql,(inp_name,inp_psd))    #做字串的拼接,在拼接的時候自動過濾特殊字串
# rows = cursor.execute(sql,args=(inp_name,inp_psd)) # 另一種賦值的語句
if rows:
    print('登入成功')

else:
    print('登入失敗')
cursor.close()
conn.close()

三,事務

什麼是事務?

一件事情的完成通常不可能一步到位,需要拆分多個小步驟

那麼在Mysql中一組sql語句的集合就是事務

事務的特性:

1,原子性

     事務就是一個整體,不可分割

2,隔離性

    事務之間要相互隔離,為了維護資料完整性

早併發訪問的時候,導致一些問題

         1,髒讀,一個事務讀到了另一個事務未提交的的資料(避免:查詢之前要確保所有所有的資料都已經更新完畢了)

         2,幻讀,一個查詢事務沒有結束時,資料被另一個事務執行了insert delete

         3,不可重複讀,一個查詢事務沒有結束時,資料被另一個事務執行了update

隔離級別:

         1,讀未提交

         2,讀已提交

         3,可重複讀      預設

         4,序列化

3,一致性

    當事務執行後,所有的資料都是完整的(外來鍵約束     非空約束)

4,永續性

     一旦事務提交,資料就永遠儲存

總結:mysql客戶端預設開啟就自動提交,一條sql語句就是一個單獨的事務

pymysql客戶端是預設不提交的,需要手動commit ,意思就是預設開啟了事務

四,儲存過程

包含一系列可執行的sql語句,儲存過程存放於mysql中,通過呼叫它的名字可以執行其內部的sql語句

三種開發模型:

            1,應用程式:只主要開發應用程式的邏輯

              mysql:編寫好儲存過程,以供應用程式呼叫

            優點:開發效率,執行效率都高

            缺點:考慮到認為因素,跨部門溝通等問題,會導致擴充套件性差:

            2,應用程式:除了開發應用程式的邏輯,還需要編寫原生的sql

            優點:比方式一擴充套件性高(非技術性的)

            缺點:1,開發效率,執行效率都不如方式一

                     2,編寫原生sql太過於複雜,而且需要考慮到sql語句的優化問題

            3,應用程式:開發應用程式的邏輯,不需要編寫原生的sql,基於別人編寫好的框架來處理資料

            優點:不用編寫純生的sql,這以為著開發效率比方式2高,同時相容方式二擴充套件性高的好處

            缺點:執行效率低於方式二

建立儲存過程

在mysql中呼叫儲存過程

delimiter $$
create procedure p1(
    in m int,
    in n int,
    out res int
)
begin
    select tname from teacher where tid > m and tid < n;
    set res=0;
end $$
delimiter ;

在python中呼叫儲存過程

import pymysql

conn = pymysql.Connect(
    host='127.0.0.1',
    user='root',
    password='admin',
    database='day42',
    port=3306,
    charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
cursor.callproc('p3',(3,100))
print(cursor.fetchall())   #查詢返回結果
cursor.close()
conn.close()