数据库操作(三)
数据库操作(三)
1.Navicat工具
在官网下载navicat工具,然后傻瓜式安装好后双击快捷方式打开进入到主界面:
作为mysql客户端,我们需要连接mysql服务端
在弹出的界面输入mysql服务端的ip地址和端口,还有mysql用户名和密码
关于校对规则大家看看这两篇博客就明白了:
https://www.cnblogs.com/adforce/p/3282404.html
https://www.jb51.net/article/48775.htm
上面的步骤点击确定就建好一个数据库了:
然后我们到上面的数据库里面新建一张表
也就是我们通过点击鼠标生成对应的sql语句去执行
然后点击保存:
这个表就生成了:
不信我们去命令行看一看:这个表已经存在了
以后我们直接就使用这个工具来操作数据库就可以了,因为命令行操作还是比较繁琐的
然后我们看看建立外键
然后自动会生成对应的sql语句
然后点击保存,起一个表名,就有了这个表了
然后双击上面的表名就可以插入数据了
比方说我们上面这个dep表的id字段没有设置自增,我想改一下,让它这个id字段变为自增的怎么办
设计表:
那我们该怎么办呢,直接删除这个表然后重新创建吗?你另外一个关联表肯定不让你这么做,所以你需要先将那个关联表的外键关系先取消,或者先将那个外键关联表删除
然后把这个关联表的外键删除,然后保存
我们想给id字段加上自增的那个dep表里面把id字段设置为自增,保存,然后在重新将emp表外键到dep的id字段上
给dep表插入几条数据
这个工具还能将你的表之间的关系通过图形的形式来给你展示:
点击这个ER图,两者的关系图就显示出来了,那么将来你的表很多的时候,你就可以通过这个图来查看自己表和表之间的关系,看效果:
如果我们点击两个表之间的线,是可以看到两者之间的关系的:
还可以选择上面的模型来直接创作图表,创建表之间的关系
但是上面我们建立的这个模型,是不能直接创建到数据库里面的,需要将它以sql的形式导入,然后把导出的sql语句,到数据库里面去执行
然后导出保存到一个地方
打开我们导出的文件,看一下里面的内容
这就是创建的模型翻译成的sql语句,复制一下这些sql语句,但mysql里面去执行一下,就等到我们模型里面的两个表了,很方便
Navicat工具还能写原生sql语句来进行数据库的操作
就看到一个输入sql语句的界面了:
然后写一个sql语句试一下:
然后运行一下:
我们还可以将之前数据库中导出来的数据,以sql文件的形式通过navicat导入到数据库中:
首先我们新建一个库:
然后选择这个数据库,点击右键,选择运行sql文件;
注意上面这一步,直接关闭就可以了,不要再次点击开始了
然后通过ER图,来看看,各个表的关系就看的很清楚了。
2.pymysql模块
pymysql是在python中操作mysql,也就是一个在python中运行的套接字客户端.
#安装
pip install pymysql
import pymysql
conn = pymysql.connect(
host = '127.0.0.1', #主机ip
port = 3306, #端口号
user = 'root', #用户名
password = '123', #密码
database = 'learn', #需要连接的库
charset = 'utf8')
cursor = conn.cursor() #游标相当于命令行的 mysql>
#cursor = conn.cursor(pymysql.cursors.DictCursor)
#默认游标取出的数据结构为元组类型即((),()...),DictCusor获取字典数据类型,对应的数据结构是[{},{}..]
sql = 'select * from dep;'
ret = cuosor.execute(sql) #ret为受影响的行数
print(ret)
print(cursor.fetchone()) #取出单条数据记录
print(cursor.fetchmany(3)) #取出多条,即取出3条数据记录
print(cursor.fetchall()) #取出全部数据记录
cursor.scroll(2,'absolute')
#absolute 绝对移动,相对于数据最开始的位置进行光标的移动
cursor.scroll(2,'relative')
#relative 相对移动,按照光标当前位置来进行光标的移动
conn.commit() #增删改都必须进行提交操作(commit)
cursor.close() #关闭游标
conn.close() #关闭连接
ps:
print(cursor.lastrowid) #获取插入的最后一条数据的自增ID
sql注入:
#我们来使用数据来进行一下用户名和密码的认证操作
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='crm',
charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
uname = input('请输入用户名:')
pword = input('请输入密码:')
sql = "select * from userinfo where username='%s' and password='%s';"%(uname,pword)
res = cursor.execute(sql) #行数受到影响则不为0,即True
print(res)
if res:
print('登陆成功')
else:
print('用户名和密码错误!')
#通过上面的验证方式,比我们使用文件来保存用户名和密码信息的来进行验证操作要方便很多。
但是
1.知道用户名不知道密码的情况下输入(asfdf为随意输入的字符)
uname:asfdf' --
pword:随意输入
发现也可以登陆成功,是利用了mysql中 -- 注释的方法修改了mysql指令
2.不知道用户名也不知道密码的情况下输入
uname:asfdf' or 1 =1 --
pword:随意输入
发现也可以登陆成功,是利用了注释加or运算修改了mysql指令
这就是mysql注入的问题,解决办法:
cursor.execute(sql,[参数1,参数2...])
即:
import pymysql
conn = pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='666',
database='crm',
charset='utf8'
)
cursor = conn.cursor(pymysql.cursors.DictCursor)
uname = input('请输入用户名:')
pword = input('请输入密码:')
sql = "select * from userinfo where username='%s' and password='%s';"
res = cursor.execute(sql,[uname,pword]) #行数受到影响则不为0,即True
print(res)
if res:
print('登陆成功')
else:
print('用户名和密码错误!')