首页 > 数据库 >Navicat, PDManer,PyMySQL模块,SQL注入问题,PyMySQL进阶之主动提交事务

Navicat, PDManer,PyMySQL模块,SQL注入问题,PyMySQL进阶之主动提交事务

时间:2024-06-01 21:13:49浏览次数:34  
标签:进阶 数据库 PyMySQL Navicat cursor pymysql sql id conn

Ⅰ 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)非官网

  1. 安装 navicat160_premium_cs_x64.exe 装好之后
  2. 启动破解工具
  • 启动:NavicatCracker.exe
  • Applied Path选择自己的安装目录

  1. Patch

  1. Generate
  • 生成激活码

  1. Copy
  • 拷贝激活码,鼠标选中激活码后“Ctrl+C”
  • 断开网络,断开网络,断开网络!!!!!重要的话说三遍
  • 打开“Navicat Premium 16”应用程序。
  • 选择立即激活或者注册
  • 粘贴刚才复制的激活码

  1. 点击激活
  • 因为断网了,所以可以点击“手动激活”。

  1. 复制请求码
  • 将“Navicat Premium 16”生成的“请求码”,复制到“注册机”中的“Request Code”输入框内。

  1. 生成激活码
  • 先点击“注册机”中的“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

相关文章

  • 软件测试进阶
    目录一、自动化测试1.概念2.Selenium2.1概念2.1.1Selenium是什么?2.1.2Selenium特点2.1.3工作原理2.2Selenium+Java环境搭配2.3定位元素2.3.1CSS语法2.3.2 XPath语法2.4应用2.4.1点击提交文本2.4.2模拟输入2.4.3清除文本2.4.4获取文本信息2.4.5......
  • Ansible05-Ansible进阶(流程控制、Roles角色、加密优化调优等)
    目录写在前面7Ansible进阶7.1流程控制7.1.1handlers触发器与notify7.1.1.1未使用handlers7.1.1.2使用handlers7.1.2when判断7.1.2.1when的语法7.1.2.2when判断主机名选择模块输出7.1.2.3when结合register变量7.1.3loop/with_items循环7.1.3.1with_items案......
  • LeetCode 第14题:最长公共前缀题目解析(进阶版)
    本文我们来探索LeetCode第14题——最长公共前缀题目解析(进阶版)。文章目录引言题目介绍解题思路思路1:水平扫描法思路2:垂直扫描法思路3:分治法思路4:二分查找法思路5:字典树(Trie)水平扫描法详细解析步骤1:初始化前缀步骤2:逐个比较示例讲解Java代码实现图......
  • 【C++进阶】深入STL之string:掌握高效字符串处理的关键
    ......
  • Navicat Premium 16.01 下载、安装教程
    NavicatPremium16下载与安装教程目录NavicatPremium16下载与安装教程前言安装步骤同意协议选择安装目录桌面快捷方式安装正在安装安装完成步骤下载方式前言数据库管理用Navicat更加方便,可视化效果更好,今天给大家带来2022NavicatPremium16.1最新安装,亲测有......
  • Scanner的进阶使用、顺序结构和选择结构
    Java流程控制02:Scanner的进阶使用一道练习题packagecom.xiwen.scanner;importjavafx.beans.binding.DoubleExpression;importjava.util.Scanner;publicclassDemo05{publicstaticvoidmain(String[]args){//我们可以输入多个数字,并且要求其......
  • Navicat安装与激活教程
    一、Navicat安装1、下载好安装工具与破解工具 2、选择安装目录(最好不要装在C盘,并记住地址,激活要用) 3、选择permiumsoft(选择默认的就行)4、勾选创建桌面图标 5、点击安装 二、激活(重大提醒:安装好navcat后不要打开,不要打开)1、打开解压文件的第二个文件(激活器) 2、......
  • Windows server 2022从基础到进阶的 DNS 管理内容,适合初学者快速入门并建立起对 DNS
    关于WindowsServer2022DNS管理器初级应用的大纲:1. 介绍DNS服务1.1什么是DNS?1.2DNS的作用和重要性1.3DNS解析过程概述2. 部署DNS服务器2.1安装DNS服务器角色2.2配置DNS服务器基本设置2.3DNS服务器的启动和停止3. 管理DNS区域3.1什么......
  • 2024年网络安全学习指南!详尽路线图,从零基础到黑客高手的进阶之路!
    零基础小白,到就业!入门到入土的网安/黑客学习路线!建议的学习顺序:一、网络安全学习普法(心里有个数,要进去坐几年!)1、了解并介绍《网络安全法》2、《全国人大常委会关于维护互联网安全的决定》3、《中华人民共和国计算机信息系统安全保护条例(2011年修正)》4、《中华人民共......
  • pymysql 模块演练代码
    importpymysqlfrompymysql.cursorsimportDictCursorconn=pymysql.connect(host='localhost',user='root',password='123456',database='day1',port=3306,cursorclass=DictCursor,connect_timeout=3)cursor=conn.cur......