Python 之数据库操作(Python Database Operations)

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。

推荐:Linux运维老纪的首页,持续学习,不断总结,共同进步,活到老学到老
导航剑指大厂系列:全面总结 运维核心技术:系统基础、数据库、网路技术、系统安全、自动化运维、容器技术、监控工具、脚本编程、云服务等。
常用运维工具系列:常用的运维开发工具, zabbix、nagios、docker、k8s、puppet、ansible等
数据库系列:详细总结了常用数据库 mysql、Redis、MongoDB、oracle 技术点,以及工作中遇到的 mysql 问题等
懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂
非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

Python 之数据库操作
技能目标:
- 掌握使用 pymysql 模块操作数据库的方法
- 掌握使用 sqlalchemy 模块操作数据库的方法
- 掌握使用 Python 脚本备份还原数据库的方法

7.1 Python 操作数据库简介

不过使用文件方式时不容易管理,同时还容易丢失,会带来许多问题。目前主流的方法都是

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

7.2 PyMySQL

PyMySQL Python 中操作 MySQL 的模块,其使用方法和 MySQLdb 几乎相同。但
目前 PyMySQL 支持 Python3.x,而 MySQLdb 不支持 3.x 版本。

7.2.1 安装 pymysql 模块

通过 pip 安装 PyMySQL 的命令:
[root@localhost ~] # pip3 install pymysql
7.2.2 pymysql 使用
官方文档:https://pypi.org/project/PyMySQL/#documentation
在前面的课程中,已经详细的介绍过了 MySQL 的安装及配置过程,在本章将不做过多
阐述。
假设本机已安装 MySQL,现在登录 MySQL 实例,创建一个 test 库,并在其中创建一
users 表,root 帐户密码为“123456”,代码如下。
# mysql -uroot –p
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) COLLATE utf8_bin NOT NULL,
`password` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
AUTO_INCREMENT=1 ;
Query OK, 0 rows affected (0.11 sec)
示例 1:使用 PyMySQL 模块连接 MySQL 数据库向 user 表插入一条记录并查询这条
记录:
[root@localhost ~] # cat pymysql-1.py
#!/usr/local/bin/python3.6
import pymysql
connection = pymysql.connect(host='localhost',
user='root',
password='123456',
db='test',
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# Create a new record
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
cursor.execute(sql, ('webmaster@python.org', 'very-secret'))
# connection is not autocommit by default. So you must commit to save
# your changes.
connection.commit()
with connection.cursor() as cursor:
# Read a single record
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('webmaster@python.org',))
result = cursor.fetchone()
print(result)
finally:
connection.close()
[root@localhost ~] # python3 pymysql-1.py
{'id': 1, 'password': 'very-secret'}
执行成功,进 MySQL 看下是否插入成功。
[root@localhost ~]# mysql -uroot -p
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from users;
+----+----------------------+-------------+
| id | email
| password
|
+----+----------------------+-------------+
| 1 | webmaster@python.org | very-secret |
+----+----------------------+-------------+
1 row in set (0.00 sec)
从代码的执行结果中,可以看到数据库表中已经成功插入了一条记录。
代码说明:先创建一个连接对象,下面是一个异常处理。如果连接成功,执行 INSERT
语句并提交,再执行 SELECT 语句,获取查询的第一条记录并打印;finally 是最终执行关
闭连接。在上面示例中用到了 pymysql.connect()函数,还有游标对象 cursor,下面具体看
下它们的用法。
语法:
pymysql.connect()
7-1 pymysql.connect()函数的常用参数。
7-1 pymysql.connect()函数的常用参数
参数描述
host数据库主机地址
user数据库账户
passwd账户密码
db使用的数据库
port数据库主机端口,默认 3306
connect_timeout连接超时时间,默认 10,单位秒
charset使用的字符集
cursorclass
自定义游标使用的类。上面示例用的是字典类,以字典形式返回结果,
默认是元组形式

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

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

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

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

7.2.3 数据库增删改查

