首页 > 数据库 >pymysql模块

pymysql模块

时间:2024-01-19 20:55:33浏览次数:42  
标签:语句 pymysql cursor 模块 sql print conn

支持python代码操作数据库MySQL

#安装, 不用考虑版本
pip3 install pymysql

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

 

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

#链接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test',
    charset='utf8')

#生成一个游标对象,类似终端的光标,等待输入sql命令
cursor=conn.cursor()                                  #执行完毕返回的结果集默认以元组显示,无法区分数据的含义
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor) #加入参数,表示将查询结果以字典的形式返回

#执行sql语句
sql='select * from userinfo where name="%s" and password="%s"' %(user,pwd) #注意%s需要加引号
print(sql)
res=cursor.execute(sql) #执行sql语句,execute返回的是你当前sql语句所影响/作用的行数,表示命令执行成功,该返回值一般不用
print(res)

cursor.close()
conn.close()

if res:
    print('登录成功')
else:
    print('登录失败')

 

2 execute()之sql注入 

什么是sql注入?

利用一些语法的特性,书写一些特定的语句实现固定的语法,sql注入有很多种形式,注释语法是最有代表性的,MySQL利用的是MySQL的注释语法。

日常生活中很多软件在注册的时候都不能含有特殊符号,因为怕你构造出特定的语句入侵数据库,不安全。

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

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

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

在上例中,输入用户名与密码时,sql语句是自己拼接的,如果书写如下特定语句,在MySQL中会识别为注释语法
#1、sql注入之:用户存在,绕过密码
egon' -- 任意字符 
select * from user where name ='egon' --abcdefg and password=''  #--相当于把后面的语句注释了,因此不输密码也能登录


#2、sql注入之:用户不存在,绕过用户与密码
xxx' or 1=1 -- 任意字符
select *from user where name = 'xxx' or 1=1 --abcdefg and password =''  #1=1成立,修改了name的条件,密码注释掉了,没有用户名和密码也能登录

 

解决方法:

敏感的数据不要自己做拼接操作,交由固定模块帮你去过滤数据,防止sql注入,pymysql中利用的是execute

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

#改写为(execute帮我们做字符串拼接,我们无需且一定不能再为%s加引号了)
#不要手动拼接数据,先用%s占位,之后将需要拼接的数据直接交给execute方法即可,注意:只能识别%s
sql="select * from userinfo where name=%s and password=%s"   #注意%s需要去掉引号,因为pymysql会自动为我们加上
res=cursor.execute(sql,(user,pwd))  #自动识别sql里面的%s用后面元组里面的数据替换

 

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

查不涉及数据修改,增删改的操作涉及到数据修改,因此在输入命令后不能直接执行,需要二次确认

3.1 insert

import pymysql
#链接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test',
    autocommit=True) #commit改为自动提交
#游标
cursor=conn.cursor()

#执行sql语句
#part1
sql='insert into userinfo(name,password) values("root","123456");'
res=cursor.execute(sql) #执行sql语句,返回sql影响成功的行数
print(res)

#part2 
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.execute(sql,("root","123456")) #执行sql语句,返回sql影响成功的行数
print(res)

#part3  一次性增加多条数据,列表套元祖的格式
sql='insert into userinfo(name,password) values(%s,%s);'
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")]) #执行sql语句,返回sql影响成功的行数
print(res)

conn.commit()  #提交后才发现表中插入记录成功
cursor.close()
conn.close()

3.2 delete

 

 

 

import pymysql
#链接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test',
    autocommit=True) #commit改为自动提交
#游标
cursor=conn.cursor()

#执行sql语句
sql='delete from user where id=1'
rows=cursor.execute(sql)  #执行sql语句,返回sql影响成功的行数
print(rows)

conn.commit()  #提交后才发现表中插入记录成功
cursor.close()
conn.close()

3.3 update

import pymysql
#链接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test',
    autocommit=True) #commit改为自动提交
#游标
cursor=conn.cursor()

#执行sql语句
sql='update user set name='egon_sb' where id=1'
rows=cursor.execute(sql)  #执行sql语句,返回sql影响成功的行数
print(rows)

conn.commit()  #提交后才发现表中插入记录成功
cursor.close()
conn.close()

 

4 查:fetchone,fetchmany,fetchall

import pymysql
#链接
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test')
#游标
cursor=conn.cursor()

#执行sql语句
sql='select * from userinfo;'
rows=cursor.execute(sql)  #执行sql语句,返回sql影响成功的行数rows, 将结果放入一个集合等待被查询

#获取命令的执行结果
#读取数据类似文件光标的移动,同时执行五条命令,每取一条数据,光标就往后移动
res1=cursor.fetchone()     #只拿一条,结果是数据本身
res2=cursor.fetchone()
res3=cursor.fetchone()
res4=cursor.fetchmany(2)   #可以传入数字作为参数,指定拿几条数据
res5=cursor.fetchall()     #拿到所有数据
print(res1)
print(res2)
print(res3)
print(res4)
print(res5)
print('%s rows in set (0.00 sec)' %rows)

