Navicat的使用、PDManer、PyMySQL(连接数据库、执行SQL语句、结果获取、插入数据、删除数据、更新数据)

news/2024/10/3 8:30:19

【一】Navicat的使用

【1】连接数据库

  • 打开 Navicat ,找到连接选项

  • 输入连接参数

  • 测试参数

【2】创建数据库

  • 新建数据库

  • 输入数据库参数

  • 新建表 并设置主键

  • 修改表字段

【3】导出SQL文件

【4】备份数据库

【5】视图展示

  • 会展示当前数据库下的所有表模型

【二】PDManer(元数建模)

【1】软件官网

  • https://gitee.com/robergroup/pdmaner/releases

【三】PyMySQL

【1】介绍

  • 纯Python实现的模块,可以与Python代码兼容衔接,并也几乎兼容MySQL-python。
  • 遵循 Python 数据库 API v2.0 规范。
  • 官网:https://zetcode.com/python/pymysql/

【2】安装

# [1] 安装pymysql
pip install pymysql

【3】连接数据库

  • 使用connect函数创建连接对象,此连接对象提供关闭数据库、事务提交、事务回滚等操作。
  • 传入参数有很多,具体参考文档,一般参数基本连接信息 host, user, password, port(默认为3306), database。

(1)连接语法

import pymysql# [1] 连接数据库所需要知道的参数
"""
user=用户名
password=密码,
host=IP 本地 127.0.0.1 / localhost,
database= 需要连接到哪个数据库,
port=端口,
charset=编码集,
# sql_mode=严格模式,
cursorclass=Cursor 获取查询集的显示结果样式,
connect_timeout=10, 连接超时 默认10秒
autocommit=False 自动执行提交,
passwd=输入密码,  
db=需要连接到哪个数据库,
"""conn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4'
)
print(conn)# 输出结果
<pymysql.connections.Connection object at 0x0000018B69FAFA00>
# 连接成功

(2)主要方法介绍

方法 功能
cursor() 获取游标对象,操作数据库,如执行DML操作,调用存储过程等
commit() 提交事务
rollback() 回滚事务
close() 关闭数据库连接

【4】执行SQL-查询语句

(1)创建游标对象

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)

(2)执行SQL语句

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)

【5】查询结果获取

(1)获取所有结果(fetchall)

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
# 获取执行SQL语句的结果
# 获取结果的时候类似于管道里面存了结果
# fetchall 一下子将所有数据全部拿出来
result = cursor.fetchall()
print(result)# 输出结果
[{'id': 1, 'name': 'chosen', 'gender': 'male', 'age': 20, 'hire_date': datetime.date(2024, 5, 29), 'post': 'professor', 'post_comment': None, 'salary': 1000.1, 'office': 501, 'depart_id': 1}, {'id': 2, 'name': 'mengmeng', 'gender': 'female', 'age': 25, 'hire_date': datetime.date(2022, 1, 2), 'post': 'teacher', 'post_comment': None, 'salary': 12000.5, 'office': 401, 'depart_id': 1}, ...]

(2)获取一行数据(fetchone)

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
# 获取执行SQL语句的结果
# 获取结果的时候类似于管道里面存了结
result = cursor.fetchone()  # 返回一条数据
# 获取到一条结果,如果再 fetchone 就会拿到下一条结果
# result = cursor.fetchone()
print(result)# 输出结果
{'id': 1, 'name': 'chosen', 'gender': 'male', 'age': 20, 'hire_date': datetime.date(2024, 5, 29), 'post': 'professor', 'post_comment': None, 'salary': 1000.1, 'office': 501, 'depart_id': 1}

