MySQL数据库学习【第十二篇】pymysql模块

一、安装的两种方法

第一种

#安装
pip3 install pymysql

第二种

二、链接,执行sql,关闭(游标)

import pymysql
user= input(‘用户名:>>‘).strip()
pwd= input(‘密码:>>‘).strip()

#先链接,拿到游标
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,             database=‘day47‘,charset=‘utf8‘)
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql
sql=‘select * from user where user="%s" and password="%s";‘%(user,pwd)
print(sql) #注意%s需要加双引号
rows = cursor.execute(sql)  #拿到受影响的行数

cursor.close()
conn.close()

if rows:
    print(‘登录成功‘)
else:
    print(‘登录失败‘)

三、execute()之sql注入

注意:符号--会注释掉它之后的sql,正确的语法:--后至少有一个任意字符

根本原理:就根据程序的字符串拼接name=‘%s‘,我们输入一个xxx‘ -- haha,用我们输入的xxx加‘在程序中拼接成一个判断条件name=‘xxx‘ -- haha

最后那一个空格,在一条sql语句中如果遇到select *from t1 where id > 3 -- and name=‘egon‘;则--之后的条件被注释掉了

#1、sql注入之:用户存在,绕过密码
egon‘ -- 任意字符

#2、sql注入之:用户不存在,绕过用户与密码
xxx‘ or 1=1 -- 任意字符

解决注入

# 原来是我们对sql进行字符串拼接
# sql="select * from userinfo where name=‘%s‘ and password=‘%s‘" %(user,pwd)
# print(sql)
# rows=cursor.execute(sql)

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
sql="select * from userinfo where name=%s and password=%s" #!!!注意%s需要去掉引号,因为pymysql会自动为我们加上
rows=cursor.execute(sql,[user,pwd])#pymysql模块自动帮我们解决sql注入的问题,只要我们按照pymysql的规矩来。

四、增、删、改:conn.commit()

增:

import pymysql
先链接,拿到游标
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,database=‘day47‘)
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql   增:
sql=‘insert into user1(user,password) VALUES (%s,%s)‘
print(sql)
# rows = cursor.execute(sql,(‘xixi‘,123))  #插入一条记录
rows = cursor.executemany(sql,[(‘xixi‘,123),(‘aaa‘,456),(‘ttt‘,147)]) #插入多行记录
print(‘%s row in set (0.00 sec)‘%rows)

conn.commit() #提交到数据库
cursor.close()
conn.close()

删:

import pymysql
#先链接,拿到游标
name=input(‘>>‘).strip()
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,database=‘day47‘)
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql   删:
sql=‘delete from user1 where user =%s;‘  #删除数据
print(sql)
rows = cursor.execute(sql,(name))
print(‘%s row in set (0.00 sec)‘%rows)

conn.commit() #提交到数据库
cursor.close()
conn.close()

改:

import pymysql
#先链接,拿到游标
id=input(‘>>‘).strip()
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,database=‘day47‘)
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql   改:
sql=‘ update user1 set password = "5555555" where id=%s;‘
print(sql)
rows = cursor.execute(sql,(id))
print(‘%s row in set (0.00 sec)‘%rows)

conn.commit() #提交到数据库
cursor.close()
conn.close()

五、查:fetchone,fetchmany,fetchall

---------查fetchone,fetchmany,fetchall-----------
import pymysql
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,database=‘day47‘)
cursor=conn.cursor() #拿到游标,即mysql >
#执行sql   查:
sql=‘select * from user1;‘
rows = cursor.execute(sql)

#查单条fetchone
res1=cursor.fetchone()
res2=cursor.fetchone()
res3=cursor.fetchone()
print(res1)
print(res2)
print(res3)
print(res3[0])
#查多条fetchmany
print(cursor.fetchmany(3))
print(cursor.fetchone())
#查所有fetchall
print(cursor.fetchall())
print(cursor.fetchone())

#-------光标的移动--------
#1.绝对路径:从文件的开头位置算起
print(cursor.fetchall())
cursor.scroll(1,mode=‘absolute‘)
print(cursor.fetchone())
cursor.scroll(3,mode=‘absolute‘)
print(cursor.fetchone())

#2.相对路径:
print(cursor.fetchone())
print(cursor.fetchone())
cursor.scroll(2,mode=‘relative‘) #相对于上面的两条向后移两条
print(cursor.fetchone())

print(‘%s row in set (0.00 sec)‘ %rows)
cursor.close()
conn.close()

六、获取插入的最后一条数据的自增ID

------查看表中最后一行的iD
import pymysql
conn=pymysql.connect(host=‘localhost‘,user=‘root‘,password=‘123456‘,             database=‘day47‘,charset=‘utf8‘)
cursor=conn.cursor()

sql=‘insert into user1(user,password) values(%s,%s);‘
rows=cursor.execute(sql,(‘alex‘,‘123‘))
# rows=cursor.executemany(sql,[(‘yuanhao‘,‘123‘),(‘laowu‘,‘123‘),(‘kgf‘,‘12323‘)])
conn.commit()
print(cursor.lastrowid)  #查看表中最后一行的iD

cursor.close()
conn.close()

原文地址:https://www.cnblogs.com/xiaohema/p/8454998.html