cursor.close()
conn.close()

'''
(1, 'root', '123456')
(2, 'root', '123456')
(3, 'root', '123456')
((4, 'root', '123456'), (5, 'root', '123456'))
((6, 'root', '123456'), (7, 'lhf', '12356'), (8, 'eee', '156'))
rows in set (0.00 sec)
'''

控制光标移动的两种方式

# cursor.scroll(3,mode='absolute') # 相对绝对位置移动,相对于数据的开头(0个数据的位置),往后移动三位
# cursor.scroll(3,mode='relative') # 相对当前位置移动,相对于当前位置往后移动三位

 

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

import pymysql
conn=pymysql.connect(
    host='localhost',
    port=3306,
    user='root',
    password='123',
    database='db_test')

cursor=conn.cursor()

sql='insert into userinfo(name,password) values("xxx","123");'
rows=cursor.execute(sql)
print(cursor.lastrowid) #在插入语句后查看

conn.commit()
cursor.close()
conn.close()

 

标签:语句,pymysql,cursor,模块,sql,print,conn
From: https://www.cnblogs.com/-hz01/p/17975574

相关文章

  • 【技术探讨】无线通信模块拉距测试,是否一定要带笔记本电脑?
        用户购买无线模块后,一般第一步就是进行拉距测试,通常是准备2个笔记本电脑,一部电脑是放在在办公室有人值守,另外一部电脑在外场,双方使用手机或微信进行实时沟通测试结果,对于Sub-G的无线模块通常通信距离较远可以达到公里级甚至数公里之远,而笔记本的续航时间通常是2-3个小......
  • mybatis-plus作为maven分模块dao层引入的配置
    1.maven分模块说明demo-daodemo-webdemo-web中引用demo-dao层,进行crud2.数据库配置放到哪里?放到demo-web模块的application.propertiesspring.datasource.driver-class-name=@[email protected][email protected]@[email protected]@......
  • BOSHIDA DC电源模块的工作原理及特点
    BOSHIDADC电源模块的工作原理及特点DC电源模块是一种将交流电转换为直流电的电子设备。它通常由交流电输入部分、整流滤波部分和稳压输出部分组成。下面是其工作原理及特点的详细解释: 工作原理:1.交流电输入部分:将交流电输入到电源模块,通常通过变压器将高压的交流电转换为低......
  • 低功耗DC-DC电源模块的精细化PCB设计
    在电子设备中,电源模块是核心组件,将输入直流电压转为设备所需的各种直流电压。DC-DC电源转换器,特别是基于开关方式的转换器,因其高效、小体积和轻重量等优点被广泛应用。但设计优秀的DC-DC电源转换器并不容易。布局、电磁兼容性、电流和散热管理等方面均需深思熟虑和精细调整。 ......
  • Ansible命令格式和常用模块介绍
    Ansible命令格式和常用模块介绍Ansible命令格式介绍Ansible命令格式ansible[群组名]-m[模块名]-a[参数]Ansible命令返回值的颜色表示绿色:代表对远程节点不进行相应修改,没有发生改变,命令执行成功黄色:代表对远程节点进行了相应的修改,命令执行成功红色:代表命令执行失败或......
  • BOSHIDA 探索直流电源模块的应用领域
    BOSHIDA探索直流电源模块的应用领域直流电源模块广泛应用于许多领域,包括电子设备、通信、工业自动化、航空航天等。以下是一些常见的应用领域: 1.电子设备:直流电源模块用于给各种电子设备供电,如计算机、手机、平板电脑、摄像机等。2.通信:直流电源模块用于为通信设备供电,如......
  • win32com模块--------------------------------word文档转换PDF文档(格式转换)
    上代码:fromwin32com.clientimportgencachefromwin32com.clientimportconstants,gencache'''win32com库是Python语言与Windows操作系统中的COM(ComponentObjectModel)接口进行交互的工具库。它允许开发者使用Python来操作Windows系统中的各种COM组件,例如Office软件(Word、Exc......
  • Maven使用${revision}实现多模块版本统一管理
    父pom: <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://mave......
  • RocketMQ 中冷热分离的随机索引模块详解
    作者:苏昌盛消息系统中随机索引的特点RocketMQ广泛使用于各类业务场景中,在实际生产场景中,用户通常会选择消息ID或者特定的业务Key(例如学号,订单号)来查询和定位特定的一批消息,进而定位分布式系统中的复杂问题。传统方案下,消息索引的存储是基于数据库系统或者基于本地文件系统实现......
  • 多模块之间的循环依赖:java: Annotation processing is not supported for module cycl
    问题描述java:Annotationprocessingisnotsupportedformodulecycles.Pleaseensurethatallmodulesfromcycle[BDCloud-business,BDCloud-admin]areexcludedfromannotationprocessing  本质:BDCloud-admin模块为主启动模块,其包含了BDCloud-business模块;但在......