日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

day-44mysql

發布時間:2025/5/22 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 day-44mysql 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

sql注入

a. 登錄驗證寫sql語句的時候, %傳值的時候, 需要加引號:sql = "select * from t4 where name = '%s' and pwd = '%s'" % (username, pwd)上面的sql語句帶來的風險是:例一:username = zekai' #select * from t4 where name = 'zekai' #' and pwd = '' 例二:username = dbsahvbdsha' or 1=1 #select * from t4 where name = 'dbsahvbdsha' or 1=1

上面出現的問題,我們稱之為 SQL注入

出現問題的根源是:
    因為太過于相信用戶的輸入, 導致我們在接受用戶輸入的參數的時候, 并沒有對他進行轉義
解決SQL注入:

    1. 自己手工對用戶輸入的值進行轉義

    2. 使用execute()自動進行過濾

        sql = "select * from t4 where name = %s and pwd = %s"

        cursor.execute(sql,(username, pwd))

?

#$## 插入一條使用
      cursor.execute(sql, ('lxxx', '1234'))

### 插入多條
      data = [
        ('aaaaa', 'aaa'),
        ('bbbb', 'bbb'),
        ('ffff', '666'),
        ('rrrr', '888'),
          ]
      cursor.executemany(sql, data)

try:
  cursor.execute(sql, ('lxxx', '1234'))
  ### 刪除和更新的時候, 需要事物提交
  conn.commit()
except Exception as e:
  conn.rollback()


cursor.lastrowid : 最后一行的行數

事務


  一組操作, 要么都成功, 要么都失敗

特性:
  原子性: 一組操作, 要么都成功, 要么都失敗
  一致性(Consistency):指事務發生前和發生后,數據的總額依然匹配
  隔離性(Isolation):簡單點說,某個事務的操作對其他事務不可見的
  持久性(Durability):當事務完成后,其影響應該保留下來,不能撤消,只能通過“另開起一個事物”來抵消之前的錯誤

場景:思考:我去銀行給朋友匯款,我卡上有1000元,朋友卡上500元,我給朋友轉賬100元(無手續費),如果,網線斷了, 我的錢剛扣,而朋友的錢又沒加時, 怎么辦?create table t11 (id int auto_increment primary key,name varchar(32) not null default '',money int not null default 0)engine=Innodb charset=utf8;insert into t11 (name,money) values ('zekai', 1000), ('eagon', 500);


解決方法:

  開啟事務 (start transaction)

    (執行sql操作)

    commit : 提交上面的SQL, 讓其生效

  rollback: 回滾

show full tables; 顯示全部類型

?

視圖

產生的原因:
  如果有一個SQL語句頻繁的會被使用到,比如說:
    select * from t4 where id>12 and id <24;

  搞一個映射,或者取一個別名
    select * from t4 where id>12 and id <24 === > v1
  視圖:
    select * from v1;
  創建視圖:
    create view v1 as select * from t4 where id>12 and id <24;
  修改視圖:
    alter view v1 as sql語句;
  刪除視圖:
    drop view v1;

問題:
  如果原生的表數據發生了變化, 那視圖會不會發生變化? 也會變化

  視圖中的數據會不會發生修改? 不會發生修改

應用場景:
  MySQL: (DBA)
  生成視圖View
程序:
  調用 select * from v1;

函數:
  不要輕易使用

  在程序中, 用代碼計算, 計算好了, 再傳給SQL語句執行


存儲過程:

  將一大堆 SQL 語句進行封裝, 類似于函數, 結果就是存儲過程

  MySQL服務端:
    DBA (寫)

a. 簡單的存儲過程:delimiter // create procedure p1()BEGINselect * from t11;END // delimiter ;程序:call p1();b. 傳參數: (in)delimiter // create procedure p2(in n1 int,in n2 int)BEGINselect * from t11 where id > n1;END // delimiter ;程序:call p2(12, 2)c. 傳入參數: (out)delimiter // create procedure p3(in n1 int,out n2 int)BEGINselect * from t11 where id > n1;set n2 = 1;END // delimiter ;set @v2=123212;call p3(12, @v2);select @v2;

觸發器:

  向用戶表中添加一條數據的同時, 在日志表中也添加一條記錄

delimiter // CREATE TRIGGER t1 BEFORE INSERT ON t7 FOR EACH ROWBEGINinsert into t11 (name, money) values ('xxx', 1234);END // delimiter ;

?

轉載于:https://www.cnblogs.com/klw1/p/11032644.html

總結

以上是生活随笔為你收集整理的day-44mysql的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。