pymysql

Posted 郭东东郭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pymysql相关的知识,希望对你有一定的参考价值。

-- 授权加创建mysql账号一步到位,%代表远程
grant all on *.* to 'gudon'@'%' identified by '123';
mysql> flush privileges;  -- 使操作结果立即生效
-- 建表
mysql> select * from userinfo;
+----+--------+-------+
| id | user   | pwd   |
+----+--------+-------+
|  1 | gudon  | 123   |
|  2 | Astro  | 1234  |
|  3 | Nurato | 12345 |
+----+--------+-------+

# pip3 install pymysql
import pymysql

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


# 建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='gudon',
    password='123',
    db='db9',
    charset='utf8'
)

# 拿到游标
cursor = conn.cursor()

# 执行sql
sql = 'select * from userinfo where user = "%s" and pwd = "%s"' %(user, pwd)

rows = cursor.execute(sql)

cursor.close()
conn.close()

# 进行判断
if rows:
    print('登录成功')
else:
    print('登录失败')
    
-------------------结果----------------------
user>>gudon
pwd>>123
登录成功

?

sql注入:

user>>gudon "-- xxxx
pwd>>
登录成功

-- 此时sql 为 
select * from userinfo where user = "gudon "-- xxxx" and pwd = ""
后面的条件被注释掉了


user>>xxx" or 1=1 -- xxx
pwd>>
登录成功
实际执行的sql为 select * from userinfo where user = "xxx" or 1=1 -- xxx" and pwd = ""

sql注入解决办法:

# 执行sql
sql = 'select * from userinfo where user=%s and pwd=%s'
rows = cursor.execute(sql, (user, pwd))

?

?

2 增删改查

(1)增删改

import pymysql

# 建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='gudon',
    password='123',
    db='db9',
    charset='utf8'
)
# 拿游标
cursor = conn.cursor()
# 执行sql
# 增、删、改
sql = 'insert into userinfo(user,pwd) values (%s,%s)'

# 插入单条数据
# rows = cursor.execute(sql,('jack','123'))
# print(rows)

# 插入多条数据
rows = cursor.executemany(sql,[('gd01','123'),('gd02','123'),('zs','123')])
print(rows)
conn.commit()  # commit 后才会真正更改数据库中的数据

# 关闭
cursor.close()
conn.close()

?

(2) 查

import pymysql

# 建连接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='gudon',
    password='123',
    db='db9',
    charset='utf8'
)
# 拿游标
# cursor = conn.cursor()
cursor = conn.cursor(pymysql.cursors.DictCursor) # 使查询结果为字典格式

# 执行sql
# 查
sql = 'select * from userinfo'

# 插入单条数据
rows = cursor.execute(sql)  # 返回查询条数

# print(cursor.fetchone())  # (1, 'gudon', '123')
# print(cursor.fetchone())  # (2, 'Astro', '1234')
# 取到最后一个没有数据了,则返回None

print(cursor.fetchmany(2))  # 指定取出条数
# [{'id': 1, 'user': 'gudon', 'pwd': '123'}, {'id': 2, 'user': 'Astro', 'pwd': '1234'}]

# print(cursor.fetchall())  # 取出所有


# cursor.scroll(3,mode='absolute') # 相对绝对位置移动,从0开始数3个,下次取第4条
# cursor.scroll(3,mode='relative') # 相对当前位置移动 ,相对于游标目前的位置,往后数3个


# 关闭
cursor.close()
conn.close()

以上是关于pymysql的主要内容,如果未能解决你的问题,请参考以下文章

运行 tkinter+pymysql 脚本时出现 pymysql.err.ProgrammingError

pymysql.err.InterfaceError: (0, '')解决办法

Python 与 MySQL 交互

Python 与 MySQL 交互

pymysql操作

pymysql使用