了解了 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 (%s, %s)"
>>> cursor.execute(sql, ('user1@python.org', '123456'))
1
# 影响的行数
>>> connection.commit()
# 提交事务,写到数据库
>>> sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
>>> cursor.execute(sql, ('user1@python.org',))
1
>>> result = cursor.fetchone()
>>> print(result)
{'id': 2, 'password': '123456'}
下面是一次插入多条记录的代码。
>>> sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)"
>>>
args
=
[('user2@python.org','123456'),
('user3@python.org','123456'),('user4@python.org','123456')]
>>> cursor.executemany(sql, args)
3
>>> connection.commit()
>>> sql = "SELECT `id`, `email`, `password` FROM `users`"
>>> cursor.execute(sql)
5
>>> result = cursor.fetchall()
>>> print(result)
[{'id': 1, 'email': 'webmaster@python.org', 'password': 'very-secret'}, {'id': 2, 'email':
'user1@python.org', 'password': '123456'}, {'id': 3, 'email': 'user2@python.org', 'password':
'123456'}, {'id': 4, 'email': 'user3@python.org', 'password': '123456'}, {'id': 5, 'email':
'user4@python.org', 'password': '123456'}]
args 变量是一个包含多元组的列表,每个元组对应着每条记录。当插入多条记录时,
使用此方法,可有效提高插入效率。

2. 查询记录

示例 3:查询 users 表记录
>>> sql = "SELECT `id`, `email`, `password` FROM `users`"
>>> cursor.execute(sql)
5
>>> cursor.fetchone()
# 获取第一条记录
{'id': 1, 'email': 'webmaster@python.org', 'password': 'very-secret'}
>>> cursor.execute(sql)
5
>>> cursor.fetchmany(2)
# 获取前两条记录
[{'id': 1, 'email': 'webmaster@python.org', 'password': 'very-secret'}, {'id': 2, 'email':
'user1@python.org', 'password': '123456'}]
>>> cursor.fetchall()
# 获取所有记录
[{'id': 3, 'email': 'user2@python.org', 'password': '123456'}, {'id': 4, 'email': 'user3@python.org',
'password': '123456'}, {'id': 5, 'email': 'user4@python.org', 'password': '123456'}]

3. 修改记录

示例 4:将 user1@python.org 密码修改为 456789
>>> sql = "UPDATE users SET `password`='456789' WHERE `email`='user1@python.org'"
>>> cursor.execute(sql)
1
>>> connection.commit()
>>> sql = "SELECT `id`, `email`, `password` FROM `users`"
>>> cursor.execute(sql)
5
>>> cursor.fetchmany(2)[{'id': 1, 'email': 'webmaster@python.org', 'password': 'very-secret'}, 'id': 2, 'email':
'user1@python.org', 'password': '456789'}}]

4. 删除记录

示例 5:删除 email webmaster@python.org 的记录
>>> sql = 'DELETE FROM `users` WHERE email="webmaster@python.org"'
>>> cursor.execute(sql)
1
>>> connection.commit()
>>> sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
>>> cursor.execute(sql, ('webmaster@python.org',))
0
>>> sql = "SELECT `id`, `email`, `password` FROM `users`"
>>> cursor.execute(sql)
4
>>> cursor.fetchall()
[{'id': 2, 'email': 'user1@python.org', 'password': '123456'}, {'id': 3, 'email': 'user2', 'password':
'123456'}, {'id': 4, 'email': 'user3', 'password': '123456'}, {'id': 5, 'email': 'user4', 'password':
'123456'}]

7.2.4 遍历查询结果

示例 6:查询 user 表所有 email 与密码
[root@localhost ~]# cat pymysql-2.py
#!/usr/local/bin/python3.6
import pymysql
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
pymysql 模块主要是提供连接数据库和获取 SQL 语句执行结果的方法。

7.3 SQLAlchemy

官方文档:http://docs.sqlalchemy.org/en/latest/contents.html
Python 中,最有名的 ORM 框架实现是 SQLAlchemy 模块。
ORMObject-Relational Mapping,对象关系映射):是一种程序技术,用于将关系
数据库的表结构映射到对象上。ORM 提供了概念性、易于理解的模型化的方法。使用 ORM
技术,可以避免写复杂的 SQL 语句。

7.3.1 安装 SQLAlchemy 模块

通过 pip 命令安装 SQLAlchemy 模块。
# pip3 install sqlalchemy

7.3.2 基本使用

SQLAlchemy 模块的用法如下。

1. 创建 MySQL 连接

导入 SQLAlchemy 模块指定类,并创建 MySQL 连接。
>>> from sqlalchemy import create_engine
连接 MySQL 数据库,使用 create_engine()方法如下:
>>> engine =create_engine('mysql+pymysql://root:123456@localhost:3306/test')
参数格式:
'数据库类型+数据库驱动名称://用户名:口令@机器地址:端口号/数据库名'
此时,engine 变量是一个实例,它表示数据库的核心接口。
创建一个数据库连接时,create_engine()方法尚未打开连接。当第一次调用时,才会由
Engine 维护的连接池建立一个连接,并保留它,直到提交所有更改或关闭会话对象。

