Navicat软件
一开始学习python的时候 下载python解释器然后直接在终端写python代码
pycharm能够更加方便快捷的帮助你书写代码
excel word pdf
我们在终端操作mysql 也没有自动提示也无法保存等等 不方便开发
Navicat内部封装了所有的操作数据库的命令
用户在使用它的时候只需要鼠标点点即可完成操作 无需书写sql语句
安装
直接百度搜索 有破解版的也有非破解版
下载完成后是一个压缩包 直接解压 然后点击安装即可
navicat能够充当多个数据库的客户端
navicat图形化界面有时候反应速度较慢 你可以选择刷新或者关闭当前窗口再次打开即可
当你有一些需求该软件无法满足的时候 你就自己动手写sql
提示
1 mysql是不区分大小写的
忽略大小写
验证码忽略大小写
内部统一转大写或者小写比较即可
upper
lower
2 mysql建议所有的关键字写大写
3 mysql中的注释有两种
--
#
4 在navicat中如何快速的注释和解注释
ctrl + ?
ctrl + ? 基于上述操作再来一次就是揭开注释
如果你的navicat版本不一致还有可能是
ctrl + shift + ?
pymysql模块
支持python代码操作库mysql
安装命令:
pip3 install pymysql
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123",
database="test2", # 指定操作的库
charset="utf8", # 编码千万不要写成“utf-8”,会直接报错的
) # 链接数据库
course = conn.cursor(cursor=pymysql.cursors.DictCursor) # 产生一个游标对象(就是等待输入命令的地方,帮你执行命令的)
# 如果course = conn.cursor() 括号里面不加参数,那么查询出来的数据是以元组的形式,数据不够明确,容易混乱
# cursor=pymysql.cursors.DictCursor将查询结果以字典的形式返回
sql = "select * from emp1;"
res = course.execute(sql) # res是该查询语句的返回结果
print(res) # execute 返回的是你当前sql语句所影响的行数,该返回值一般不用
# 获取命令执行的查询结果
print(course.fetchone()) # 只拿一条
print(course.fetchall()) # 拿所有
print(course.fetchmany(2)) # 括号里面传参可以指定拿几条数据
print(course.fetchone())
print(course.fetchone()) # 读取数据类似于文件光标的移动
course.scroll(1, "relative") # 相对于光标所在的位置继续往后移动1位
print(course.fetchall())
print(course.fetchone())
print(course.fetchone()) # 读取数据类似于文件光标的移动
course.scroll(1, "absolute") # 相当于数据的开头往后继续移动1位
print(course.fetchall())
sql注入
注入问题
利用一些语法的特性 书写一些特定的语句实现固定的语法
mysql利用的是mysql --的注释语法
select * from user where username ='nana' --
snwmoemodmeo' and password = ''
select * from user where username ='ssss' or True --
smmmms' and password = ''
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123",
database="test2",
charset="utf8"
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input("username>>>:").strip()
password = input("password>>>:").strip()
sql = "select * from user where username ='%s' and password = '%s'" % (username, password)
print(sql)
rows = cursor.execute(sql)
if rows:
print("登陆成功")
print(cursor.fetchall())
else:
print("用户名密码错误")
sql语句:
select * from user where username ='nana' -- snwmoemodmeo' and password = ''
select * from user where username ='ssss' or True -- smmmms' and password = ''
注入问题的解决方法
日常生活中很多软件在注册的时候都不能含有特殊符号
因为怕你构造出特定的语句入侵数据库,不安全
敏感的数据不要自己做拼接,交给execute帮你拼接即可
import pymysql
conn = pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123",
database="test2",
charset="utf8"
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
username = input("username>>>:").strip()
password = input("password>>>:").strip()
sql = "select * from user where username =%s and password = %s"
# 不要手动拼接数,先用%s占位,之后将需要拼接的数据直接交给execute方法即可
print(sql)
rows = cursor.execute(sql, (username, password)) # 自动识别sql里面的%s然后用后面元组里面的数据替换,并且会帮你把特殊符号自动过滤掉
if rows:
print("登陆成功")
print(cursor.fetchall())
else:
print("用户名密码错误")
pymysql文件的增删改查
方法一:
增删改查中
增删改的操作 涉及到数据的修改
需要二次确认才能真正的操作数据 conn.commit()
# 增
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.execute(sql, ("lala", 123))
print(rows) # 返回的rows表示影响到的行数,值为1
conn.commit() # 确认
# 一次性增加多条数据
sql = "insert into user(username,password) values(%s,%s)"
rows = cursor.executemany(sql, [("xxx", 123), ("ooo", 123), ("yyy", 123)])
print(rows) # 返回的rows表示影响到的行数,值为1
conn.commit() # 确认
# 修改
sql = "update user set username = 'bb' where id = 5"
rows = cursor.execute(sql)
print(rows) # 返回的rows表示影响到的行数,值为1
conn.commit() # 确认
# 删除
sql = "delete from user where id = 5"
rows = cursor.execute(sql)
print(rows) # 返回的rows表示影响到的行数,值为1
conn.commit() # 确认
# 查
sql = "select * from user"
cursor.execute(sql)
print(cursor.fetchall()) # 查是可以直接显示打印结果的,不需要二次确认
方法二:
或者在链接数据库的时候,
在conn=pymysql.connect(
host="127.0.0.1",
port=3306,
user="root",
password="123",
db="test2",
charset="utf8",
autocommit=True
) 这样就增删改数据的时候就不需要二次确认了