(3)获取查询指定结果数据量(fetchmany)

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
# 获取执行SQL语句的结果
# 获取结果的时候类似于管道里面存了结
result = cursor.fetchmany(3)  # fetchmany(size) 获取查询结果集中指定数量的记录,size默认为1
print(result)# 输出结果
[{'id': 1, 'name': 'chosen', 'gender': 'male', 'age': 20, 'hire_date': datetime.date(2024, 5, 29), 'post': 'professor', 'post_comment': None, 'salary': 1000.1, 'office': 501, 'depart_id': 1}, {'id': 2, 'name': 'mengmeng', 'gender': 'female', 'age': 25, 'hire_date': datetime.date(2022, 1, 2), 'post': 'teacher', 'post_comment': None, 'salary': 12000.5, 'office': 401, 'depart_id': 1}, {'id': 3, 'name': 'xiaomeng', 'gender': 'male', 'age': 35, 'hire_date': datetime.date(2019, 6, 7), 'post': 'teacher', 'post_comment': None, 'salary': 15000.99, 'office': 401, 'depart_id': 1}]

【注意】

  • 当 上一条查询指令是 fetchall 它会把所有数据都拿出来
  • 所以当 再用 fetchone 的时候就拿不到数据了,会返回 None

(4)移动光标

cursor.scroll(1, 'relative')  # 相对于当前位置往后移动一个单位
cursor.scroll(1, 'absolute')  # 相对于起始位置往后移动一个单位
import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 创建SQL语句
sql = 'select * from emp;'
# 执行
res = cursor.execute(sql)
# 获取执行SQL语句的结果
# 获取结果的时候类似于管道里面存了结
result = cursor.fetchmany(2)
cursor.scroll(1, 'relative')
result = cursor.fetchone()
print(result)# 输出结果
{'id': 4, 'name': 'xiaona', 'gender': 'female', 'age': 29, 'hire_date': datetime.date(2018, 9, 6), 'post': 'teacher', 'post_comment': None, 'salary': 11000.8, 'office': 401, 'depart_id': 1}result = cursor.fetchmany(2)
cursor.scroll(1, 'absolute')
result = cursor.fetchone()
print(result)# 输出结果
{'id': 2, 'name': 'mengmeng', 'gender': 'female', 'age': 25, 'hire_date': datetime.date(2022, 1, 2), 'post': 'teacher', 'post_comment': None, 'salary': 12000.5, 'office': 401, 'depart_id': 1}

【6】插入数据

  • 插入操作中参数可以以元组、列表和字典形式传入
  • 需要使用到占位符 “%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语句

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 插入数据
sql = 'insert into user(username,password) values("chosen","123456");'
# 指定sql语句
cursor.execute(sql)
# 提交事务才可以生效
conn.commit()

(2)方式二:格式化传入参数

# %s 位置站位
import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 插入数据
sql = 'insert into user(username,password) values(%s,%s);'
# 指定sql语句
cursor.execute(sql, ['max', '123789'])
cursor.execute(sql, ('opp', '456789'))
# 提交事务才可以生效
conn.commit()

(3)方式三:关键字传入参数

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 插入数据
sql = 'insert into user(username,password) values(%(username)s,%(password)s);'
# 指定sql语句
cursor.execute(sql, {'username':'james','password':'456789'})
# 提交事务才可以生效
conn.commit()

(4)批量插入数据

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 插入数据
# (1)方案一:遍历每一个数据然后插入数据
name_list = [i for i in "chosen"]
password_list = [str(i) for i in range(6)]
data_all = list(zip(name_list, password_list))
# [('c', '0'), ('h', '1'), ('o', '2'), ('s', '3'), ('e', '4'), ('n', '5')]
# 插入数据
sql = 'insert into user(username,password) values(%s,%s);'
for data in data_all:cursor.execute(sql, data)
# 指定sql语句
# 提交事务才可以生效
conn.commit()# (2)方案2 : 一次性批量插入数据
name_list = [i for i in "Ptrjkl"]
password_list = [str(i) for i in range(6)]
data_all = list(zip(name_list, password_list))
# [('c', '0'), ('h', '1'), ('o', '2'), ('s', '3'), ('e', '4'), ('n', '5')]
# 插入数据
sql = 'insert into user(username,password) values(%s,%s);'
# 指定sql语句
cursor.executemany(sql, data_all)
# 提交事务才可以生效
conn.commit()

【7】删除数据

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 删除数据
# [1] 直接写SQL语句
sql = 'delete from user where id=2;'
cursor.execute(sql)
# 提交事务
conn.commit()# [2] 占位
sql = 'delete from user where id=%s;'
cursor.execute(sql, [5])
# 提交事务
conn.commit()# [3] 关键字占位
sql = 'delete from user where id=%(id)s;'
cursor.execute(sql, {'id': 8})
conn.commit()