2. 声明映射

当使用 ORM 时,首选描述我们要处理的数据库表,通过定义自己的类到这些表。
映射表是通过一个基类来定义的,所以要先导入它。
>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base = declarative_base()
现在有了一个基类,我们可以根据它定义任意数量的映射类。例如定义数据库表名为
users,该类中定义了表的详细信息,主要是表名,以及列的名称和数据类型。
>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(255))
password = Column(String(255))
一个映射类至少需要一个__tablename__属性,并且至少有一个 Column 是主键。
如果多个表,就继续定义其他表的类,跟上面代码一样。

3. 创建会话

现在开始与数据库交互,先创建一个会话。
>>> from sqlalchemy.orm import sessionmaker
>>> Session = sessionmaker(bind=engine)
>>> Session = sessionmaker()
>>> Session.configure(bind=engine)
实例化一个 Session
>>> session = Session()

4. 数据库基本操作

添加对象,有了 ORM,向数据库表中添加一行记录,可以视为添加一个 User 对象:
>>> add_user = User(email='user5@python.org', password='123456')
>>> session.add(add_user)
>>> session.commit()
创建 Query 查询,filter where 条件,最后调用返回唯一行。如果调用 all()则返回所
有行,并且以列表类型返回:
>>> user = session.query(User).filter(User.email=='user5@python.org').one()
>>> user.email
'user5@python.org'
>>> user.password
'123456'
可以给 User 一次添加多个对象,使用 add_all()
>>> session.add_all([
User(email='user6@python.org', password='123456'),
User(email='user7@python.org', password='123456'),
User(email='user8@python.org', password='123456')])
有三个新 User 对象正在等待处理。
>>> session.new
IdentitySet([<__main__.User
object
at
0x7fa80bd71ba8>,
<__main__.User
object
at
0x7fa80bd71908>, <__main__.User object at 0x7fa80bd716d8>])
将更改刷新到数据库,并提交事务。
>>> session.commit()
修改 user5@python.org 密码:
>>>session.query(User).filter(User.email=='user5@python.org').update({"password":456789})
1
>>> user = session.query(User).filter(User.email=='user5@python.org').one()
>>> user.password
456789
>>> session.commit()
现在,对实现步骤进行总结。
[root@localhost ~]# cat pymysql-3.py
#!/usr/local/bin/python3.6
from sqlalchemy import create_engine
# 导入初始化数据库连接类
from sqlalchemy.ext.declarative import declarative_base # 导入声明映射用的基类from sqlalchemy import Column, Integer, String # 导入字段类型
from sqlalchemy.orm import sessionmaker # 导入会话的类
# 创建对象的基类
Base = declarative_base()
# 定义 User 对象
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String(255))
password = Column(String(255))
# 初始化数据库连接
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
# 创建 Session 类型
Session = sessionmaker(bind=engine)
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
# 查询所有记录
user = session.query(User).all()
for i in user:
print("email: %s, password: %s" %(i.email, i.password))
[root@localhost ~]# python3 pymysql-3.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
email: user5@python.org, password: 456789
email: user6@python.org, password: 123456
email: user7@python.org, password: 123456
email: user8@python.org, password: 123456
当查询一个 User 对象时,该对象返回一个包含若干个对象的列表。
ORM 框架的作用就是把数据库表的一行记录与一个对象相互做自动转换。
7.4 Python 脚本备份还原 MySQL 数据库
如果要对当前服务器上的数据库进行备份,从 MySQL 导出数据,需要用到 mysqldump
工具,备份全部数据库数据到一个 sql 文件,包括 mysqlsysinformation_schema
performance_schema 等内置数据库。无论是否使用 Python 脚本执行数据库备份,都需要
使用 mysqldump 工具。
本例服务器的 MySQL 连接信息如下:
host: 192.168.9.167
port: 3306
user: root
password: 123456
7.4.1 使用 mysqldump 命令一键备份 mysql 数据库
执行命令如下:
[root@localhost ~]# mysqldump -h 192.168.9.167 -uroot -p 123456 -A > mysql_backup.sql
不用编写 Python 脚本即可一条命令备份 mysql 数据库,那么编写 Python 脚本备份数
据库不是多此一举么?如果是备份全部数据,直接使用命令确实很方便,但是在企业生产环
境中,备份的方式要灵活很多。例如只需要把每个数据库单独备份成一个 sql 文件,并都保
存在同一个目录下面。就需要手动执行很多条命令,此时使用 Python 脚本实现就非常简单
方便了。
7.4.2 编写 Python 脚本文件 mysql_backup.py
使用 Python 编写数据库备份脚本 mysql_backup.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.9.167'
# 数据库主机地址
MYSQL_PORT = 3306
# 数据库端口
BACKUP_PATH = 'backup'
# 备份文件存放路径
DISABLED_DATABASES = {'information_schema', 'mysql', 'performance_schema', 'sys'}
#
除不需要备份操作的数据库名称集合
def mkdir_if_not_exists(path):
#判断给定目录是否存在,不存在则创建它
if not os.path.exists(path):
os.mkdir(path)
def create_mysql_conn(db='mysql'):
#创建并返回一个 mysql 数据库连接
conn
=
pymysql.connect(host=MYSQL_HOST,
port=MYSQL_PORT,
user=MYSQL_USERNAME, password=MYSQL_PASSWORD, db='mysql')
return conn
def read_all_databases():
#从数据库中读取全部数据库名称
logging.info('读取全部数据库名称...')
conn = create_mysql_conn()
cursor = conn.cursor()
cursor.execute('show databases')
# 查询服务器上有哪些数据库
res = cursor.fetchall()
databases = {item[0] for item in res}
databases = list(databases - DISABLED_DATABASES)
# 排除不备份的数据库
cursor.close()
conn.close()
logging.info('读取完毕,数据库列表如下:{}'.format(databases))
return databases
def backup_database(database):
#备份指定数据库的数据和表结构
logging.info('开始备份数据库 {}...'.format(database))
command = 'mysqldump -h192.168.9.167 -uroot -p123456 --add-drop-database --databases
{database} > {backup_path}/{database}.sql'.format(
database=database,
backup_path=BACKUP_PATH)
exit_code = subprocess.call(command, shell=True)
if exit_code != 0:
# 判断命令是否正常执行,异常则直接抛出
raise Exception('在备份数据库的过程中出错,请检查!')
logging.info('数据库 {} 备份完毕!'.format(database))
def backup():
#读取全部数据库名称,并对这些数据库的数据和结构进行备份
mkdir_if_not_exists(BACKUP_PATH)
# 检查备份路径是否存在,不存在则进行创建
databases = read_all_databases()
# 读取全部待备份数据库名称
for database in databases:
# 逐个对数据库进行备份
backup_database(database)
if __name__ == '__main__':
backup()
7.4.3 执行 Python 脚本并查看备份后的 sql 文件
编写完成后执行脚本完成备份,执行命令及结果如下:
[root@localhost ~]# python3 mysql_backup.py
2020-07-10 09:52:46,425 - mysql_backup.py[line:55] - INFO: 读取全部数据库名称...
2020-07-10 09:52:46,429 - mysql_backup.py[line:66] - INFO: 读取完毕,数据库列表如下:['test']
2020-07-10 09:52:46,430 - mysql_backup.py[line:77] - INFO: 开始备份数据库 test...
mysqldump: [Warning] Using a password on the command line interface can be insecure.
2020-07-10 09:52:46,765 - mysql_backup.py[line:86] - INFO: 数据库 test 备份完毕!
[root@localhost ~]# ls backup
test.sql
注意:warning 警告的意思是在命令行界面上使用密码可能不安全。所以在实际生产环
境中可以利用常量来代替明文输入密码的这一步,或者在配置文件中填写用户名密码等方式
保障安全。
7.4.4 编写 Python 脚本文件 mysql_restore.py
备份脚本已经编写执行完成,此时还需再编写一个还原数据库使用的脚本
mysql_restore.py,用于还原恢复 mysql 数据库。代码如下:
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 = '127.0.0.1'
# 数据库主机地址
MYSQL_PORT = 3306
# 数据库端口
BACKUP_PATH = 'backup'
# 备份文件存放路径
logging.info('开始获取需要恢复的数据库文件...')
files = list(os.listdir(BACKUP_PATH))
logging.info('文件列表:{}'.format(files))
for file in files:
# 开始逐个恢复数据库
logging.info('开始恢复数据库 {}...'.format(file.split('.')[0]))
command
=
'mysql
-h{host}
-f
-u{user}
-p{password}
-P{port}
<
{path}/{file}'.format(host=MYSQL_HOST,user=MYSQL_USERNAME,password=MYSQL_PA
SSWORD,port=MYSQL_PORT, file=file,path=BACKUP_PATH)
subprocess.call(command, shell=True)
logging.info('完毕!')
7.4.5 执行还原数据库的 Python 脚本
编写完成后执行脚本完成数据库恢复,执行命令及结果如下:[root@localhost ~]# python3 mysql_restore.py
2020-07-10 10:20:42,963 - mysql_restore.py[line:11] - INFO: 开始获取需要恢复的数据库文件...
2020-07-10 10:20:42,964 - mysql_restore.py[line:13] - INFO: 文件列表:['test.sql']
2020-07-10 10:20:42,964 - mysql_restore.py[line:15] - INFO: 开始恢复数据库 test...
mysql: [Warning] Using a password on the command line interface can be insecure.
2020-07-10 10:20:43,181 - mysql_restore.py[line:18] - INFO: 完毕!
此时应注意,备份和恢复的数据库服务器可以不是同一台服务器,所以此脚本也可用于
数据库迁移的场景。当目标数据库中已经有同名的数据库了,会先删除同名数据库,再重新
创建并恢复数据。所以在实际生产环境中,请确认此还原逻辑是否符合需求。对于执行数据
库还原脚本时一定要谨慎操作。

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

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

