pymysql

# 增删改操作

import pymysql

client=pymysql.connect(

host='127.0.0.1',

port=3306,

user='root',

password='egon123',

database='db2',

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:事务,交易

# 1、原子性:事务可以包含一系列的sql语句,事务的执行具有原子性

#2、回滚:包含多条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())

pymysql与mysql各功能的更多相关文章

  1. Python3中使用PyMySQL连接Mysql

    Python3中使用PyMySQL连接Mysql 在Python2中连接Mysql数据库用的是MySQLdb,在Python3中连接Mysql数据库用的是PyMySQL,因为MySQLdb不支持Pyt ...

  2. Python 3.2: 使用pymysql连接Mysql

    在python 3.2 中连接MYSQL的方式有很多种,例如使用mysqldb,pymysql.本文主要介绍使用Pymysql连接MYSQL的步骤 1        安装pymysql ·       ...

  3. pymysql:Mysql拒绝从远程访问的解决办法

    pymysql:Mysql拒绝从远程访问的解决办法 pymysql连接数据库 # 导入pymysql模块 import pymysql # 连接database conn = pymysql.conn ...

  4. pymysql操作mysql

    一.使用PyMySQL操作mysql数据库 适用环境 python版本 >=2.6或3.3 mysql版本>=4.1 安装 可以使用pip安装也可以手动下载安装.使用pip安装,在命令行执 ...

  5. Python3.x使用PyMysql连接MySQL数据库

    Python3.x使用PyMysql连接MySQL数据库 由于Python3.x不向前兼容,导致Python2.x中的很多库在Python3.x中无法使用,例如Mysqldb,我前几天写了一篇博客Py ...

  6. python基础学习24----使用pymysql连接mysql

    使用pymysql连接mysql 安装pymysql pymysql安装可以通过两种方式 使用pip安装 首先简单说一下pip的使用方法 获取帮助 pip --help 升级 pip pip inst ...

  7. MySQL日志功能详解

    MySQL日志功能详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询日志 它是用来保存所有跟查询相关的日志,这种日志类型默认是关闭状态的,因为MySQL的用户有很多,如果 ...

  8. Python3.x:使用PyMysql连接Mysql数据库

    Python3.x:使用PyMysql连接Mysql数据库 Python3.x完全不向前兼容,导致Python2.x中可以正常使用的库,到了Python3就用不了: 比如说mysqldb,目前MySQ ...

  9. mysql分区功能(三个文件储存一张表)(分区作用)(分区方式)

    mysql分区功能(三个文件储存一张表)(分区作用)(分区方式) 一.总结 1.mysql数据表的存储方式(三个文件储存一张表): 一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放 ...

随机推荐

  1. 转 一次完整地http请求

    作者:斯巴达克斯 时间:January 11, 2014 分类:WEB 声明:本文章中的说法仅是个人理解总结,不一定完全正确,但是可以有助于理解. 关于HTTP协议可以参考以下: HTTP协议漫谈 h ...

  2. gpio子系统和pinctrl子系统(下)

    情景分析 打算从两个角度来情景分析,先从bsp驱动工程师的角度,然后是驱动工程师的角度,下面以三星s3c6410 Pinctrl-samsung.c为例看看pinctrl输入参数的初始化过程(最开始的 ...

  3. idea和maven使用的点点滴滴

    1.如果在使用maven打包时想跳过单元测试,可以在pom文件中配置如下代码 <build> <plugins> <plugin> <groupId>o ...

  4. linux命令(41):watch命令

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...

  5. C#进行Socket通信编程之一

    关于Socket编程的相关资料(含实例)在网上多如牛毛,而我写这篇文章的初衷仅仅是为了记录自己的一些心得体会. Socket提供了这样一个接口,可以方便地使程序员通过其来发送和接收网络上的数据.在利用 ...

  6. maven项目的pom.xml文件详解

    <project xmlns="http://maven.apache.org/POM/4.0.0 " 2 xmlns:xsi="http://www.w3.org ...

  7. hdu5798

    官方题解: 考虑去掉abs符号,发现只有相邻两个数的最高位被影响了才会影响abs的符号,所以可以按照最高位不一样的位置分类,之后考虑朴素枚举x从0到2^20,每次的复杂度是O(400),无法通过,考虑 ...

  8. CSS布局和居中常用技巧

    1.常用居中方法 居中在布局中很常见,我们假设DOM文档结构如下,子元素要在父元素中居中: <div class="parent"> <div class=&qu ...

  9. 五十九 数据库访问 使用MySQL

    MySQL是Web世界中使用最广泛的数据库服务器.SQLite的特点是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应用.而MySQL是为服务器端设计的数据库,能承受高并发访问,同时占用的内存也 ...

  10. LeetCode 461 汉明距离/LintCode 365 统计二进制中1的个数

    LeetCode 461. 汉明距离 or LintCode 365. 二进制中有多少个1 题目一:LeetCode 461. 汉明距离 LeetCode 461.明距离(Hamming Distan ...