Navicat软件、python操作MySQL

Navicat软件

1. 软件简介

第三方开发的用来充当数据库客户端的简单快捷的操作界面
	无论第三方软件有多么的花里胡哨,底层的本质还是SQL
能够操作数据库的第三方可视化软件有很多,其中针对MySQL最出名的就是Navicat

1.浏览器搜索Navicat直接下载
	版本很多、能够充当的数据库客户端也很多
    # 它不是免费的,收费的,免费试用14天
2.破解方式
	先试用再破解、直接下载破解版(老版本)、修改试用日期
    
去官网下载:https://www.navicat.com.cn/products/

Navicat就是MySQL的第三方客户端

2.navicat基本操作

1.连接MySQL
	连接 --> MySQL --> 
    连接名(自己起个名字)
    
# 127.0.0.1---------目前记忆是一样的-------->localhost   

# 补充
连接mysql命令:
mysql -h127.0.0.1 -P3306 -uroot -p123456
-h(host):主机,填写ip
-P:端口,3306
    
# 自己电脑
mysql -u root -p 



2.新建数据库
	右键选择新建数据库
    字符集:unf8/utf8mb4
    排序规则:utf8_general_ci
# 客户端和Navicat软件绑定了,客户端的数据会直接在Navicat中显示,而Navicat软件创建的表或数据,在客户端也能够查到

3.新建表
	进入库--> 表右击新建表
    table键切换
    id --> 对于主键最好加上注释:主键id.自动递增在左下角
    默认值:EMPTY STRING --> Null
    SQL预览:建立字段还没有保存时,可以直接查看它,看SQL语句
    注释:于字段同级别的注释是针对于表的注释。
        
4.添加记录
	双击进入表
    SQL语句:右侧DDL,是创建表的完整语法
    填写完数据之后,左下角对勾保存
    
5.筛选
	点击加号
    点击字段,可以切换字段名;包含,可以切换筛选条件;<?>,可以切换值。也可以多条件筛选
    点击应用
    
6.已经建好的表,更改表结构
	右击表 --> 设计表
    
7.执行SQL语句
	点击新建查询
    选择连接和库
    内部就可以直接写SQL语句了,有代码提示功能
    点击运行
    语句过长,可以使用:美化SQL
        
8.导出
	右键--> 转储SQL文件
    
9.导入
	方式1:新建库,直接复制SQL语句,运行
    方式2:右击库,运行SQL文件
    
10.数据传输
# 复制表,库内的所有表
	工具 --> 数据传输
    
11.模型
	# 可以更好的理解表与表之间的关系
	库右键 --> 逆向数据模型

python操作MySQL

# 需要借助于第三方模块
# mysqldb
# mysqlclient...  在Django中用,要比这两个模块好用,一般情况下,安装不上(后期讲解)
# pymysql
安装:
  pip install pymysql;

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

import pymysql  # 操作MySQL的第三方模块

# 1.连接MySQL服务端
# 此时python链接mysql,python就是一个客户端
# 既然是客户端,那就需要链接服务端,保证服务端的正常运行
conn = pymysql.connect(  # conn链接对象
    host='127.0.0.1',
    port=3306,
    user='root',
    password='1113',
    db='db6',  # 数据库必须是存在的
    charset='utf8'
)

# 2.获取一个游标
# 游标对象就相当于光标(闪着的哪个)
# cursor = conn.cursor()  # 执行完毕返回的结果集默认以元组显示 ((),())
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)  # [{},{}]

# 3.先写SQL语句,查询数据
sql = 'select * from t2'

# 4.发送SQL语句
affect_rows = cursor.execute(sql)  # execute也有返回值,接收的是SQL语句影响的行数
print(affect_rows)  # 2,行数是2

# 5.获取SQL语句执行之后的结果,游标对象点方法
# ((1, 'kevin', 20), (2, 'tom ', 22))
# [{'id': 1, 'name': 'kevin', 'age': 20}, {'id': 2, 'name': 'tom ', 'age': 22}]
print(cursor.fetchall())  

2.字典可以循环取值: # 这一步跟上一步的打印只能存在一个,同时存在,上一步完全输出了,循环只能是空。
for i in cursor1.fetchall(): 
    print(i)

2.查询结果

1.获取数据
    fetchall()  获取所有的结果
    fetchone()	获取结果集的第一个数据
    fetchmany() 获取指定数量的结果集
    ps:注意三者都有类似于文件光标移动的特性

2.光标滚动(很少用)
	cursor.scroll(移动个数,模式)
    cursor.scroll(1)  # 默认模式,基于当前位置往后移动
    cursor.scroll(1,'relative')
    cursor.scroll(0,'absolute')  # 基于数据的开头往后移动

代码操作:
1.fetchall()
一次性拿到全部后,执行同样的语句,就输出空列表(第一次取完了,再取就没有了)

# 5.拿到查询结果
print(cursor1.fetchall())  # [{'id': 1, 'name': 'kevin', 'age': 20}, {'id': 2, 'name': 'tom ', 'age': 22}]
print(cursor1.fetchall())  # []

2.分布拿取fetchone()

# 5.拿到查询结果
print(cursor1.fetchone())  # {'id': 1, 'name': 'kevin', 'age': 20}
print(cursor1.fetchone())  # {'id': 2, 'name': 'tom ', 'age': 22}
print(cursor1.fetchone())  # None

3.指定拿取:fetchmany(1),括号内的数据是拿取数量,表中没有那么多就有几条取几条

