13-[Mysql]--pymysql模块

1、介绍

之前我们都是通过MySQL自带的命令行客户端工具mysql来操作数据库,那如何在python程序中操作数据库呢?这就用到了pymysql模块,该模块本质就是一个套接字客户端软件,使用前需要事先安装

pip3 install pymysql

    

import pymysql

user = input('user>>>').strip()
pwd = input('pwd>>>').strip()

# 建立连接
conn = pymysql.connect(
    host='127.0.0.1',       # localhost
    port=3306,
    user='root',
    password='root',
    db='db10',
    charset='utf8'
)

# 拿到游标
cursor=conn.cursor() #执行完毕返回的结果集默认以元组显示
#cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)   # 以字典显示


# 执行sql语句
sql = "select * from userinfo where username='%s' and password='%s'" % (user, pwd)       #注意%s需要加引号
rows = cursor.execute(sql)            # 执行sql语句,返回sql查询成功的记录数目

# 关闭游标
cursor.close()

# 关闭连接
conn.close()

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

    

    

    

2、execute()之sql注入

  (1)原理

  注意:符号--会注释掉它之后的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 -- 任意字符

 

  (2)解决方法:

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

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

 

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

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

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

#part3
res=cursor.executemany(sql,[("root","123456"),("lhf","12356"),("eee","156")])     # 增加多条数据
print(res)

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


# in方法的使用
triggerid = ('10011', '10010')
sql = "select * from triggers where triggerid in %s"
ret = handle.execute(sql, triggerid)
print(ret)

 

4、查:fetchone,fetchmany,fetchall

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

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

res1=cursor.fetchone()      # 取出第一条data
res2=cursor.fetchone()      # 取出next数据
res3=cursor.fetchone()
res4=cursor.fetchmany(2)      # 取出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()        

   

     

    

5、相对位置,绝对位置,获取插入的最后一条的自增id

import pymysql


# 1.建立连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='db10',
    charset='utf8'
)


# 2、拿到游标
cursor = conn.cursor(pymysql.cursors.DictCursor)        # 以字典形式显示

sql = 'select * from userinfo '
rows = cursor.execute(sql)

cursor.scroll(3, mode='absolute')  # 绝对位置移动  f.seek
print(cursor.fetchmany(2))      # 指定几条数据 

# 5.关闭游标
cursor.close()

# 6、关闭连接
conn.close()

import pymysql


# 1.建立连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='root',
    db='db10',
    charset='utf8'
)


# 2、拿到游标
cursor = conn.cursor(pymysql.cursors.DictCursor)        # 以字典形式显示

sql = 'select * from userinfo '
rows = cursor.execute(sql)
print(cursor.fetchone())        # 打印第1条
cursor.scroll(2, mode='relative')    # 相对位置移动2个
print(cursor.fetchone())        # 打印第4条

# 5.关闭游标
cursor.close()

# 6、关闭连接
conn.close()

 

  

import pymysql
conn=pymysql.connect(host='localhost',user='root',password='123',database='egon')
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()

    

原文地址:https://www.cnblogs.com/venicid/p/9033769.html