相关文章

新书出版,大陆首本NestJS图书《NestJS全栈开发解析:快速上手与实践》

新书全栈实战项目&#xff1a;数字门店管理平台开源啦&#x1f389;&#x1f389;&#x1f389; GitHub地址&#xff08;持续更新NestJS企业级实践&#xff09;&#xff1a;欢迎star⭐️⭐️⭐️ 前端ReactTypeScriptVite 后端NestMySQLRedisDocker 前言 对&#xff0c;你没看…

esp32s3分区表配置及读写

一、分区表介绍 每片 ESP32-S3 的 flash 可以包含多个应用程序&#xff0c;以及多种不同类型的数据&#xff08;例如校准数据、文件系统数据、参数存储数据等&#xff09;。因此&#xff0c;在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。 分区表中的每个条目都包括以下…

Lnux驱动开发学习 -- imx6ull LCD驱动学习

文章目录 环境LCD设备树信息imx6ull的LCD驱动 环境 正点提供的 linux 4.15 LCD设备树信息 看下imx6ull提供的设备树信息&#xff1a; arch/arm/boot/dts/imx6ull.dtsi&#xff1a;lcdif: lcdif021c8000 {compatible "fsl,imx6ul-lcdif", "fsl,imx28-lcdif&…

JDBC编程详细总结

