2-1.python操作MySQL


目录
  • 模块基本使用
  • sql注入问题
  • autocommit 二次确认
  • executemany

python	胶水语言、调包侠(贬义词>>>褒义词)
"""
python这门语言本身并不牛逼 牛逼的是支持该语言的各种功能强大的模块、软件
"""
# 后期在使用python编程的时候 很多看似比较复杂功能可能都已经有相应的模块

模块名字 pymysql

下载模块
	1.命令行
    	pip3 install pymysql
		pip3 install pymysql -i 源地址
    2.借助于pycharm
    3.python解释器配置文件

模块基本使用

#导入数据库模块
import pymysql  

#创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123456',
    database='db03',
    charset='utf8'
)
# 生成游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典


# 定义SQL语句
sql = 'select * from userinfo'


# 执行SQL语句
cursor.execute(sql)



# 获取返回结果
res = cursor.fetchall()
print(res)
cursor.scroll()#光标的移动 
relative  # 相对当前位置移动
absolute  # 相对数据开头位置移动

#fetchall()获取所有的结果   列表套字典
#fetchone()获取结果集第一个结果     数据字典
#fetchmany()括号内可以指定获取几个结果集   列表套字典
#上述方法对数据的获取也存在光标的概念

sql注入问题

#sql 注入 而是针对程序员编写时的疏忽,是通过一些特殊的字符,通过SQL语句,实现无账号登录,甚至篡改数据库
#导入数据库模块
import pymysql  

#创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123456',
    database='db03',
    charset='utf8'
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
# 获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 构造SQL语句
sql = "select * from userinfo where name='%s' and password='%s'"%(username,password)
# 容易别sql注入
print(sql)
# 执行SQL语句
cursor.execute(sql)
# 获取返回结果
res = cursor.fetchall()
#登录判断
if res:
    print(res)
    print('登录成功')
else:
    print('用户名或密码错误')

image-20211115210221784

F:\python39\python.exe F:/Desktop/py/python项目/01mysql数据库/day01.py
username>>>:user1' -- aaaaaaaaaaaa
password>>>:
select * from userinfo where username='user1' -- aaaaaaaaaaaa' and password=''
[{'id': 1, 'username': 'user1 ', 'password': '123456'}]
登录成功

Process finished with exit code 0

F:\python39\python.exe F:/Desktop/py/python项目/01mysql数据库/day01.py
username>>>:aaaaaaa' or 1=1 -- aaaaa
password>>>:
select * from userinfo where username='aaaaaaa' or 1=1 -- aaaaa' and password=''
[{'id': 1, 'username': 'user1 ', 'password': '123456'}]
登录成功

Process finished with exit code 0

针对核心数据 不要自己拼接 交由execute方法帮你筛选再拼接

#导入数据库模块
import pymysql  

#创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123456',
    database='db03',
    charset='utf8'
)
# 生成一个游标对象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # 让数据自动组织成字典
# 获取用户名和密码
username = input('username>>>:').strip()
password = input('password>>>:').strip()
# 构造SQL语句

# 针对核心数据 不要自己拼接 交由execute方法帮你筛选再拼接
sql = "select * from userinfo where name=%s and password=%s"
print(sql)
# 执行SQL语句
cursor.execute(sql,(username,password))
res = cursor.fetchall()
if res:
    print(res)
    print('登录成功')
else:
    print('用户名或密码错误')
"""
登录功能
    1.获取用户名和密码
    2.基于用户名和密码直接精准查找
"""

"""
SQL注入问题的产生
    就是通过一些特殊符号的组合 达到某些特定的效果从而避免常规的逻辑
SQL注入问题如何解决
    execute方法自动帮你解决
"""

autocommit 二次确认

# 1.查询语句可以正常执行并获取结果
cursor.execute(sql1)
# 2.插入语句能够执行 但是并没有影响表数据
cursor.execute(sql2,('user222222','666'))
# 3.更新语句能够执行 但是并没有影响表数据
res = cursor.execute(sql3)
print(res)
# 4.删除语句能够执行 但是并没有影响表数据
res = cursor.execute(sql4)
print(res)

'''针对增删改操作 需要二次确认才可生效'''
cursor.execute(sql2,('user111111','666'))
conn.commit()
cursor.execute(sql3)
conn.commit()
cursor.execute(sql4)
conn.commit()
# 创建链接
conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='123',
    database='db_5',
    charset='utf8',
    autocommit=True  # 涉及到增删改 自动二次确认
)

executemany

sql2 = 'insert into userinfo(name,password) values(%s,%s)'

cursor.executemany(sql2,[('user2','123'),('user3','321'),('user4','222')])  #插入多条数据