pymysql與mysql各功能

pymysqlpython

 

# 增刪改操做mysql

import pymysqlsql

 

client=pymysql.connect(fetch

    host='127.0.0.1',日誌

    port=3306,對象

    user='root',blog

    password='egon123',事務

    database='db2',ip

    charset='utf8'開發

)

 

cursor=client.cursor()

 

# insert的三種方法:

# 方法一

sql='insert into t1 values(1,"egon"),(2,"lxx");'  # 原生sql語句

try:  # 下面省略異常捕捉

    res=cursor.execute(sql)

    print(res)  # 返回的是執行表操做條數

    client.commit()  # 遞交後纔會改變數據

except Exception:

    client.rollback()  # 若是字段有誤就能恢復修改前數據

 

#方法二

userinfo=[

    (3,"alex"),

    (4,"lxx"),

    (5,"yxx")

]

for user in userinfo:

         sql = ‘insert into t1 values(%s,」%s」);’ %(user[0],user[1])

         cursor.execute(sql)

 

#方法三

sql = ‘insert into t1 values(%s,%s);’

cursor.executemany(sql,userinfo)

 

# 刪除方法

cursor.execute(‘delete from t1 where id=3;’)

client.commit()

cursor.close()

client.close()

 

#查詢操做

Import pymysql

 

client=pymysql.connect(

    host='127.0.0.1',

    port=3306,

    user='root',

    password='egon123',

    database='db6',

    charset='utf8'

)

 

cursor =client.cursor()

inp_user=input('輸入帳號名: ').strip()

inp_pwd=input('輸入密碼: ').strip()

 

sql='select id from user where name = "%s" and pwd = password("%s");' %(inp_user,inp_pwd)

rows = cursor.execute(sql)

 

# 這個方法能夠防止注入問題

# sql = 'select id from t1 where name =%s and password = %s; ' # 注意:帳號密碼不用引號了

# rows = cursor.execute(sql,(inp_user,inp_pwd))  # 這句防注入問題

 

if rows:

         print(‘登陸成功’)

else:

         print(‘用戶名或密碼錯誤’)

 

cursor.close()

client.close()

# 不作任何處理會產生注入問題,好比輸入帳號時輸入alex "-- sadafas  

或   sadgasd " or 1=1 – sfaf相似的能夠直接登陸

 

視圖

強調:1.字段名不能重複

          2.視圖是爲了簡化查詢的sql語句,不該該修改視圖中的記錄

create view emp2dep as select emp.*,dep.name as dep_name from emp inner join dep on

emp.dep_id = dep.id;

 

觸發器

準備表

CREATE TABLE cmd (

    id INT PRIMARY KEY auto_increment,

    USER CHAR (32),

    priv CHAR (10),

    cmd CHAR (64),

    sub_time datetime, #提交時間

    success enum ('yes', 'no') #0表明執行失敗

);

 

CREATE TABLE errlog (

    id INT PRIMARY KEY auto_increment,

    err_id int

);

 

delimiter $$  # 改變結束條件

CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW # 建立觸發器

BEGIN

    if NEW.success = 'no' then  # if

        insert into errlog(err_id) values(NEW.id);

    end if;

END $$

delimiter ;  # 必須改回結束條件

 

INSERT INTO cmd (

    USER,

    priv,

    cmd,

    sub_time,

    success

)

VALUES

    ('egon','0755','ls -l /etc',NOW(),'yes'),

    ('egon','0755','cat /etc/passwd',NOW(),'no'),

    ('egon','0755','useradd xxx',NOW(),'no'),

    ('egon','0755','ps aux',NOW(),'yes');

#查詢錯誤日誌,發現有兩條

#觸發器可用於插入刪除更新的先後

 

刪除觸發器:drop trigger tri_after_insert_cmd;

 

transaction:事務,交易

# 一、原子性:事務能夠包含一系列的sql語句,事務的執行具備原子性

#二、回滾:包含多條sql語句要麼都執行成功,要麼都執行不成功

create table user(

id int primary key auto_increment,

name char(32),

balance int

);

 

insert into user(name,balance)

values

('wsb',1000),

('egon',1000),

('ysb',1000);

 

#出現異常,回滾到初始狀態

start transaction;

update user set balance=900 where name='wsb'; #買支付100元

update user set balance=1010 where name='egon'; #中介拿走10元

uppdate user set balance=1090 where name='ysb'; #賣家拿到90元,出現異常沒有拿到

rollback;

commit;

 

存儲過程

方案一:

    應用程序:

    mysql:編寫存儲過程

方案二:

    應用程序:原生sql

    mysql:

方案三:

    應用程序:ORM(類/對象 --->原生sql)

    mysql:

 

執行效率:

    方案一 > 方案二 -> 方案三

開發效率:

    方案一 > 方案三 -> 方案二

因爲方案一所需的人員成本較高,咱們通常使用方案三

 

# 無參

create table s1(

id int,

name varchar(20),

gender char(6),

email varchar(50)

)

 

delimiter $$

create procedure p2()

BEGIN

         declare n int default 1;  #設置整型n的初始值爲1

         while (n < 100) do

                  insert into s1 values(n,concat(‘egon’,n),’male’,concat(‘egon’,n,’@163.com’));

                  set n = n+1  # 注意不能用 n+=1

         end while;

END $$

delimiter;

 

# 有參

delimiter $$

create procedure p3(

         in n int,  # 傳入的值

         out res int  # 傳出的值

)

BEGIN

         select * from blog where id >n;

         set res = 0;

END $$

delimiter;

 

# 直接在mysql中調用:

mysql> set @x=111;
mysql> call p3(3,@x);
mysql> select @x;

能夠查到@x的值變爲了0

# 在python中調用:

cursor.callproc('p4',(3,111)) #set @_p4_0 = 3; set @_p4_1 = 111

print(cursor.fetchall())

cursor.execute('select @_p4_1;')

print(cursor.fetchone())

相關文章
相關標籤/搜索