一、JDBC编程 JDBC编程有标准步骤(八股文) 注册驱动 将sql语句的运行环境加载到JVM 连接数据库 获得执行SQL的对象 执行SQL语句,获得结果 关流 1、 注册驱动 Class.forName("com.mysql.jdbc.Driver");//5.7版本 加载驱动 Class.forName("com.mysql.cj.jdb…

Android TV RecyclerView列表获得焦点左右换行

在TV上&#xff0c;用RecyclerView显示一个列表&#xff0c;飞鼠遥控左右遥控获得Item焦点&#xff0c;到最后一个进行右键换行&#xff0c;是不能做到的&#xff0c;因此需要监听key事件处理换行。 效果图如下 代码实现 Item.xml布局 <?xml version"1.0" enc…

红帽 Quay- 配置镜像代理缓存

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 Quay 3.12 环境中验证 说明&#xff1a;可先根据《红帽 Quay - 安装篇》完成 Quay 安装。 镜像代理缓存功能 Quay 的镜像代理缓存功能可以将用户拉取的远程镜像保存到本地 Quay 的 proxy cache 中&am…

C++速通LeetCode中等第2题-最长连续序列

方法一&#xff0c;排序后遍历&#xff0c;后减前1&#xff0c;计数&#xff0c; 相等跳过&#xff0c;后减前&#xff01;1就保存。 class Solution { public:int longestConsecutive(vector<int>& nums) {vector<int> ans;int count 1;sort(nums.begin(),n…

Facebook的用户隐私保护:从争议到革新

Facebook早期的数据收集方式引发了隐私担忧。平台的快速增长和用户数据的大规模收集使得隐私问题逐渐显现。尤其是在2018年&#xff0c;剑桥分析事件暴露了数千万用户数据被不当使用的问题。这一事件揭示了Facebook在数据保护方面的严重漏洞&#xff0c;引发了公众对隐私保护的…

