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

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

时间:2024-06-12 21:32:45浏览次数:30  
标签:sql 游标 pymysql cursor PyMySQL SQL password 数据 conn

【一】Navicat的使用

【1】连接数据库

  • 打开 Navicat ,找到连接选项

  • 输入连接参数

  • 测试参数

【2】创建数据库

  • 新建数据库

  • 输入数据库参数

  • 新建表 并设置主键

  • 修改表字段

【3】导出SQL文件

【4】备份数据库

【5】视图展示

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

【二】PDManer(元数建模)

【1】软件官网

【三】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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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 pymysql

conn = 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, password


def 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()

标签:sql,游标,pymysql,cursor,PyMySQL,SQL,password,数据,conn
From: https://www.cnblogs.com/chosen-yn/p/18244733

相关文章

  • 使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能
    今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。首先引入nuget包Wesky.Net......
  • 线程池的使用:批量导入、数据汇总、异步保存搜索记录
    文章目录1、场景一:MySQL批量导入数据到ES1.1CountDownLatch1.2流程图1.3代码实现1.4效果2、场景二:数据汇总2.1流程图2.2代码实现3、场景三:异步调用3.1需求3.2代码实现1、场景一:MySQL批量导入数据到ES场景:需要将库里的1000万左右的数据量,导入到ES索引库中......
  • 微博-指定话题当日数据爬取
    一、对微博页面的分析(一)对微博网页端的分析首先,我们打开微博,发现从电脑端打开微博,网址为:SinaVisitorSystem我们搜索关键字:巴以冲突,会发现其对应的URL:巴以冲突(1)URL编码/解码通过对URL进行分析,不难发现我们输入的是中文“巴以冲突”,但是真实的链接却不含中......
  • 110.网络游戏逆向分析与漏洞攻防-装备系统数据分析-装备与技能描述信息的处理
    免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了内容参考于:易道云信息技术研究院上一个内容:109.商店与捨取窗口数据的处理码云版本号:4275a0966772e3fd4941ee......
  • [形策/法规] 《促进和规范数据跨境流动规定》 [转]
    国家互联网信息办公室令第16号《促进和规范数据跨境流动规定》已经2023年11月28日国家互联网信息办公室2023年第26次室务会议审议通过,现予公布,自公布之日起施行。主任庄荣文2024年3月22日第一条为了保障数据安全,保护个人信息权益,促进数据依法有序自由流动,根据......
  • uni-app上下级页面数据双向通信
    前情最近在做小程序项目,选用是当前比较火的uniapp技术栈,经常会遇到页面间消息传递的需求。为什么要这么做?uniapp页面间数据通信方式有很多:通过url传参,状态管理库vuex/pinia,本地存储,事件通道eventChannel,EventBus等。这次的需求是在A面点击一个按钮跳转到B页面拾取一个数据选项......
  • MYSQL——分组
    MYSQL——分组groupby的含义:将查询结果按照1个或多个字段进分组,字段值相同的为组。理解:按照表中数据的某个属性或多个属性将数据归类分成类,按照类别查询出来,这些分类就是分组查询。groupby可于单个字段分组,也可于多个字段分组。......
  • 鱼类常见图像的图像分类数据集
    30种鱼类常见图像分类数据集数据集:链接:https://pan.baidu.com/s/1Wqmb7uFFONVsV3EHrvL20A?pwd=j10y提取码:j10y数据集信息介绍:文件夹印度鲤中的图片数量:270文件夹四指鲳中的图片数量:198文件夹大眼鯥中的图片数量:288文件夹大眼鲢中的图片数量:191......
  • 解决本地机器连接虚拟机中MySQL数据库的问题指南
    在很多开发场景下,我们需在本地电脑通过应用程序或管理工具访问部署在虚拟机里的MySQL数据库,这对于项目测试、调试极其重要。默认配置下,MySQL可能仅接受源自虚拟机本身的连接请求。以下是详细步骤,指导你调整MySQL设置,实现本地到虚拟机MySQL数据库的无缝连接。第一步:登录MySQ......
  • 【力扣真题】3.哈希表|算法真题程序设计数据结构考研保研复试机试面试秋招春招蓝桥杯
    242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例1:输入:s=“anagram”,t=“nagaram”输出:true示例2:输入:s=“rat”,t=“car”输出:false说明:你可以假设字符串只包含小写字母。力扣题目链接思......