时间: 2024-07-30 11:24:40

MySQL数据库学习【第十二篇】pymysql模块的相关文章

python学习[第十二篇] 数据类型之 集合

python学习[第十二篇] 数据类型之 集合 集合概念 python中集合是一组无序排列的哈希值.集合分为两种可变集合(set)和不可变集合(frozenset) 对可变集合可以修改和删除元素,对于不可变集合不允许.可变集合是不可以哈希的,因此既不能用作字典的键,也不能做其他集合的元素. 集合的增删改查 集合的创建于赋值 集合与列表([]) 和字典({})不同,集合没有特别的语法格式.列表和字典可以通过他们自己的工厂方法创建,这也是集合的唯一的创建方式.set()和frozenset() #创

Mysql数据库理论基础之十二 ---- 备份与还原

一.简介 由MySQL AB公司开发,是最流行的开放源码SQL数据库管理系统,主要特点: 1.是一种数据库管理系统 2.是一种关联数据库管理系统 3.是一种开放源码软件,且有大量可用的共享MySQL软件 4.MySQL数据库服务器具有快速.可靠和易于使用的特点 5.MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中 InnoDB存储引擎将InnoDB表保存在一个表空间内,该表空间可由数个文件创建.这样,表的大小就能超过单独文件的最大容量.表空间可包括原始磁盘分区,从而使得很大的表成为可能

MySQL数据库学习【第七篇】单表查询

先创建表 #创建表 create table employee( id int not null unique auto_increment, name varchar(20) not null, sex enum('male','female') not null default 'male', #大部分是男的 age int(3) unsigned not null default 28, hire_date date not null, post varchar(50), post_com

MySQL数据库学习【第三篇】增删改查操作

注意:1.如果你在cmd中书命令的时候,输入错了就用\c跳出 2.\s查看配置信息 一.操作文件夹(库) 增:create database db1 charset utf8; 删:drop database db1; 改:alter database db1 charset gbk; 查:show databases; #查看所有的数据库 show create database db1; #查看db1数据库 二.操作文件(表) 切换到文件夹下:use db1 增:create table t

MySQL数据库学习【第六篇】表与表之间的关系

表1 foreign key 表2 则表1的多条记录对应表2的一条记录,即多对一 利用foreign key的原理我们可以制作两张表的多对多,一对一关系 多对多: 表1的多条记录可以对应表2的一条记录 表2的多条记录也可以对应表1的一条记录 一对一: 表1的一条记录唯一对应表2的一条记录,反之亦然 分析时,我们先从按照上面的基本原理去套,然后再翻译成真实的意义,就很好理解了 1.先确立关系 2.找到多的一方,吧关联字段写在多的一方 一.多对一或者一对多(左边表的多条记录对应右边表的唯一一条记录)

【转】MYSQL入门学习之十二:存储过程的基本操作

转载地址:http://www.2cto.com/database/201212/177380.html 存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合.可将其视为批文件,虽然它们的作用不仅限于批处理.  www.2cto.com 使用存储过程需要MySQL5及以后的版本支持. 一.为什么要使用存储过程 通过把处理封闭在容易使用的单元中,简化复杂的操作: 将一系列处理步骤放到同一存储过程中,保证了数据的完整性和操作的安全性: 简化对变更的管理: 提高性能.使用存储过程比

MySql数据库学习笔记(二)—MySQL使用

1.基本命令 1. 连接数据库 mysql –u用户名 –p密码 –h主机IP 2. 创建数据库 mysql> create database 数据库名 3. 创建表 mysql> create table 表名(列名 类型 primary key(定义主键) auto_increment ) 4. 查看所有数据库 mysql> show databases; 5. 选择数据库 mysql> use 数据库名; 6. 查看数据库所有的表 mysql> show tables;

MySQL数据库学习【第五篇】完整性约束

一.介绍 约束条件与数据类型的宽度一样,都是可选参数 作用:用于保证数据的完整性和一致性主要分为: PRIMARY KEY (PK) 标识该字段为该表的主键,可以唯一的标识记录 FOREIGN KEY (FK) 标识该字段为该表的外键 NOT NULL 标识该字段不能为空 UNIQUE KEY (UK) 标识该字段的值是唯一的 AUTO_INCREMENT 标识该字段的值自动增长(整数类型,而且为主键) DEFAULT 为该字段设置默认值 UNSIGNED 无符号 ZEROFILL 使用0填充

MySQL数据库学习【第八篇】多表查询

一.准备 首先先准备表 员工表和部门表 #建表 create table department( id int, name varchar(20) ); create table employee1( id int primary key auto_increment, name varchar(20), sex enum('male','female') not null default 'male', age int, dep_id int ); #插入数据 insert into depa

Python学习(十二)—— 常见模块

常见内置模块 time模块 时间戳(单位是秒,代表由1970年元旦凌晨至今过去的时间),常用于计算 .time(): 1 import time 2 #时间戳,单位是s 3 print(time.time()) 4 # 1583246063.46606 结构化时间 (显示当地当前的精确时间 年月日...).localtime() 1 print(time.localtime()) 2 # time.struct_time(tm_year=2020, tm_mon=3, tm_mday=3, tm