Ⅰ Navicat
【一】Navicat介绍
- Navicat可以充当很多数据库软件的客户端 提供了图形化界面能够让我们更加快速的操作数据库
【1】介绍
- Navicat 是一款功能强大且广泛使用的数据库管理工具,可用于连接和管理多种数据库系统,如 MySQL、MariaDB、Oracle、PostgreSQL 等。
- 本文将详细介绍 Navicat 的特点、功能以及如何使用它来提高数据库管理效率。
【2】Navicat 的特点
- Navicat 具有许多令人印象深刻的特点,使其成为许多开发人员和数据库管理员的首选工具。
(1)强大的数据库连接
- Navicat 支持与各种数据库系统进行连接,包括 MySQL、MariaDB、Oracle、PostgreSQL、SQLite 等。
- 无论你是使用单一数据库系统还是多个数据库系统,Navicat 都能满足你的需求。
(2)直观的用户界面
- Navicat 的用户界面设计简洁直观,易于理解和操作。
- 无论你是初学者还是有经验的数据库管理员,Navicat 都能提供良好的使用体验,帮助你快速掌握各种功能。
(3)多种功能模块
- Navicat 提供了许多功能模块,涵盖了数据库管理的方方面面。
- 其中一些功能包括数据导入和导出、查询构建器、报表生成、备份和恢复等。
- 这些功能模块使得数据库管理更加高效和便捷。
(4)数据同步和转换
- Navicat 允许你在不同的数据库系统之间进行数据同步和转换。
- 你可以轻松地将数据从一个数据库系统导入到另一个数据库系统,或者在不同数据库之间同步数据,方便数据共享和迁移。
(5)数据库设计和建模
- Navicat 提供了强大的数据库设计和建模功能,帮助你规划和设计数据库结构。
- 你可以使用直观的图形界面绘制实体关系图,定义表之间的关系,并生成相应的 SQL 脚本以创建数据库对象。
【3】Navicat 的功能详解
(1)数据导入和导出
- Navicat 具有灵活的数据导入和导出功能,支持多种数据格式。你可以从 CSV、Excel、Access 等文件中导入数据到数据库,也可以将数据库中的数据导出为这些格式的文件。
(2)查询构建器
- Navicat 的查询构建器功能可帮助你轻松构建复杂的 SQL 查询语句。你可以选择要查询的表、字段和条件,并通过图形界面生成查询语句,无需手动编写复杂的 SQL 代码。
(3)报表生成
- Navicat 提供了报表生成功能,可用于创建和定制数据库报表。你可以选择要包含在报表中的数据、样式和排列方式,并导出为 PDF、Excel 等格式的文件。
(4)备份和恢复
- Navicat 具有灵活的备份和恢复功能,可帮助你保护数据库的安全性。你可以定期对数据库进行备份,并在需要时轻松恢复数据,防止意外数据丢失。
(5)数据库同步
- Navicat 允许你在不同的数据库之间进行数据同步。你可以将数据从一个数据库复制到另一个数据库,确保两个数据库之间的数据一致性。
(6)数据库连接管理
- Navicat 提供了便捷的数据库连接管理功能,可以保存和管理多个数据库连接配置。你可以根据需要添加、编辑或删除数据库连接,并轻松切换不同的数据库连接。
(7)数据库设计和建模
- Navicat 的数据库设计和建模功能可帮助你规划和设计数据库结构。你可以通过绘制实体关系图、定义表之间的关系等方式来创建数据库模型,从而更好地组织和管理数据。
【4】结论
- Navicat 是一款功能强大且易于使用的数据库管理工具,它提供了多种功能模块,使得数据库管理变得高效和便捷。通过本文的介绍和示例,相信你已经对 Navicat 有了更深入的了解,并能够灵活运用它来提高数据库管理效率。
【二】Windows系统
【1】Navicat下载
(1)官网下载即可
(2)非官网
- 安装 navicat160_premium_cs_x64.exe 装好之后
- 启动破解工具
- 启动:NavicatCracker.exe
- Applied Path选择自己的安装目录
- Patch
- Generate
- 生成激活码
- Copy
- 拷贝激活码,鼠标选中激活码后“Ctrl+C”
- 断开网络,断开网络,断开网络!!!!!重要的话说三遍
- 打开“Navicat Premium 16”应用程序。
- 选择立即激活或者注册
- 粘贴刚才复制的激活码
- 点击激活
- 因为断网了,所以可以点击“手动激活”。
- 复制请求码
- 将“Navicat Premium 16”生成的“请求码”,复制到“注册机”中的“Request Code”输入框内。
- 生成激活码
- 先点击“注册机”中的“Generate Activation Code!”按钮,生成激活码
- 再将激活码全选复制粘贴至“Navicat Premium 16”中的“激活码”输入框内,最后点击“激活”按钮
【三】使用
【1】连接MySQL数据库
- 输入链接参数
- 测试参数
- 连接成功
【2】创建MySQL数据库
- 选择新建数据库
- 输入数据库参数
- 创建成功
【3】创建表
- 在表右键选择新建表
- 添加字段参数
- 保存---> 输入表名
- 创建成功
【4】修改表字段
- 表名右键选择设计表
- 修改字段参数
【5】导出SQL
- 选择转储
- 转储文件
【6】备份数据库
- 在数据库连接中,右键点击数据库,选择“备份”功能,设置备份文件的保存路径和格式,并开始备份数据库。
- 在需要恢复数据时,选择“恢复”功能,选择备份文件进行恢复操作。
【7】查询数据
- 执行SQL语句
- 运行选择的代码
【8】视图展示
- 会展示当前数据库下的所有表模型
【9】数据库同步
- 在两个数据库连接之间,右键点击源数据库,选择“复制数据库”功能。
- 填写目标数据库的连接信息,并选择要复制的表和数据,点击“复制”按钮,开始进行数据库同步操作。
Ⅱ PDManer(元数建模)
【一】介绍
【1】软件介绍
-
PDManer元数建模,是一款多操作系统开源免费的桌面版关系数据库模型建模工具,相对于PowerDesigner,他具备界面简洁美观,操作简单,上手容易等特点。
-
支持Windows,Mac,Linux等操作系统,也能够支持国产操作系统,能够支持的数据库如下:
-
- MySQL,PostgreSQL,Oracle,SQLServer等常见数据库
- 支持达梦,GuassDB等国产数据库
- 支持Hive,MaxCompute等大数据方向的数据库
- 用户还可以自行添加更多的数据库扩展
本产品基于 ES6+React+Electron+Java构建
- [PDManer元数建模-4.0],历时四年,持续升级,工匠精神,做一款简单好用的数据库建模平台。
- [PDMan-v2] --> [CHINER-v3] --> [PDManer-v4],连续四年,产品一直保持很好的传承和延续。
- PDManer=PDMan+er(chiner的er部分,ER也表示关系图的意思),“元数建模”的中文名称依然延续,名称需要精简,拿掉chi表示中国的前缀部分,使用中文能更加明确这是一个中国小团队的作品,4.0版本之后,产品名称:[PDManer元数建模]就此确定,承接了PDMan以及CHINER的所有功能,并且进行延续精进
【2】主要功能如下
- 数据表管理: 数据表,字段,注释,索引等基本功能
- 视图管理: 实现选择多张表多个字段后,组合一个新的视图对象,视图可生成DDL以及相关程序代码,例如Java的DTO等
- ER关系图: 数据表可绘制ER关系图至画布,也支持概念模型等高阶抽像设计
- 数据字典: 代码映射表管理,例如1表示男,2表示女,并且实现数据字典与数据表字段的关联
- 数据类型: 系统实现了基础数据类型,基础数据类型在不同数据库下表现为不同数据库类型的方言,这是实现多数据**库支持的基础,为更贴近业务,引入了PowerDesigner的数据域这一概念,用于统一同一类具有同样业务属性字段的批量设置类型,长度等。基础数据类型以及数据域,用户均可自行添加,自行定义。
- 多数据库: 内置主流常见数据库,如MySQL,PostgreSQL,SQLServer,Oracle等,并且支持用户自行添加新的数据库。
- 代码生成: 内置Java,Mybatis,MyBatisPlus等常规情况下Controller,Service,Mapper的生成,也添加了C#语言支持,可自行扩展对其他语言的支持,如Python等
- 版本管理: 实现数据表的版本管理,可生成增量DDL脚本
- 生态对接: 能够导入PowerDesigner的pdm文件,老版本的PDMan文件,也能导出为word文档,导出相关设置等
【二】下载和安装(Win)
【1】软件官网
【2】下载
- 根据官网下载
【三】使用
【1】新建项目
- 自定义名称
【2】创建主题域
- 创建完成
【3】数据表操作
(1)新建数据表
- 定义表名和表备注
(2)定义表字段类型
【4】关系图操作
(1)新建关系图
(2)创建表关系和关联关系
Ⅲ PyMySQL模块
【一】Python操作数据库简介
【1】什么是DB-API
- Python标准数据库规范为 DB-API, DB-API定义了一系列必须的对象和数据库操作方式,以便为各种数据库系统和数据库访问程序提供一致的访问接口。
【2】数据库操作模块
-
开发人员将接口封装成不同的数据库操作模块,不同的数据库需要不同数据库操作模块
-
例如,MySQL数据库,它对应以下操作模块:https://wiki.python.org/moin/MySQL
-
最常用的应该是
-
- MySQL-python:也就是MySQLdb,底层是通过C操作MySQL,效率高,但是只支持py2,不支持py3。
- mysqlclient:是MySQL-python的一个分支。它增加了Python 3支持,并修复了许多错误。Django文档推荐的MySQL依赖库。
- PyMySQL:纯Python实现的模块,可以与Python代码兼容衔接,并也几乎兼容MySQL-python。
- MySQL Connector/Python:MySQL官方推出的纯Python实现的模块。
【二】PyMySQL简介
-- 操作数据库可以写SQL语句
-- 可以直接在终端中书写
-- 可以在navicate中写
-- 我们使用的还是编程语言 python
-- 想要在 Python中操作MySQL数据
-- 执行subporcess --> 连接数据库 ---> 执行命令
-- 于是大佬们帮我们写好了很多第三方模块
pymysql
-- PEP8
-- 用来规范你的Python命名的
-- PEP 249
-- 用来规范操作数据库
-- Python标准数据库规范为 DB-API, DB-API定义了一系列必须的对象和数据库操作方式,以便为各种数据库系统和数据库访问程序提供一致的访问接口。
-- https://peps.python.org/pep-0249/
-- 基于上面的API规范于是诞生了很多数据库操作模块
● 开发人员将接口封装成不同的数据库操作模块,不同的数据库需要不同数据库操作模块
● 例如,MySQL数据库,它对应以下操作模块:https://wiki.python.org/moin/MySQL
-- MySQL官方是有 Python的sdk
-- DB API 2.0 Drivers 驱动
-- MySQL for Python 官方的操作模块 (不用)
-- mysqlclient 后面 对pymysql的补丁
-- PyMySQL 常用
-- mxODBC
-- pyodbc
--MySQL Connector/Python
-- ...
- 纯Python实现的模块,可以与Python代码兼容衔接,并也几乎兼容MySQL-python。
- 遵循 Python 数据库 API v2.0 规范。
- 官网:https://zetcode.com/python/pymysql/
【三】PyMySQL使用
【1】安装
pip install pymysql
【2】连接数据库
- 使用connect函数创建连接对象,此连接对象提供关闭数据库、事务提交、事务回滚等操作。
- 传入参数有很多,具体参考文档,一般参数基本连接信息 host, user, password, port(默认为3306), database。
(1)连接语法
# 导入pymysql模块
import pymysql
# 创建连接对象
conn = pymysql.connect(user='root', # 必填参数:数据库连接用户名
password='password', # 必填参数:数据库连接密码
host='127.0.0.1', # 必填参数:数据库服务器地址,本地可以填 localhost 或 127.0.0.1
port=3306, # 必填参数:MySQL数据库端口,默认是3306
database='study001' # 必填参数:需要链接那个数据库
charset='utf8mb4'
)
"""
user=用户名
password=密码,
host=IP 本地 127.0.0.1 / localhost,
database= 需要连接到哪个数据库,
port=端口,
charset=编码集,
# sql_mode=严格模式,
cursorclass=Cursor 获取查询集的显示结果样式,
connect_timeout=10,
autocommit=False 自动执行提交,
passwd=输入密码,
db=需要连接到哪个数据库,,
"""
def __init__(
self,
*,
user=None, # The first four arguments is based on DB-API 2.0 recommendation.
password="",
host=None,
database=None,
unix_socket=None,
port=0,
charset="",
collation=None,
sql_mode=None,
read_default_file=None,
conv=None,
use_unicode=True,
client_flag=0,
cursorclass=Cursor,
init_command=None,
connect_timeout=10,
read_default_group=None,
autocommit=False,
local_infile=False,
max_allowed_packet=16 * 1024 * 1024,
defer_connect=False,
auth_plugin_map=None,
read_timeout=None,
write_timeout=None,
bind_address=None,
binary_prefix=False,
program_name=None,
server_public_key=None,
ssl=None,
ssl_ca=None,
ssl_cert=None,
ssl_disabled=None,
ssl_key=None,
ssl_verify_cert=None,
ssl_verify_identity=None,
compress=None, # not supported
named_pipe=None, # not supported
passwd=None, # deprecated
db=None, # deprecated
)
【3】主要方法介绍
方法 | 功能 |
---|---|
cursor() | 获取游标对象,操作数据库,如执行DML操作,调用存储过程等 |
commit() | 提交事务 |
rollback() | 回滚事务 |
close() | 关闭数据库连接 |
【4】操作MySQL数据库
- 使用Cursor对象与数据库进行交互。
(1)创建游标对象
import pymysql
from pymysql.cursors import DictCursor
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
# 创建游标,查询数据以元组形式返回
cursor = conn.cursor()
# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)
(2)执行SQL语句
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql) # 这种结果只是显示表里有几条数据 拿不出数据详情
print(res,type(sql))
# 6 <class 'str'>
【5】查询结果
(1)获取所有结果(fetchall)
- fetchall 一下子将所有数据全部拿出来
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
result = cursor.fetchall()
print(result)
# 创建游标,查询数据以元组形式返回
# ((1, 'silence', 'male', 18, 200),
# (2, 'mark', 'female', 18, 201),
# (3, 'happy', 'male', 38, 202),
# (4, 'smile', 'male', 18, 203),
# (5, 'own', 'male', 28, 204),
# (6, 'thdream', 'male', 18, 205))
# 创建游标,查询数据以字典形式返回
# cursorclass=DictCursor
# [{'id': 1, 'name': 'silence', 'sex': 'male', 'age': 18, 'dep_id': 200},
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201},
# {'id': 3, 'name': 'happy', 'sex': 'male', 'age': 38, 'dep_id': 202},
# {'id': 4, 'name': 'smile', 'sex': 'male', 'age': 18, 'dep_id': 203},
# {'id': 5, 'name': 'own', 'sex': 'male', 'age': 28, 'dep_id': 204},
# {'id': 6, 'name': 'thdream', 'sex': 'male', 'age': 18, 'dep_id': 205}]
(2)获取一行数据(fetchone)
- 获取到一条结果,如果再 fetchone 就会拿到下一条结果
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
# result = cursor.fetchmany(2)
result = cursor.fetchone()
print(result)
# {'id': 1, 'name': 'silence', 'sex': 'male', 'age': 18, 'dep_id': 200}
result = cursor.fetchone()
print(result)
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201}]
# fetchone获取到一条结果,如果再 fetchone 就会拿到上一条结果紧挨的下一条结果
(3)获取指定数量的结果 fetchmany(size=指定条数)
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
result = cursor.fetchmany(2)
print(result)
# [{'id': 1, 'name': 'silence', 'sex': 'male', 'age': 18, 'dep_id': 200},
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201}]
result = cursor.fetchone()
print(result)
# {'id': 3, 'name': 'happy', 'sex': 'male', 'age': 38, 'dep_id': 202}
(4)移动光标
cursor.scroll(1, 'relative') # 相对于当前位置往后移动一个单位
cursor.scroll(1, 'absolute') # 相对于起始位置往后移动一个单位
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
result = cursor.fetchmany(2)
print(result)
# [{'id': 1, 'name': 'silence', 'sex': 'male', 'age': 18, 'dep_id': 200},
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201}]
cursor.scroll(1, 'relative')
result = cursor.fetchone()
print(result)
# {'id': 4, 'name': 'smile', 'sex': 'male', 'age': 18, 'dep_id': 203}
cursor.scroll(1, 'absolute') # 相对于起始位置往后移动一个单位
# 相当于光标回到最开始的时候
# 导入pymysql模块
import pymysql
from pymysql.cursors import DictCursor
# 连接数据库,创建连接对象
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
database='study001',
charset='utf8mb4',
cursorclass=DictCursor
)
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
result = cursor.fetchmany(2)
print(result)
# [{'id': 1, 'name': 'silence', 'sex': 'male', 'age': 18, 'dep_id': 200},
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201}]
cursor.scroll(1, 'absolute')
result = cursor.fetchone()
print(result)
# {'id': 2, 'name': 'mark', 'sex': 'female', 'age': 18, 'dep_id': 201}
【四】插入数据
- 插入操作中参数可以以元组、列表和字典形式传入
- 需要使用到占位符 “%s”,注意这只是个占位符,不同于Python 中字符串格式化中的转换说明符。
转换说明符 | 解释 |
---|---|
%d、%i | 转换为带符号的十进制数 |
%o | 转换为带符号的八进制数 |
%x、%X | 转换为带符号的十六进制数 |
%e | 转化为科学计数法表示的浮点数(e 小写) |
%E | 转化为科学计数法表示的浮点数(E 小写) |
%f、%F | 转化为十进制浮点数 |
%g | 智能选择使用 %f 或 %e 格式 |
%G | 智能选择使用 %F 或 %E 格式 |
%c | 格式化字符及其ASCII码 |
%r | 使用 repr() 函数将表达式转换为字符串 |
%s | 使用 str() 函数将表达式转换为字符串 |
【1】方式一:直接写原生的SQL语句
sql = 'insert into dep(id,name) values(888,"发财部")'
cursor.execute(sql)
- 原始数据图片
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
# 【1】方式一:直接写原生的SQL语句
sql = 'insert into dep(id,name) values(888,"发财部")'
# 指定 SQL 语句
cursor.execute(sql)
# 生效就需要提交事务!!!!!
conn.commit()
【2】方式二:格式化传入参数
- %s 位置站位
sql = 'insert into dep(id,name) values(%s,%s)'
cursor.execute(sql, [999, '休闲部'])
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
# 【1】方式一:直接写原生的SQL语句
sql = 'insert into dep(id,name) values(%s,%s)'
# execute 执行SQL语句传入数据的时候按照位置进行传入数据
cursor.execute(sql, [999, '休闲部'])
# 生效就需要提交事务!!!!!
conn.commit()
【3】方式三:关键字传入参数
sql = 'insert into dep(id,name) values(%(id)s,%(name)s)'
cursor.execute(sql, {'id': 777, 'name': '修仙'})
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
# 【1】方式一:直接写原生的SQL语句
sql = 'insert into dep(id,name) values(%(id)s,%(name)s)'
# execute 执行SQL语句传入数据的时候按照位置进行传入数据
cursor.execute(sql, {'id': 777, 'name': '修仙'})
# 生效就需要提交事务!!!!!
conn.commit()
【五】批量插入数据
【1】方案一:遍历每一个数据然后插入数据
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
name_list = [i for i in 'mark']
id_list = [str(i) for i in range(4)]
data_all = list(zip(name_list, id_list))
sql = 'insert into dep(name,id) VALUES(%s, %s)'
for data in data_all:
cursor.execute(sql, data)
# 生效就需要提交事务!!!!!
conn.commit()
【2】方案2 : 一次性批量插入数据
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
name_list = [i for i in 'silence']
id_list = [str(i) for i in range(7)]
data_all = list(zip(name_list, id_list))
sql = 'insert into dep(name,id) VALUES(%s, %s)'
cursor.executemany(sql, data_all)
# 生效就需要提交事务!!!!!
conn.commit()
【六】删除数据
【1】直接写SQL语句
sql = 'delete from 表名 where id =2;'
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'delete from dep where id = 4;'
cursor.execute(sql)
# 生效就需要提交事务!!!!!
conn.commit()
【2】利用站位
sql = 'delete from 表名 where id = %s;'
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'delete from dep where id = %s;'
cursor.execute(sql, [2])
# 生效就需要提交事务!!!!!
conn.commit()
【3】关键字站位
sql = 'delete from 表名 where id = %(id)s;'
cursor.execute(sql, {'id': 888})
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'delete from dep where id = %(id)s;'
cursor.execute(sql, {'id': 888})
# 生效就需要提交事务!!!!!
conn.commit()
【七】更新数据
- 更新数据就是覆盖原数据 所以后面的id是表内要有的数据
【1】直接写
sql = 'update dep set name = "摸鱼大队" where id =204'
cursor.execute(sql)
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'update dep set name = "摸鱼大队" where id =204'
cursor.execute(sql)
# 生效就需要提交事务!!!!!
conn.commit()
【2】站位
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'update dep set name = %s where id =%s'
cursor.execute(sql, ['吃饭带碗筷', 202])
# 生效就需要提交事务!!!!!
conn.commit()
【3】关键字站位
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
# 【四】插入数据
sql = 'update dep set name = %(new_name)s where id =%(id)s'
cursor.execute(sql, {'new_name':'骑猪大队', 'id':203})
# 生效就需要提交事务!!!!!
conn.commit()
Ⅳ SQL注入问题
- 通俗来说就是防止越过输入密码,直接登录操作
【一】什么是SQL注入问题
- SQL注入是一种常见的网络攻击手法
- 它利用sql的语法特性和程序员编写程序时产生的漏洞,用一些特殊符号的组合产生特殊的含义,使得正常的sql语句失效,从而逃脱正常的业务逻辑,完成一些如跳过密码验证等的非法操作。
【二】产生原因
- SQL语句使用了动态拼接的方式。
【三】案例
【1】准备
- 创建表
create table user(
id int primary key auto_increment,
name varchar(32),
password varchar(32)
);
- 插入数据
insert into user(name,password) values("silence","741"),("mark","123");
- 查看数据
Database changed
mysql> create table user(
-> id int primary key auto_increment,
-> name varchar(32),
-> password varchar(32)
-> );
Query OK, 0 rows affected (0.51 sec)
mysql> insert into user(name,password) values("silence","741"),("mark","123");
Query OK, 2 rows affected (0.23 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from user;
+----+---------+----------+
| id | name | password |
+----+---------+----------+
| 1 | silence | 741 |
| 2 | mark | 123 |
+----+---------+----------+
2 rows in set (0.00 sec)
【2】登录注册
(1)pymysql容易出现报错
# pymysql.err.OperationalError: (1054, "Unknown column 'username' in 'where clause'")
# 这个报错是因为输入在终端执行的语句后sql = 'select * from user where username ="silence" and password ="741"'
# 这里代码变成了sql = 'select * from user where username=silence and password=741'
# 这里的账号密码变成了字段 所以就出错了
# sql = 'select * from user where username ="silence" and password ="741"'
# 错误的输入语句
# sql = 'select * from user where username=dream and password =521'
# 【一】导入模块
import pymysql
from pymysql.cursors import DictCursor
# 【二】创建连接对象
# 只是连接上了当前的数据库
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
# 【三】创建游标对象
# 用游标对象来执行SQL语句获取结果
cursor = conn.cursor()
def get_username_password():
username = input('username :>>>> ')
password = input('password :>>>> ')
return username, password
def login():
username, password = get_username_password()
# pymysql.err.OperationalError: (1054, "Unknown column 'username' in 'where clause'")
# 这个报错是因为输入在终端执行的语句后sql = 'select * from user where username ="silence" and password ="741"'
# 这里代码变成了sql = 'select * from user where username=silence and password=741'
# 这里的账号密码变成了字段 所以就出错了
# sql = 'select * from user where username ="silence" and password ="741"'
sql = f'select * from user where name ="{username}" and password ="{password}"'
print(sql)
cursor.execute(sql)
result = cursor.fetchone()
print(result)
if __name__ == '__main__':
login()
# print(sql):select * from user where name ="silence" and password ="741"
# print(result):{'id': 1, 'name': 'silence', 'password': '741'}
【3】问题 : 不用正确的密码即可登录成功
(1)输入带注释
# 输入的内容 username :>>>> silence "-- " password :>>>> 66
# "username" ---> username "-- " ---> "username"-- ""
# 因为在SQL中注释语法都是 注释标志 -- + 一个或多个空格
select * from user where username = "dream "-- "" and password = "44"
(2)将筛选条件变为 1
select * from user where username = "silence "-- "" and 1
import pymysql
# 假设我们从某个不可信的来源(如Web表单)获取了用户名和密码
username = "silence" # 攻击者可能会输入 "silence" -- "" and 1=1
password = "incorrect_password" # 这个密码将被忽略
# 连接到数据库(这里省略了连接细节)
# ...
# 不安全的SQL查询构造
# 注意:永远不要这样做!
sql = "SELECT * FROM user WHERE username = '%s' AND password = '%s'" % (username, password)
# 执行查询(这里省略了执行细节)
# ...
# 如果username被设置为 "silence" -- "" and 1=1,那么实际的SQL查询将变为:
# SELECT * FROM user WHERE username = 'silence' -- '' and 1=1' AND password = 'incorrect_password'
# 由于 -- 是SQL注释的开始,所以后面的内容(包括AND password = 'incorrect_password')将被忽略
# 查询将简化为 SELECT * FROM user WHERE username = 'silence',从而允许攻击者绕过密码验证
【四】SQL注入的解决办法
# 使用官方提供并建议的传值方式进行传值
# %s
# %(name)s
sql = 'select * from user where username = %(username)s and password = %(password)s'
cursor.execute(sql, {'username': username, "password": password})
result = cursor.fetchone()
if result:
print(f'登陆成功!')
else:
print(f'登录失败')
print(result)
if __name__ == '__main__':
login()
【五】总结模板
import pymysql
from pymysql.cursors import DictCursor
class MySQLHandler(object):
def __init__(self, host='127.0.0.1', port=3306, user='root',
cursorclass=DictCursor, charset='utf8mb4', *,
password, database):
# 连接数据库,创建连接对象
self.conn = pymysql.connect(
host=host,
user=user,
password=password,
port=port,
database=database,
cursorclass=cursorclass,
charset=charset
)
# 创建游标对象
self.cursor = self.conn.cursor()
# 提交事务装饰监控器
@staticmethod
def commit_sql(func):
def inner(*args, **kwargs):
self = args[0]
try:
res = func(*args, **kwargs)
self.conn.commit()
return res
except Exception as e:
self.conn.rollback()
return e
finally:
self.close()
return inner
# 查询单条数据
@commit_sql
def search_one(self, sql):
self.cursor.execute(sql)
result = self.cursor.fetchone()
return result
# 查询所有数据
@commit_sql
def search_all(self, sql):
self.cursor.execute(sql)
results = self.cursor.fetchall()
return results
# 插入数据
@commit_sql
def insert_data(self, table_name, **kwargs):
if kwargs:
sql = f'INSERT INTO {table_name} ({", ".join(kwargs.keys())}) VALUES {tuple(kwargs.values())}'
else:
sql = f'INSERT INTO {table_name} () VALUES ()'
print(f'当前SQL语句 :>>>> {sql}')
return self.cursor.execute(sql)
@commit_sql
# 更新数据
def update_data(self, sql):
self.cursor.execute(sql)
return sql
# 关闭链接和服务对象
def close(self):
self.cursor.close()
self.conn.close()
Ⅴ PyMySQL进阶之主动提交事务
-
因为在增删改查中,只有查的权限是最简单的,因此查无需过多的权限
-
但是增删改都涉及到数据库数据的变动,需要额外的确认才行(即提交事务)
-
语法
-
因为数据是不可逆的 所以一般不建议用
# 自动提交事务
# autocommit=True
conn = pymysql.connect(
user='root',
passwd='123456',
host='localhost',
port=3306,
db='study001',
charset='utf8mb4',
cursorclass=DictCursor,
# 自动提交事务
# autocommit=True
)
标签:进阶,数据库,PyMySQL,Navicat,cursor,pymysql,sql,id,conn
From: https://www.cnblogs.com/zyb123/p/18226377