C++中的const \static \this

目录 前言 一、const关键字 1、const修饰类的成员变量 2、const修饰类的成员函数 3、const修饰类的对象 二、static关键字 1、static修饰类中的成员变量 1. 共享性 2. 初始化 3. 访问权限 4. 内存分配 5. 不依赖于对象 2、static修饰类中的成员函数 三、this关键字…

「C++系列」异常处理

【人工智能教程】&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站&#xff1a;【人工智能教程】 文章目录 一、异常处理1. 基本概念2. 示例代码3. 注意事项 二、常见的异常类…

三维天地创新方案助力实验室信息自动化技术深入发展

实验室环境条件控制非常重要,它直接影响着最终的实验或检测结果。例如不同的实验室对于温湿度有不同的要求,这就给实验室温湿度监测与采集带来了一定的困难。 三维天地自主研发的实验室信息管理系统(SW-LIMS)提出了一种检化验记录温湿度自动采集的创新方案,这一方案致力于实现…

一键文本提示实现图像对象高质量剪切与透明背景生成

按照提示词裁剪 按照边框裁剪 要实现您描述的功能,即通过一个文本提示就能自动从图片中切割出指定的对象并生成一个带有透明背景的新图像,这需要一个结合了先进的计算机视觉技术和自然语言处理能力的系统。这样的系统可以理解输入的文本指令,并将其转化为对图像内容的精确分…

解决nginx代理SSE接口的响应没有流式返回

目录 现象原来的nginx配置解决 现象 前后端分离的项目&#xff0c;前端访问被nginx反向代理的后端SSE接口&#xff0c;预期是流式返回&#xff0c;但经常是很久不响应&#xff0c;一响应全部结果一下子都返回了。查看后端项目的日志&#xff0c;响应其实是流式产生的。推测是n…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Markdown书写技巧深度解析

引言 在数字化时代&#xff0c;文本编辑与格式化的效率与美观性显得尤为重要。Markdown&#xff0c;作为一种轻量级的标记语言&#xff0c;以其简洁的语法和高效的文档转换能力&#xff0c;在多个领域得到广泛应用。本文将全面探讨Markdown的由来、定义、原理、内部流程、应用场…

构建自己的文生图工具:Python + Stable Diffusion + CUDA

构建自己的文生图工具&#xff1a;Python Stable Diffusion CUDA 前言概述环境搭建安装PyTorch安装Stable Diffusion编写Python代码结论结语 前言 在这个数字化和人工智能飞速发展的时代&#xff0c;图像生成技术正逐渐成为现实。想象一下&#xff0c;只需输入几个关键词&…

el-form动态标题和输入值,并且最后一个输入框不校验

需求&#xff1a;给了固定的label&#xff0c;叫xx单位&#xff0c;要输入单位的信息&#xff0c;但是属性名称都一样的&#xff0c;UI画图也是表单的形式&#xff0c;所以改为动态添加的形式&#xff0c;实现方式也很简单&#xff0c;循环就完事了&#xff0c;连着表单校验也动…

探索Facebook的黑暗面:数字化社交的双面剑

Facebook作为全球最大的社交平台&#xff0c;改变了我们的沟通和互动方式。虽然它带来了便利&#xff0c;但也存在不少隐忧。本文将探讨Facebook的负面影响&#xff0c;包括隐私问题、信息操控、心理健康危机及社交表面化等。 一、隐私问题&#xff1a;数据收集的隐忧 Facebo…

2024蓝桥杯省B好题分析

题解来自洛谷&#xff0c;作为学习 目录 宝石组合 数字接龙 爬山 拔河 宝石组合 # [蓝桥杯 2024 省 B] 宝石组合## 题目描述在一个神秘的森林里&#xff0c;住着一个小精灵名叫小蓝。有一天&#xff0c;他偶然发现了一个隐藏在树洞里的宝藏&#xff0c;里面装满了闪烁着美…

乐vs悲观锁,重vs轻量级锁,公vs非公平锁,不vs可重入锁,等等锁策略

这里讲的“乐观锁”“悲观锁”“轻量级锁”等等&#xff0c;都不是一个锁&#xff0c;而是一类锁。 比如&#xff1a;我们班有“带眼镜”的同学&#xff0c;这里“带眼镜”并不是指一个人&#xff0c;而是指一类人。 并且这里的锁&#xff0c;并不局限于Java&#xff0c;而是只…