MySQL之pymysql模块

Navicat软件

我们在终端操作MySQL,既没有自动操作也无法保存,不方便开发,所以我们使用Navicat,Navicat内部封装了所有的操作数据库的命令。我们在使用它的时候只需要鼠标点击即可完成操作,无需书写SQL语句。

详细参考:Day 48 - 04 navicat基本使用_哔哩哔哩_bilibili

注释语法

在navicat中如何快速的注释和解注释
  ctrl + ?   加注释
  ctrl + ?   基于已经有注释的情况下再来一次就是解开注释
  无果你的navicat版本不一致还有种可能是
  ctrl + shift + ?   解开注释

pymysql

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='111111',
    database='day02',
    charset='utf8'  # 编码千万不要加-
)  # 链接数据库

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象(就是用来帮你执行命令的)
"""
cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
"""
sql = 'select * from emp;'
res = cursor.execute(sql)
# print(res) # execute返回额是你当前sql语句所影响的行数,该返回值一般不用

# 获取命令执行的查询结果
print(cursor.fetchone())  # 只拿一条  读取数据类似于光标的移动 得到数据本身
cursor.scroll(1,'relative')  # 相对于光标所在的位置继续往后移动1位  
cursor.scroll(1,'absolute')  # 相对于数据的开头继续往后移动1位
print(cursor.fetchall())  # 拿所有  得到列表套多个数据
print(cursor.fetchmany(2))  # 可以指定拿几条

SQL注入

"""
利用一些语法的特性,书写一些特点的雨具实现固定的语法
MySQL利用的是MySQL的注释语法:select * from user_info where name ='xiao' -- iinbdfwuei' and password = ''
"""
日常生活中很多软件在注册的时候都不能含有特殊符号,因为怕你构造出特定的语句入侵数据库,不安全


如何解决SQL注入?
# 敏感的数据不要自己做拼接,交给execute方法帮你拼接即可
import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='111111',
    database='day45',
    charset='utf8'  # 编码千万不要加-
)  # 链接数据库

cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

username = input('>>>: ').strip()
password = input('>>>: ').strip()
sql = "select * from user_info where name =%s and password = %s"  # 或者使用 % (username, password),下面的(username, password)就不需要加了。但是这种方法会引起SQL注入
# 不要手动拼接数据,先用%s占位,之后将需要拼接的数据直接交给execute方法即可
print(sql)
rows = cursor.execute(sql,(username,password))  # 自动识别sql里面的%s用后面元组里面的数据替换
if rows:
    print('登陆成功')
    print(cursor.fetchall())
else:
    print('用户名密码错误')

pymysql补充

# 针对增删改,pymysql需要二次确认才能真正的操作数据
import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='111111',
    database='day45',
    charset='utf8',  # 编码千万不要加-
    autocommit=True  # 自动提交
)  # 链接数据库
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 增
sql = "insert into user_info(name,password) values(%s,%s);"
# 第一种
rows = cursor.execute(sql,('abc',123))
# 第二种
rows = cursor.executemany(sql,[('abb',123),('qwe',111)])  # 批量增加
print(rows)
conn.commit()  # 确认

# 删
sql = "delete from user_info where id=1;"
rows = cursor.execute(sql)
print(rows)
conn.commit()

# 改
sql = "update user_info set name='xiaoNB' where id=2;"
rows = cursor.execute(sql)
print(rows)
conn.commit()

# 查
sql = "select * from user_info;"
rows = cursor.execute(sql)
print(cursor.fetchall())


"""
增删改查中
    删改查他们的操作涉及到数据的修改
    需要二次确认
"""

# 还可以一次性插入N多条数据
rows = cursor.executemany(sql,[('abb',123),('qwe',111)])  # 批量增加
posted @ 2024-03-03 19:17  Xiao0101  阅读(22)  评论(0)    收藏  举报