【8】更新数据

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)# 更新数据
# [1]直接写
sql = 'update user set password="666" where id=6;'
cursor.execute(sql)
conn.commit()# [2]占位
sql = 'update user set password=%s where id=%s;'
cursor.execute(sql, ['963', 1])
conn.commit()# [3]关键字占位
sql = 'update user set password=%(pwd)s where id=%(id)s'
cursor.execute(sql, {'pwd': '000', 'id': 9})
conn.commit()

【9】SQL注入问题

import pymysqlconn = pymysql.connect(user='root',password='123456',host='localhost',database='emp_data',port=3306,charset='utf8mb4',# 自动提交事务# autocommit=True
)
# 创建游标,查询数据以元组形式返回
# cursor = conn.cursor()# 创建游标,查询数据以字典形式返回
cursor = conn.cursor(pymysql.cursors.DictCursor)def get_username_password():username = input("username:>>>>>").strip()password = input("password:>>>>>").strip()return username, passworddef login():username, password = get_username_password()sql = 'select * from user where username=%s and password=%s;'cursor.execute(sql, [f'{username}', f'{password}'])result = cursor.fetchone()if result:print(f'登录成功!')else:print(f'登录失败')print(result)if __name__ == '__main__':login()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44660.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能

今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。 为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。 首先引入nu…

gophish钓鱼

目录环境介绍安装1、设置发件人的邮箱2、编辑钓鱼邮件模板3、制作钓鱼页面4、设置目标用户5、创建钓鱼事件6、查看结果 参考1 参考2 参考3 Gophish官网并下载适用于Linux的版本 环境介绍 Ubuntu22图形化/16G/4U/120G 172.16.186.137/24安装 rambo@test1:~$ mkdir gophish &…

NumPy 舍入小数、对数、求和和乘积运算详解

NumPy 提供五种舍入小数的方法:`trunc()`, `fix()`, `around()`, `floor()`, `ceil()`。此外,它还支持对数运算,如 `log2()`, `log10()`, `log()`,以及自定义底数的对数。NumPy 的 `sum()` 和 `prod()` 函数用于数组求和与乘积,可指定轴进行计算,`cumsum()` 和 `cumprod(…

微博-指定话题当日数据爬取

该文章详细描述了如何通过分析和抓包技术,绕过微博网页端和手机端的数据访问限制,使用Python脚本爬取与特定关键词(如"巴以冲突")相关的微博数据。文章首先探讨了网页端微博数据爬取的局限性,如需要登录账号和数据量限制,然后转向手机端,发现其对爬虫更为友好…

ZYNQ LINUX如何开机自动执行指定脚本

本意是想要开机后自动加载某内核驱动,并且执行指定应用程序。在 /etc/init.d/rc 末尾增加指定脚本执行即可。脚本内容 insmod /usr/u-dma-buf.ko

20240612-vscode中oh-my-posh下powershell指定profile.ps1默认文件

vscode下遇到了命令提示符带有一串未知字符的问题,尝试get-poshthemes发现没有出现这些字符,于是判断可能是powershell的profile.ps1中主题相关的文件配置出了问题,打算换个主题。修改了profile.ps1文件之后,windows terminal下powershell可以正常生效,但是vscode却不行,…

FastAPI-8:Web层

8 Web层 本章将进一步介绍FastAPI应用程序的顶层(也可称为接口层或路由器层)及其与服务层和数据层的集成。 一般来说,我们如何处理信息?与大多数网站一样,我们的网站将提供以下方法:检索 创建 修改 替换 删除8.1 插曲: 自顶向下、自底向上、中间向外?(Top-Down, Bottom…

模拟epoll的饥饿场景

说明 一直听说epoll的饥饿场景,但是从未在实际环境中面对过,那么能不能模拟出来呢?实际的情况是怎样呢? 模拟步骤基于epoll写一个简单的tcp echo server,将每次read返回的字节数打印出来 模拟一个客户端大量写入 测试其他客户端能否正常返回Server代码 #include <stdio…