当前位置: 首页 > news >正文

Python数据库操作

        前面的章节中学习了使用 Python 读写文件的方法,大家可以用文件方式来存放数据,不过使用文件方式时不容易管理,同时还容易丢失,会带来许多问题。目前主流的方法都是采用数据库软件,通过数据库软件来组织和存放数据,不管是读还是存都非常方便,速度也有保障。本篇介绍 python 操作 MySQL 数据库软件的方法。

一、Python操作数据库简介

        数据库(Database)是按照数据结构来组织、存储和管理建立在计算机存储设备上的数据仓库。MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发。MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、windows、Mac 和 Solaris。MySOL 采用标准的 SOL 语言(结构化查询语言),SQL 是一种数据库査询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
        虽然 Python 可以支持数据的本地存储,但前提是先从数据库获取才能保存下来,同时还无法存储过多的数据,因为数据释放和使用会占用较大的内存,数据库负责把磁盘数据组织好放回内存,Python负责在内存中操作数据。

二、PyMySQL

        PyMySQL 是 Python 中操作 MySQL 的模块,其使用方法和 MySQLdb 几乎相同。但目前 PyMySQL支持 Python3.x,而 MySQLdb 不支持 3.x 版本。
        本章节我们来学习 PyMySQL 模块对数据库的操作,以及利用 python 脚本实现 mysql 的备份和还原。

1.设备清单

 2.在 python 主机安装 pymysql 模块

通过 pip 安装 PyMySQL 的命令:

[root@localhost ~]# pip3 install pymysql

 3.数据库主机安装 mariadb

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum -y install mariadb-server
[root@localhost ~]# systemctl start mariadb
[root@localhost ~]# mysqladmin -uroot password '123456'
[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> grant all on *.* to root@'%' identified by '123456';

4.在 mariadb01 上创建数据库 

MariaDB [(none)]> use test;
Database changed
MariaDB [test]> CREATE TABLE users (id int(11) NOT NULL AUTO_INCREMENT,email varchar(255), password varchar(255), PRIMARY KEY(id));

 5.pymysql使用

        在前面的课程中,已经详细的介绍过了 MySQL 的安装及配置过程,在本章将不做过多阐述。现在我们安装一个 Mariadb 数据库,并登录 Mariadb 实例,在 test 库中创建一张 users 表,root 帐户密码为“123456”,代码如下。

示例 1:使用 PyMySOL 模块连接 MySOL 数据库向 user 表插入一条记录并査询这条记录:

[root@localhost ~]# vim pymysql-1.py import pymysql
connection=pymysql.connect(host='192.168.10.102',
user='root',
password='123456',
db='test',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:with connection.cursor() as cursor:sql = "insert into users (email,password) values(%s,%s)"cursor.execute(sql,('zhangsan@qq.com','pwd123'))connection.commit()with connection.cursor() as cursor:sql = "select id,password from users where email=%s"cursor.execute(sql,('zhangsan@qq.com'))result = cursor.fetchone()print(result)
finally:connection.close()
[root@localhost ~]# python3 pymysql-1.py 
{'id': 1, 'password': 'pwd123'}
[root@localhost ~]# mysql -uroot -p123456
MariaDB [(none)]> use test;
MariaDB [test]> select * from users;
+----+-----------------+----------+
| id | email           | password |
+----+-----------------+----------+
|  1 | zhangsan@qq.com | pwd123   |
+----+-----------------+----------+
1 row in set (0.00 sec)

        从代码的执行结果中,可以看到数据库表中已经成功插入了一条记录。
        代码说明:先创建一个连接对象,下面是一个异常处理。如果连接成功,执行INSERT 语句并提交再执行 SELECT 语句,获取査询的第一条记录并打印;finally 是最终执行关闭连接。在上面示例中用到了 pymysql.connect()函数,还有游标对象 cursor,下面具体看下它们的用法。

表 7-1 是 pymysql.connect()函数的常用参数。

                表 7-1 pymysql.connect()函数的常用参数

参数描述
host数据库主机地址
user数据库账户
passwd账户密码
db使用的数据库
port数据库主机端口,默认 3306
connect timeout连接超时时间,默认10,单位秒
charset使用的字符集
cursorclass自定义游标使用的类。上面示例用的是字典类,以字典形式返回结果,默认是元组形式

表7-2是pymysq1 连接对象常用方法。

                                        表 7-2 pymysql 连接对象常用方法

方法描述
commit()提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中
rollback()事务回滚。对支持事务的数据库和表,如果执行此方法,则回滚当前事务,放弃之前的操作。
cursor([cursorclass])创建一个游标对象。所有的 sql 语句的执行都要在游标对象下进行

表 7-3 是游标对象常用方法。

                                表 7-3 游标对象常用方法

方法方法
close()关闭游标
execute(sql)执行 sql 语句
excutemany(sql)执行多条 sql 语句
fetchone()从执行结果中取第一条记录
fetchmany(n)从执行结果中取 n 条记录
fetchall()从执行结果中取所有记录

6.数据库增删改查

        了解了 pymysql 基本用法,现在使用上面的这些方法实现数据库的增、删、改、查功
能。

(1)增加记录

示例 2:在 user 表里再添加一条记录。

>>>import pymysql
>>>connection = pymysql.connect(host='localhost',user='root', password='123456',》db='test',charset='utf8mb4'cursorclass=pymysql.cursors.DictCursor)
>>>cursor=connection.cursor(
>>>sql="insert into users(email,password)values('lisi@gq.com','pwd123')"
>>>cursor.execute(sql)
>>>connection.commit()
>>>connection.close()
(2)查询记录

示例 3:查询 users 表记录

>>>import pymysql
>>>
connection=pymysql.connect(host='localhost',user='root',password='123456',db='test')
>>>cursor=connection.cursor()
>>>sql="SELECT id,email, password FROM users'
>>>cursor.execute(sq1)
5
>>>cursor.fetchone()# 获取第一条记录
>>>cursor.fetchmany(2)#获取前两条记录
>>>cursor.execute(sql)
>>>cursor.fetchall()#获取所有记录
>>>cursor.execute(sql)
>>>cursor.fetchall()[3]#查看第四条记录
>>>connection.close()
(3)修改记录

修改用户密码

>>>import pymysql
>>>
connection=pymysql.connect(host='localhost',user='root',password='123456',db='test')
>>>cursor=connection.cursor()
>>>sql ="UPDATE users SET password='456789'WHERE email='lisi@qq.com,'"
>>>cursor.execute(sql)
1
>>>connection.commit()
>>>sql="SELECT id,email,password FROM users`"
>>>cursor.execute(sq1)#执行sql语句
5
>>>cursor.fetchmany(2) #显示前两个记录
(4)删除记录

删除用户信息

>>>sql ='DELETE FROM users WHERE email="lisi@gq.com"
>>> cursor.execute(sql)
1
>>> connection.commit()
>>>sql="SELECT id, password FROM users WHERE email=%s"
>>>cursor.execute(sql,('zhangsan@qq.com',))
>>>cursor.execute(sql,('lisi@qq.com',))
0
>>>sq1 ="SELECT 'id`,email,`password FROM 'users'"
>>>cursor.execute(sql)
4
>>> cursor.fetchall()

7.遍历查询结果

例 6:查询 user 表所有 email 与密码
 

[root@localhost ~]# cat pymysql-2.py#!/usr/local/bin/python3.6
import pymysq1
connection = pymysql.connect(host='localhost',user='root', password='123456',db='test',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)try :with connection.cursor()as cursor:sql ="SELECT id,email,password FROM users"cursor.execute(sql)result =cursor.fetchall()for dict in result:print("email:%s,password:%s"%(dict['email'],dict['password']))
finally:connection.close()
[root@localhost ~]# python3 pymysql-2.py
email:user1@python.org,password:456789
email:user2@python.org,password:123456
email:user3@python.org,password:123456
email:user4@python.org,password:123456

三、案例实战--Python 脚本周期性备份 MySQL 数据库

        如果要对当前服务器上的数据库进行备份,从 MySQL 导出数据,需要用到 mysqldump 工具,备份全部数据库数据到一个 sq1 文件,包括 mysq1、sys、information schema.performance schema 等内置数据库。无论是否使用 Python 脚本执行数据库备份,都需要使用mysqldump 具。

本例服务器的 MySQL 连接信息如下:

host: 192.168.10.102
port:3306
user: root
password:123456

1.使用 mysqldump 命令一键备份 mysql 数据库

执行命令如下:

[root@localhost ~]# mysqldump -h 192.168.9.167 -uroot -p 123456 -A > backup mysql.sql

         不用编写 Python 脚本即可一条命令备份 mysq1 数据库,那么编写 Python 脚本备份数据库不是多此一举么?如果是备份全部数据,直接使用命令确实很方便,但是在企业生产环境中,备份的方式要灵活很多。例如只需要把每个数据库单独备份成一个 sq1 文件,并都保存在同一个目录下面。就需要手动执行很多条命令,此时使用 Python 脚本实现就非常简单方便了。

2.写 Python 脚本文件 backup mysql.py

使用 Python 编写数据库备份脚本 backup mysql.py 文件,代码如下:

import datetime
import os
importsubprocess
import time
import logging
import pymysql
# Set log format
logging.basicconfig(format='%(asctime)s-%(pathname)s[line:%(lineno)d]
-%(levelname)s:%(message)s',level=logging.INFO)
# MySOL database details to which backup to be done. Make sure below user having enoughprivileges to take databases backup.
# 数据库主机地址
MYSOL HOST ='192.168.10.102
# MySQL 数据库用户名MYSOL USERNAME ='root'
井
MYSOL PORT = 3306
# 数据库密码
MYSOL PASSWORD=123456
# 需要备份的数据库名称
# DB NAME ='main'
#排除,不进行备份操作的数据库名称集合
DISABLED DATABASEs = {'information schema', 'mysql', 'performance_schema', 'sys'}
#备份文件存放路径
BACKUP PATH ='/backup/mysql/'
# Getting current datetime to create seprate backup folder.DATETIME = datetime.datetime.now().strftime("%%m%d%H%M%S")
TODAYBACKUPPATH = BACKUP PATH + MYSOL HOST + '/'+ DATETIME# 备份保留时长
DAY =3
defmkdir if not exists(path):"""判断备份目录是否存在,不存在则创建Args :path:带创建目录名称
"""
if not os.path.exists(path):os.makedirs(path)
logging.info("creating backup folder")
def create mysql conn(db="mysql"):"""
创建并返回一个 MySQL 数据库连接Args :db:要连接的数据库名称"""conn = pymysql.connect(host=MYSOL HOST, pOrt=MYSOL PORT, USer=MYSOL USERNAMEpassword=MYSOL PASSWORD,db='mysql')return conndef read all databases():"""从数据库中读取全部数据库名称:return:数据库名称 list"""logging.info('读取全部数据库名称')conn = create mysql conn()cursor =conn.cursor()#查询服务器上有哪些数据库cursor.execute('show databases')res = cursor.fetchall()databases =fitem[0lfor item in res}# 排除掉指定不备份的数据库databases=list(databases-DISABLED DATABASES)cursor.close()conn.close()logging.info('读取数据库完毕,数据库列表如下:{}'.format(databases))return databasesdef backup database(database):"""备份指定数据库的数据和结构Args :database:待备份的数据库名称"""logging.info('开始备份数据库{}...'.format(database))# 通过调用mysqldump 完成指定数据库的备份command='mysqldump -h%s -u%s-p%s%s>%s/%s.sq1'%(MYSOL HOST, MYSOL USERNAME, MYSOL PASSWORD, database, TODAYBACKUPPATH,database)exit code =subprocess.call(command,shell=True)# 判断命令是否正常执行,异常则直接抛出if exit code != 0:raise Exception('在备份数据库的过程中出错,请检査!')logging.info('数据库 {} 备份完毕!'.format(database))def del old backup(path):"""删除保留时长以外的数据备份"""old folder = subprocess.Popen("find {} -maxdepth 3 -mindepth 2 -mtime +{} -typed".format(path, DAY),stdout=subprocess.PIPE, stderr=subprocess.STDOUT,shell=True).communicate()logging.info('时间戳为{}的备份将被删除'.format(old folder))str old folder = old folder[0].decode("utf-8",errors="ignore")logging.info("{}".format(str old folder))list lid folder =str old folder.split('\n')for folder in list lid folder:if folder.strip():logging.info("删除{".format(folder))os.system("rm -rf {}".format(folder))
def backup():"""读取全部数据库名称,并对这些数据库的数据和结构进行备份"""#检查备份路径是否存在,不存在则进行创建mkdir if not exists(TODAYBACKUPPATH)#读取全部待备份数据库名称databases =read all databases()# 逐个对数据库进行备份database in databases:forbackup database(database)# 删除旧备份del old backup(BACKUP PATH)#打印备份文件放置的目录print("\n")command ='echo -e"\e[;31m 本次备份放置的位置是:"subprocess.call(command,shell=True)print(TODAYBACKUPPATH)command='echo -e"e[m"subprocess.call(command,shell=True)
if_name__==' main ':backup()

3.执行 Python 脚本并查看备份后的 sql文件

编写完成后执行脚本完成备份,执行命令及结果如下:

[root@localhost ~]# python3 backup_mysql.py 
2024-10-16 09:45:30,118 - /root/backup_mysql.py[line:42] - INFO:creating backup folder
2024-10-16 09:45:30,145 - /root/backup_mysql.py[line:61] - INFO:读取全部数据库名称
2024-10-16 09:45:30,174 - /root/backup_mysql.py[line:72] - INFO:读取数据库完毕,数据库列表如下:['test']
2024-10-16 09:45:30,175 - /root/backup_mysql.py[line:82] - INFO:开始备份数据库test...
2024-10-16 09:45:30,191 - /root/backup_mysql.py[line:90] - INFO:数据库 test 备份完毕!
2024-10-16 09:45:30,193 - /root/backup_mysql.py[line:98] - INFO:时间戳为(b'', None)的备份将被删除
2024-10-16 09:45:30,194 - /root/backup_mysql.py[line:100] - INFO:本次备份放置的位置是:
/backup/mysql/localhost/20241016094530

        执行过备份脚本后,会将所有的数据库备份到同一个目录中,如果再次执行此脚本,就会创建一个新的目录,将所有的库的备份文件存放进去。

        用户可以将此脚本写入到周期性计划任务中,实现自动化的周期性数据库备份

        注意:warning 警告的意思是在命令行界面上使用密码可能不安全。所以在实际生产环境中可以利用常量来代替明文输入密码的这一步,或者在配置文件中填写用户名密码等方式保障安全。备份结束之后,可以在当前主机查看备份的结果。

4.编写导入数据库脚本restore_mysql.py

使用 Python 编写数据库备份脚本 restore_mysql.py 文件,代码如下:

[root@localhost ~]# vim restore_mysql.py import logging
import os
import subprocess
import pymysql
logging.basicConfig(format='%(asctime)s-%(pathname)s[line:%(lineno)d]-%(levelname)s: %(message)s',level=logging.INFO)   # 设置日志输出格式MYSQL_USERNAME = 'root'         # MySQL 数据库用户名
MYSQL_PASSWORD = '123456'               # 数据库密码
MYSQL_HOST = '192.168.10.103'   # 数据库主机地址
MYSQL_PORT = 3306       # 数据库端口
BACKUP_PATH = '/backup/mysql/192.168.10.102/20231216193331'     # 注意,要替换成你的备
份文件存放路径logging.info('开始获取需要恢复的数据库文件...')
files = list(os.listdir(BACKUP_PATH))
logging.info('文件列表:{}'.format(files))
for file in files:      # 开始逐个恢复数据库mydatabase=('{}'.format(file.split('.')[0]))print("\r")print("导入数据库:"+mydatabase)command = 'mysql -h{host} -f -u{user} -p{password} -P{port} -e "drop database {mydatabase}"&>/dev/null'.format(host=MYSQL_HOST,user=MYSQL_USERNAME,password=MYSQL_PASSWORD,port=MYSQL_PORT,mydatabase=mydatabase)subprocess.call(command, shell=True)command = 'mysql -h{host} -f -u{user} -p{password} -P{port} -e "create database {mydatabase}"&>/dev/null'.format(host=MYSQL_HOST,user=MYSQL_USERNAME,password=MYSQL_PASSWORD,port=MYSQL_PORT,mydatabase=mydatabase)subprocess.call(command, shell=True)logging.info('开始恢复数据库 {}...'.format(file.split('.')[0]))command = 'mysql -h{host} -f -u{user} -p{password} -P{port} {mydatabase}<{path}/{file}'.format(host=MYSQL_HOST,user=MYSQL_USERNAME,password=MYSQL_PASSWORD,port=MYSQL_PORT,file=file,path=BACKUP_PATH,mydatabase=mydatabase)subprocess.call(command, shell=True)
logging.info('完毕!')

5.执行数据库导入操作 

        我们可以将数据库导入到任何一个 mysq1 服务器中,这样我们就可以方便的进行数据库的迁移。

[root@localhost ~]# python3 restore_mysql.py 
2024-10-16 11:26:15,423-/root/restore_mysql.py[line:13]-INFO: 开始获取需要恢复的数据库文件...
2024-10-16 11:26:15,423-/root/restore_mysql.py[line:15]-INFO: 文件列表:['test.sql']导入数据库:test
2024-10-16 11:26:15,440-/root/restore_mysql.py[line:28]-INFO: 开始恢复数据库 test...
2024-10-16 11:26:15,453-/root/restore_mysql.py[line:31]-INFO: 完毕!

        备份和恢复的数据库服务器可以不是同一台服务器,所以此脚本也可用于数据库迁移的场景。当目标数据库中已经有同名的数据库了,会先删除同名数据库,再重新创建并恢复数据。所以在实际生产环境中,请确认此还原逻辑是否符合需求。对于执行数据库还原脚本时一定要谨慎操作。

相关文章:

Python数据库操作

前面的章节中学习了使用 Python 读写文件的方法&#xff0c;大家可以用文件方式来存放数据&#xff0c;不过使用文件方式时不容易管理&#xff0c;同时还容易丢失&#xff0c;会带来许多问题。目前主流的方法都是采用数据库软件&#xff0c;通过数据库软件来组织和存放数据&…...

交叉熵损失函数为代表的两层神经网络的反向传播量化求导计算公式

反向传播&#xff08;back propagation&#xff0c;BP&#xff09;算法也称误差逆传播&#xff0c;是神经网络训练的核心算法。我们通常说的 BP 神经网络是指应用反向传播算法进行训练的神经网络模型。反向传播算法的工作机制究竟是怎样的呢&#xff1f;我们以一个两层&#xf…...

数据结构——八大排序(上)

数据结构中的八大排序算法是计算机科学领域经典的排序方法&#xff0c;它们各自具有不同的特点和适用场景。以下是这八大排序算法的详细介绍&#xff1a; 一、插入排序&#xff08;Insertion Sort&#xff09; 核心思想&#xff1a;将数组中的所有元素依次跟前面已经排好的元…...

vxe-table 导入导出功能全解析

一、vxe-table 导入导出功能概述 vxe-table 的导入导出功能在数据处理中具有至关重要的作用。在现代数据管理和处理的场景中&#xff0c;高效地导入和导出数据是提高工作效率的关键。 对于导入功能而言&#xff0c;它允许用户将外部的表格数据&#xff0c;如 Excel 文件&…...

常用STL的操作以及特点

C 标准模板库&#xff08;STL&#xff09;提供了很多常用的数据结构和算法&#xff0c;极大简化了开发工作。STL 包括容器&#xff08;如 vector、list、map 等&#xff09;、算法&#xff08;如排序、查找等&#xff09;以及迭代器。以下是一些常用 STL 容器的操作以及它们的特…...

025 elasticsearch索引管理-Java原生客户端

文章目录 pom.xml1创建索引2.创建索引并设置settings信息3.创建索引并设置mapping信息4.删除索引库5.给未设置mapping的索引设置mapping elasticsearch版本7.10.2&#xff0c;要求java客户端与之相匹配&#xff0c;推荐Springboot版本是2.3以上版本 依赖配置使用的是JUnit 5&am…...

Gin框架操作指南10:服务器与高级功能

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…...

AIGC技术的学习 系列一

文章目录 前言一、AIGC技术演进1.1 图像视频生成1.2. 文本生成1.3. 多模态生成1.4. 小结二、CAD&CAE软件介绍2.1. CAD软件2.2. CAE软件2.3. 小结三、AIGC技术与CAD&CAE软件的集成案例3.1. 土建设计领域3.2. 机械设计领域四、结语五、参考文献总结前言 在全球智能制造的…...

Milvus×Dify半小时轻松构建RAG系统

最近&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术在AI界引起了广泛关注。作为一种将知识库与生成模型结合的新型架构&#xff0c;RAG大大提升了AI应用的实际表现。而在构建RAG系统时&#xff0c;Milvus作为业界领先的开源向量数据库&#xff0c;扮演着关键角色。本…...

wireshark 解密浏览器https数据包

一、导出浏览器证书有两种方法 1、在浏览器快捷方式追加启动参数&#xff1a; --ssl-key-log-file"d:\log\2.log" C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --ssl-key-log-file"d:\log\2.log" 2、环境变量中新建用…...

【HTML】构建网页的基石

我的主页&#xff1a;2的n次方_ HTML 是一种超文本标记语言&#xff0c;不仅有文本&#xff0c;还能包含图片&#xff0c;音频等 1. HTML 的文件基本结构 html 标签是整个 html 文件的最顶层标签&#xff0c;head 标签中写页面的属性&#xff0c;body 标签是页面中显示的…...

rust不允许在全局区定义普通变量!

文章目录 C 中的全局变量Rust 中的全局变量设计哲学的体现 在 C 和 Rust 中&#xff0c;全局变量的处理方式体现了这两种语言设计哲学上的一些根本性差异&#xff1a; C 中的全局变量 C 允许在全局作用域中定义变量。这些变量在程序的整个生命周期内都存在&#xff0c;从程序开…...

量化投资中的数据驱动决策:大数据如何改变金融市场

随着科技的进步&#xff0c;金融行业迎来了前所未有的变革&#xff0c;量化投资作为其中的代表&#xff0c;逐渐成为投资市场的主流。量化投资是基于数学模型、数据分析以及算法策略的投资方式&#xff0c;与传统依赖经验和直觉的投资方法相比&#xff0c;它的核心优势在于能够…...

MySQL 设计数据表

一个数据表主要包含信息有 : 表名、主键、字段、数据类型、索引&#xff0c;本节主要介绍表的命名规范、字段命名、字段的数据类型选择。 新建的表都是新建在 “item_name” 数据库中的&#xff0c;新建 “item_name” 数据库命令如下 : CREATE DATABASE item_name;新建数据库…...

【大数据技术基础 | 实验一】配置SSH免密登录

文章目录 一、实验目的二、实验要求三、实验原理&#xff08;一&#xff09;大数据实验一体机&#xff08;二&#xff09;SSH免密认证 四、实验环境五、实验内容和步骤&#xff08;一&#xff09;搭建集群服务器&#xff08;二&#xff09;添加域名映射&#xff08;三&#xff…...

地级市碳排放效率测算2006-2021年

为了测算碳排放效率&#xff0c;研究者们采用了多种方法&#xff0c;其中超效率SBM&#xff08;Slack-Based Measure&#xff09;和超效率CCR&#xff08;Charnes, Cooper and Rhodes&#xff09;模型是常用的两种方法。这些模型可以有效地评估决策单元的相对有效性&#xff0c…...

周易解读:四象

四 象 在前面呢&#xff0c;我是讲完了太极与两仪的知识。这一节&#xff0c;我们来讲解四象的内容。 关于四象的知识&#xff0c;它在正式的周易的经文里面&#xff0c;它并没有多少用处。但是呢&#xff0c;在基础知识的学习里面&#xff0c;四象的知识&#xff0c;大家是…...

Java设计模式梳理:行为型模式(策略,观察者等)

行为型模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了&#xff0c;所以把它放到最前面进行介绍。它比较简单&#xff0c;我就不废话&#xff0c;直接用代码说事吧。 下面设计的…...

【MySQL】入门篇—基本数据类型:使用LIMIT限制结果集

为了提高查询效率和用户体验&#xff0c;MySQL提供了LIMIT子句&#xff0c;用于限制查询结果的行数。LIMIT不仅可以提高性能&#xff0c;还可以帮助用户快速获取所需的数据&#xff0c;尤其在分页显示数据时非常有用。 应用场景&#xff1a; 分页显示&#xff1a;在网页应用中…...

PostgreSQL与MySQL在语法上的区别

PostgreSQL与MySQL在语法上的区别 在数据库管理系统中&#xff0c;PostgreSQL和MySQL都是非常受欢迎的选择。虽然它们都是一种关系型数据库管理系统(RDBMS)&#xff0c;但它们在语法上有一些显著的区别。本文将介绍PostgreSQL和MySQL在语法上的主要区别。 数据类型 PostgreS…...

frameworks 之InputDispatcher

frameworks 之InputDispatcher 1. 填充Iq2.进入循环3.进入oq4. 发布消息&#xff0c;并将数据放进去wq5. 接收消息6. 移除wq android 输入事件 主要分 2个流程 事件读取 和 事件分发。本文讲解事件分发流程。 涉及到的类如下 -frameworks/native/services/inputflinger/Input…...

ESP32-IDF GPIO 专题

目录 一、基本介绍1、配置结构体2、API2.1 gpio_config2.2 gpio_reset_pin2.3 gpio_set_intr_type2.4 gpio_intr_enable2.5 gpio_intr_disable2.6 gpio_set_level2.7 gpio_get_level2.8 gpio_set_direction2.9 gpio_set_pull_mode2.10 gpio_isr_register2.11 gpio_install_isr_…...

深度学习代码学习笔记2

1、torch.max correct 0 total 0 for xb,yb in valid_dl:outputs model(xb)_,predicted torch.max(outputs.data,1)total yb.size(0) #yb.size(0) 返回的是张量 yb 在第 0 维的大小&#xff0c;也就是 yb 中的样本数量。correct (predicted yb).sum().item() print(…...

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)

第一步&#xff1a;搭建CAD类库dll开发环境。 第二步&#xff1a;添加窗体 第三步&#xff1a;添加控件 第四步&#xff1a;双击控件&#xff0c;在控件点击方法内输入代码 第五步&#xff1a;在主程序内实例化新建的form类&#xff0c;并弹窗form窗体 第六步&#xff1a;CAD命…...

【亲测可行】最新ubuntu搭建rknn-toolkit2

文章目录 🌕结构图(ONNX->RKNN)🌕下载rknn-toolkit2🌕搭建环境🌙配置镜像源🌙conda搭建python3.8版本的虚拟环境🌙进入packages目录安装依赖库🌕测试安装是否成功🌕其它🌙rknn-toolkit2🌙rknn_model_zoo🌙关于部署的博客发布本文的时间为2024.10.13…...

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover&#xff08;悬停&#xff09; 定义&#xff1a;发起交互的对象停留在可交互对象的交互区域。例如&#xff0c;当手触摸到物品表面&#xff08;可交互区域&#xff09;时&#xff0c;视为触发了Hover。 Grab&#xff08;抓取&#xff09; 概念&#xff…...

16年408计算机网络

第一题&#xff1a; 解析&#xff1a; 首先我们要清楚R1,R2,R3是路由器&#xff08;网络层&#xff09;&#xff0c;Switch是以太网交换机&#xff08;数据链路层&#xff09;&#xff0c;Hub是集线器&#xff08;物理层&#xff09;。 由此可见路由器实现的最高功能层是3层&am…...

PDF 转 CAD 工具:实现文档格式高效转换的利器

如果你从事设计相关PDF和CAD作为两种常见且重要的文件格式&#xff0c;在不同的领域都有着广泛的应用。今天&#xff0c;我们就来介绍几个各具特色的PDF转换成CAD工具。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ 该工具在跨领域应用中表现出明确…...

基于springboot的画师约稿系统的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的画师约稿系统的设计与实…...

使用Python生成SVG图片

SVG(可缩放矢量图形)是一种基于XML的图像格式,它可以无损缩放且文件大小较小。在本文中,我们将探讨如何使用Python生成SVG图片。 为什么选择SVG? 可缩放:SVG图像可以无限放大而不失真。文件小:SVG文件通常比位图文件小。可编辑:SVG文件可以通过文本编辑器修改。 使用Python…...