当前位置: 首页 > news >正文

数据库可视化工具简介以及pymysql的使用

1.可视化工具Navicat

  我们自己开发测试时,可以使用该可视化工具,以图形界面的形式操作数据库

  在生产环境中,为了显示自己的逼格,一般不建议使用它

官网下载:https://www.navicat.com/en/products/navicat-for-mysql

网盘下载:https://pan.baidu.com/s/1bpo5mqj

2.pymysql的使用

2.1模块的下载(终端)

pip install pymysql

2.2链接,执行sql以及关闭游标

  这是我在test库下创建的ttt表格

import pymysql

user = input('username:').strip()
pwd = input('password:').strip()

# 链接
conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')

# 创建游标对象
cursor = conn.cursor()

# 执行mysql语句
sql='select * from ttt where name="%s" and password="%s"' %(user,pwd)
print(sql)

# 执行sql语句,返回sql查询成功的记录数目,输入错误则是0,正确输出1
result = cursor.execute(sql)
print(result)

cursor.close()
conn.close()

类似结果

2.3 execute()之sql注入

  看看下面两种输入方式(注意输入的是单引号还是双引号,另--后面还有空格,否则输出是0)

  在用户名输入正确的情况下绕过密码(bob"-- 任意字符)

  直接绕过用户名和密码访问(xxx' or 1=1 -- 任意字符)

造成上面结果的原理:

  就根据程序的字符串拼接name='%s',我们输入一个xxx"-- haha,用我们输入的xxx加'在程序中拼接成一个判断条件name='xxx' -- haha'

解决办法:

   核心就是不使用字符串拼接方方式去访问就ok,下面是修改的代码

import pymysql

user = input('username:').strip()
pwd = input('password:').strip()

# 链接
conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')

# 创建游标对象
cursor = conn.cursor()

# 执行mysql语句,这里两个%不需要加上引号,mysql会默认给加上,另外pymysql模块自动帮我们
# 将uer和pwd注入,所以下面括号内的内容必不可少(也可以是列表),它其实间接的和字符串拼接是一个道理
sql = "select * from ttt where name=%s and password=%s"
print(sql)     # 这步没啥意义,就是让你看看结果
res = cursor.execute(sql,(user,pwd))
print(res)

cursor.close()
conn.close()

结果

2.4 增、删、改:conn.commit()

    这里一定要有execute执行和commit提交这几步

import pymysql

# 链接
conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')

# 创建游标对象
cursor = conn.cursor()

# 增一个
sql = "insert into ttt(name,password) values(%s,%s);"
res = cursor.execute(sql,('luffy',666))


# 增多个
sql = "insert into ttt(name,password) values(%s,%s);"
res = cursor.executemany(sql,[('qq',454),('ww',574),('ee',322)])   # 必须放进一个大的列表里

# 改操作
sql = "update ttt set name = %s  where id = 4;"
cursor.execute(sql,'zoro')

# 删操作
sql = "delete from ttt where id=2;"
cursor.execute(sql)   # 删除了这步执行语句也得要有


conn.commit()   # 提交语句,必须要有,别忘啊
cursor.close()
conn.close()

2.5查 fetchone,fetchmany,fetchall(属于光标操作)

fetchone():获取下一行数据,第一次为首行;
fetchall():获取所有行数据源
fetchmany(4):获取4行数据

上面的表经过增删改后:

fetchone()与fetchall()

import pymysql

# 链接
conn = pymysql.connect(host='localhost',port=3306,user='root',password='',database='test',charset='utf8')

# 创建游标对象
cursor = conn.cursor()  # 默认返回元祖形式
# cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)   # 它返回的是一个字典

# 查操作,返回sql影响成功的行数rows,将结果放入一个集合,等待被查询
sql = "select * from ttt;"
rows = cursor.execute(sql)

# 查询单个
res1=cursor.fetchone()   # 查找出id是1的
res2=cursor.fetchone()   # 查找出id是3的
print(res1)
print(res2)

# 对rows进行操作,查找所有,注意这里的所有指的是id是3以后的了,光标已经移动了
rows = cursor.fetchall()
print(rows)

conn.commit()   # 提交语句,必须要有,别忘啊
cursor.close()
conn.close()

注意,当使用fetchone获取数据时,如果光标已经到最后一行,则会返回none,我们可以采用下面方式移动指针

cursor.scroll(1,mode='relative')  # 相对当前位置移动
cursor.scroll(2,mode='absolute') # 相对绝对位置移动
第一个值为移动的行数,整数为向下移动,负数为向上移动,mode指定了是相对当前位置移动,还是相对于首行移动

 

转载于:https://www.cnblogs.com/LearningOnline/p/9185380.html

相关文章:

  • Mysql-慢查询日志
  • ztree异步加载树节点
  • 分页插件PageHelper配置步骤(mybatis)
  • 快速排序的C++版
  • 新建存过,查询表结构的方法。
  • 金额转换问题
  • jquery-5 jQuery筛选选择器
  • kettle学习笔记(九)——子转换、集群与变量
  • Django初始配置及大概扫阅
  • [转载]Delphi 版 everything、光速搜索代码
  • OO第四次博客作业
  • CentOS7网卡重启错误,配置IP方案
  • 真·面试题
  • 英语基础语法-时态(谓语动词的变化-一般时态/进行时态)
  • 安装mysql时出现应用程序无法正常启动(0xc000007b)、初始化失败以及密码忘记怎样重置?...
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Brief introduction of how to 'Call, Apply and Bind'
  • Centos6.8 使用rpm安装mysql5.7
  • CentOS从零开始部署Nodejs项目
  • Git初体验
  • iOS 系统授权开发
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript函数式编程(一)
  • JavaScript设计模式之工厂模式
  • Java多线程(4):使用线程池执行定时任务
  • java概述
  • mysql常用命令汇总
  • npx命令介绍
  • orm2 中文文档 3.1 模型属性
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis的resp协议
  • VUE es6技巧写法(持续更新中~~~)
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 好的网址,关于.net 4.0 ,vs 2010
  • 机器学习 vs. 深度学习
  • 入门级的git使用指北
  • No resource identifier found for attribute,RxJava之zip操作符
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $jQuery 重写Alert样式方法
  • (1)SpringCloud 整合Python
  • (145)光线追踪距离场柔和阴影
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (力扣)循环队列的实现与详解(C语言)
  • (三)c52学习之旅-点亮LED灯
  • (四)图像的%2线性拉伸
  • (算法二)滑动窗口
  • (推荐)叮当——中文语音对话机器人
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (一一四)第九章编程练习
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)GCC在C语言中内嵌汇编 asm __volatile__