# 5.拿到查询结果
# print(cursor1.fetchmany(1))  # [{'id': 1, 'name': 'kevin', 'age': 20}]
# print(cursor1.fetchmany(2))  # [{'id': 1, 'name': 'kevin', 'age': 20}, {'id': 2, 'name': 'tom ', 'age': 22}]
print(cursor1.fetchmany(5))  # [{'id': 1, 'name': 'kevin', 'age': 20}, {'id': 2, 'name': 'tom ', 'age': 22}]

3.增删改查

autocommit=True  # 针对增、删、改,自动确认(直接配置)

conn.commit()  # 针对增、删、改,需要二次确认(代码确认)

代码验证:
方式1:代码确认

'''插入数据'''
"""除了查询之外的语句,都需要二次确认"""
import pymysql  # 操作MySQL的第三方模块

# 1.链接MySQL
# 此时python链接mysql,python就是一个客户端
# 既然是客户端,那就需要链接服务端,保证服务端的正常运行
conn = pymysql.connect(  # conn链接对象
    host='127.0.0.1',
    port=3306,
    user='root',
    password='1113',
    db='db6',  # 数据库必须是存在的
    charset='utf8'
)

# 2.获取一个游标
cursor2 = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 3.先写SQL语句
sql = 'insert into t2(name,age) values("tank",33)'

# 4.执行SQL语句
affect_rows = cursor2.execute(sql)

# 二次确认,链接对象.commit()
conn.commit()
print(affect_rows)

方式2:直接在连接对象时加一个参数,autocommit=True
就不需要再写conn.commit()这句话

conn1 = pymysql.connect(  # conn链接对象
    host='127.0.0.1',
    port=3306,
    user='root',
    password='1113',
    db='db6',  # 数据库必须是存在的
    charset='utf8',
    autocommit=True
)

# 2.获取一个游标
cursor3 = conn1.cursor(cursor=pymysql.cursors.DictCursor)

# 3.先写SQL语句
sql = 'insert into t2(name,age) values("tank",33)'

# 4.执行SQL语句
affect_rows = cursor3.execute(sql)
print(affect_rows)  # 1

4.使用pymysql写一个注册和登录的案例

# 先写一个注册和登录功能
import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='1113',
    db='db6',
    charset='utf8',
    autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 1.获取用户名和密码
username = input('请输入用户名:').strip()
password = input('请输入密码:').strip()
# 2.构造查询SQL语句
sql = 'select * from userinfo where name="%s" and pwd="%s"' %(username,password)
# 3.发送给服务端并执行SQL语句
cursor.execute(sql)
# 4.获取执行结果
res = cursor.fetchall()
if res:
    print('登录成功')
    print(res)
else:
    peint('用户名或密码错误')

        
# 注册
# 1.获取用户名和密码
username = input('usename:>>>').strip()
password = input('password:>>>').strip()
# 2.构造查找SQL语句
sql = "insert into userinfo(name,password) values('%s','%s')" % (username, password)
# 3.发送给服务端并执行SQL语句
cursor.execute(sql)
# 4.获取执行结果
res = cursor.fetchall()
print(res)

5.SQL注入问题

1.什么是sql注入

怪像1:输对用户名就可以登录成功
    kevin ' -- hgahgueaguaehg
怪像2:不需要对的用户名和密码也可以登录成功
	xxx ' or 1=1 -- vhioshuihabzjb
SQL注入:利用特殊符合的组合产生特殊的含义,从而避开正常的业务逻辑
    
# 显示出的SQL语句
select * from userinfo where name='kevin ' -- hgahgueaguaehg' and password=''
select * from userinfo where name='xxx ' or 1=1 -- vhioshuihabzjb' and password=''

"""
    实际生活中 尤其是在注册用户名的时候 会非常明显的提示你很多特殊符号不能用
        原因也是一样的
结论:设计到敏感数据部分 不要自己拼接 交给现成的方法拼接即可
"""

2.如何解决

针对上述的SQL注入问题,核心在于手动拼接了关键数据,交给execute处理即可

sql = " select * from userinfo where name=%s and password=%s "
cursor.execute(sql, (username, password))

'''
补充说明
	一次性传入多条数据
	executemany(sql,[('oscar',123),('maria',123),('lili',123),('xiaohua',333)])
'''

问题解决后的注册和登录操作:

import pymysql

conn = pymysql.connect(
    host='127.0.0.1',
    port=3306,
    user='root',
    password='1113',
    db='db6',
    charset='utf8',
    autocommit=True
)
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)

# 1.获取用户名和密码
username = input('usename:>>>').strip()
password = input('password:>>>').strip()
# 2.构造查找SQL语句
sql = "select * from userinfo where name =%s and password=%s"
# 3.发送给服务端并执行SQL语句
cursor.execute(sql, (username, password))
# 4.获取执行结果
res = cursor.fetchall()
if res:
    print('登陆成功')
    print(res)
else:
    print('用户名和密码错误')

    
# 注册
# 1.获取用户名和密码
username = input('usename:>>>').strip()
password = input('password:>>>').strip()
# 2.构造查找SQL语句
sql = "insert into userinfo(name,password) values(%s,%s)"
# 3.发送给服务端并执行SQL语句
cursor.execute(sql, (username, password))
# 4.获取执行结果
res = cursor.fetchall()
print(res)
print('注册成功')

posted @ 2023-04-09 15:35  星空看海  阅读(99)  评论(0编辑  收藏  举报