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())