MySQL->navicat、pyMySQL

MySQL->navicat、pyMySQL

#1. 测试+链接数据库
#2. 新建库
#3. 新建表,新增字段+类型+约束
#4. 设计表:外键
#5. 新建查询
#6. 备份库/表

#注意:
批量加注释:ctrl+?键
批量去注释:ctrl+shift+?键

PyMySQL模块

安装—> pip3 install pymysql

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

通过pyMySQL操作数据库通常分4步

import pymysql

# 1、建立连接
con = pymysql.connect(host = 'localhost',port = 3306,user = 'root',password = '123',database = 'd11')
# 2、设置游标
cursor = con.cursor(pymysql.cursors.DictCursor) # 设置游标的具体类型,DictCursor以字典的形式拿到字段名,默认以元组的形式
# 3、执行sql语句
sql = 'select * from emp;'
res = cursor.execute(sql) # 执行sql语句,返回sql查询成功的记录行数
# print(res)

# 需求:具体的一条条记录
# tag = cursor.fetchone() # 执行语句,返回获取的一条数据 第一条
# print(tag)
# tag = cursor.fetchone() # 执行语句,返回获取的一条数据 第二条
# print(tag)
# print(cursor.scroll(1, mode='relative')) # 指针相对于上一次位置往后偏移1条记录
# cursor.scroll(res - 2, mode='absolute')# 指针绝对, 游标永远从头开始偏移

tag = cursor.fetchall()  # 执行语句,获取所有数据
print(tag)
# 4、 关闭、断开连接
cursor.close()
con.close()

# 使用执行的结果:
#       fetchone())当前游标往后获取一行记录
#       fetchall()当前游标往后所有的记录
#       scroll(num, mode="relative|absolute")
#               relative: 游标从当前位置往后移动num行
#               ablolute: 游标从头往后移动num行, 一般可以结合line来使用能定位到任意位置

二、pymysql处理sql注入

'''
sql语法中
注释: /**/  | --  | #

什么是sql注入:
通过书写sql包含(注释相关的)特殊字符, 让原有的sql执行顺序发生改变, 从而改变执行得到的sql

目的:
绕过原有的sql安全认证, 达到对数据库攻击的目的
'''
import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 登录

# 得到用户输入的账户密码
usr = input("请输入用户名: ") #abc
pwd = input("请输入密码: ") #123

# sql注入
# 1.知道用户名:  abc" -- hehe | ooo
# select * from user where usr="abc" -- hehe" and pwd="ooo"
# 2.不知道用户名 aaa" or 1=1 -- hehe | 000
# select * from user where usr="aaa" or 1=1 -- hehe" and pwd="000"

# 处理方式
# 对输入的账户密码做完全处理 => 不可能形成达到sql注入的特殊语法 => 正则

# 和数据库的账户密码进行配对
# sql = 'select * from user where usr="%s" and pwd="%s"' % (usr, pwd)
# select * from user where usr="abc" and pwd="123"
# res = cursor.execute(sql)

# pymysql已经处理了sql注入
sql = 'select * from user where usr=%s and pwd=%s'
res = cursor.execute(sql, (usr, pwd))

# print(res)
if res:
    print('login success')
else:
    print('login failed')

cursor.close()
conn.close()

三、增删改

import pymysql
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='db2')
cursor = conn.cursor(pymysql.cursors.DictCursor)

# 增
# sql1 = 'insert into user(usr, pwd) values (%s, %s)'
# cursor执行sql语句,在内存中完成了对数据的插入, 但不能将数据存放到硬盘
# 会将id完成自增
# 插入单条
# res = cursor.execute(sql1, ("opq", "123"))
# 插入多条
#res = cursor.executemany(sql1, [("aaa", "000"), ("bbb", "111")])
# print(res)
# 将内存中的数据提交给硬盘, 完成真实意义上的数据存储
# conn.commit()

# 删
# sql2 = 'delete from user where usr=%s'
# res = cursor.execute(sql2, ("aaa"))
# print(res)
# conn.commit()

# 改
sql3 = 'update user set pwd=%s where usr=%s'
res = cursor.execute(sql3, ("222", "bbb"))
conn.commit()

cursor.close()
conn.close()

猜你喜欢

转载自www.cnblogs.com/Yedada/p/10258577.html