flask-slqalchemy使用详解

news2024/11/23 11:36:33

目录

1、flask-sqlalchemy

1.1、flask_sqlalchemy 与sqlalchemy 的关系

1.1.1、 基本定义与用途

1.2、flask_sqlalchemy 的使用

1.2.1、安装相关的库

1.2.2、项目准备

1.2.3、创建ORM模型

1.2.3.1、使用db.create_all()创建表的示例

1.2.3.2、创建多表关联ORM模型

1.2.4、直接执行SQl语句

1.2.5、新增数据

1.2.6、修改数据

1.2.6、删除数据

1.2.6、查询数据

注:slqalchemy详细使用说明见文章:Python 之SQLAlchemy使用详细说明-CSDN博客

1、flask-sqlalchemy

1.1、flask_sqlalchemy 与sqlalchemy 的关系

1.1.1、 基本定义与用途

  • sqlalchemy:
    • 是一款Python编程语言下的开源软件,提供了SQL工具包及对象关系映射(ORM)工具。
    • 允许开发人员通过Python类与对象来操作数据库,从而避免了直接编写SQL语句的复杂性。
    • 支持多种数据库系统,如SQLite、MySQL、PostgreSQL等。
  • flask_sqlalchemy:
    • 是sqlalchemy的一个扩展或封装,专门用于Flask web框架。
    • 简化了在Flask应用中与数据库交互的过程,例如配置、初始化、使用ORM等。
    • 使得在Flask中集成数据库变得更为方便和直观。

1.1.2、关系与区别

  • 关系:
    • flask_sqlalchemy基于sqlalchemy进行了扩展和优化,使其更适应于Flask框架的使用场景。
    • 两者都提供了ORM功能,允许通过Python对象来操作数据库。
  • 区别:
    • 用途:sqlalchemy是一个通用的数据库ORM工具,而flask_sqlalchemy则专门为Flask框架设计。
    • 配置:在Flask中使用flask_sqlalchemy时,可以通过Flask的配置文件来配置数据库连接信息,而sqlalchemy则需要单独进行配置。
    • 初始化:flask_sqlalchemy在初始化时会与Flask应用对象关联,而sqlalchemy则直接创建引擎和会话。
    • 简化操作:flask_sqlalchemy在Flask应用中提供了更简洁的数据库操作方式,如定义模型、查询等。

1.1.3、使用建议

  • 如果开发一个基于Flask的web应用,并且需要与数据库进行交互,那么推荐使用flask_sqlalchemy,因为它提供了与Flask框架更好的集成和更简洁的使用方式。
  • 如果需要在一个非Flask项目中使用ORM,或者需要更灵活和定制化的数据库操作,那么可以选择直接使用sqlalchemy。

1.2、flask_sqlalchemy 的使用

sqlalchemy官方文档:Session API — SQLAlchemy 2.0 Documentation

falsk-sqlalchemy官方文档:Flask-SQLAlchemy — Flask-SQLAlchemy Documentation (3.1.x)

说明:因为flask-sqlalchemy是基于sqlalchemy扩展与flask集成,所以flask-sqlalchemy的使用很多都是基于sqlalchemy进行封装的,如果了解sqlalchemy那么使用flask-sqlalchemy就会很简单。

1.2.1、安装相关的库

说明:本文中所有的代码示例,相关软件和库的版本如下:

  • Python:3.9
  • Flask :2.3.3
  • Flask-Migrate :4.0.5
  • Flask-SQLAlchemy :3.1.1

1、安装flask

pip install flask

2、安装数据库迁移工具Flask-Migrate,安装这个库的同时也会安装Flask-SQLAlchemy

pip install Flask-Migrate

1.2.2、项目准备

说明:下面会通过一些示例来说明flask-sqlalchemy的常见使用。首先需要新建三个py文件,文件目录结构如下:

1、app.py

"""
主程序入口
"""
from module import db
from flask_migrate import Migrate
from flask import Flask

import config

app = Flask(__name__)

# 绑定配置文件
app.config.from_object(config)
# 初始化db
db.init_app(app)

# 使用数据库迁移来管理数据库模型的更改
# 在Flask中,数据库迁移是对数据库模式或结构进行更改时,通过执行一系列有序的迁移脚本来保持数据的一致性和完整性
# ORM模型映射成数据库表的三步,需要在控制台执行下面命令:
#     1、flask db init :   初始化ORM模型,只需要执行一次即可(即首次执行)
#     2、flask db migrate: 识别ORM模型的改变,生成迁移脚本
#     3、flask db upgrade: 运行迁移脚本,同步到数据库中
migrate = Migrate(app, db)


if __name__ == '__main__':
    app.run(debug=True)

2、config.py文件

  • 注意:数据库的主机地址,用户密码需要换成自己的
"""
    配置文件
"""
# 设置秘钥用于session加密,秘钥越长安全性越高
# 在Flask应用中配置一个密钥,用于对会话数据进行加密和签名。密钥的选择很重要,应该是足够随机和安全的。
SECRET_KEY = "asfjlahfdasnflbbFA"

# 数据库配置信息
# MySQL所在的主机名
HOSTNAME = "172.22.70.174"
# MySQL监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名
USERNAME = "root"
# 连接MySQL的密码
PASSWORD = ""
# MySQL上创建的数据库名称
DATABASE = "test1"
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
# 数据库连接池的大小,默认为5
SQLALCHEMY_POOL_SIZE = 10
# 等待数据库连接的超时时间(秒),默认为10
SQLALCHEMY_POOL_TIMEOUT = 30
# 用于配置 SQLAlchemy 引擎选项的 Flask 配置参数
# SQLAlchemy 引擎选项允许你控制数据库连接的各种行为,例如连接池的大小、超时设置、SSL 配置等
SQLALCHEMY_ENGINE_OPTIONS = {
                            'pool_size': 10,  # 连接池大小
                            'max_overflow': 5,  # 当连接池中的连接都被使用时,额外创建的连接数
                            'pool_recycle': 3600,  # 多久之后自动回收连接(秒)
                            # 你还可以添加其他 SQLAlchemy 引擎选项,例如 SSL 配置等
                            # 'connect_args': {'sslmode': 'require', ...}
                        }

3、module.py


"""
ORM数据模型
"""
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

1.2.3、创建ORM模型

db.create_all()创建表和使用Migrate管理迁移数据库的区别:

  • db.create_all()
    • 通常用于创建新表(如果表存在不会做任何事情,只是创建对应的ORM映射关系,注意:这不会更改已经存在的表结构 )
  • Migrate
    • 能够跟踪数据库模式的变化,并能够轻松地升级、降级或回滚这些变化。

使用 Flask-Migrate 的命令来创建和管理迁移。这通常涉及以下步骤:

1.初始化迁移仓库:

  • 在项目的根目录下运行 flask db init 命令来创建一个迁移仓库。注意:这个只需要运行一次,也就是首次运行的时候。

2.生成迁移脚本

  • 当你修改了 Flask-SQLAlchemy 模型(例如添加新表、字段或约束)时,你需要生成一个新的迁移脚本。这可以通过运行 flask db migrate 命令来完成。这个命令会检查当前的模型与上一次迁移之后的数据库状态之间的差异,并生成一个 Python 脚本,该脚本描述了如何将这些差异应用到数据库上。

3.应用迁移

  • 一旦你生成了迁移脚本,你就可以通过运行 flask db upgrade 命令来将这些更改应用到数据库上。同样地,你也可以使用 flask db downgrade 命令来撤销最近的迁移。
1.2.3.1、使用db.create_all()创建表的示例
from flask import Flask  
from flask_sqlalchemy import SQLAlchemy  
  
app = Flask(__name__)  
app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_uri'  # 例如:'sqlite:tmp/test.db'  
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  
db = SQLAlchemy(app)  
  
class User(db.Model):  
    id = db.Column(db.Integer, primary_key=True)  
    username = db.Column(db.String(80), nullable=False)  
    email = db.Column(db.String(120), unique=True, nullable=False)  
  
    # 定义其他方法或关系(如果需要)  
  
# 初始化数据库(如果尚未创建)  
# 注意:这不会更改已经存在的表结构  
with app.app_context():  
    db.create_all()  # 这通常用于创建新表,但在这里不会做任何事情(因为表已经存在)  
  
# 接下来,你可以像通常一样使用这个模型来查询数据库  
# 例如:users = User.query.all()
1.2.3.2、创建多表关联ORM模型

说明:先建立t_emp员工表和t_dept部门表两张表,并插入对应数据

1、在module.py文件中新增ORM模型如下:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Departments(db.Model):
    __tablename__ = "t_dept"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), nullable=False, comment="部门名称")
    
class Employes(db.Model):
    __tablename__ = "t_emp"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(50), nullable=False, comment="姓名")
    age = db.Column(db.Integer, comment="年龄")
    job = db.Column(db.String(20), comment="职位")
    salary = db.Column(db.Integer, comment="薪资")
    entrydate = db.Column(db.DateTime, comment="入职时间")
    managerid = db.Column(db.Integer, comment="直属领导ID")
    dept_id = db.Column(db.Integer, db.ForeignKey("t_dept.id"))
    # 与表t_dept建立反向引用,在Departments模型中将会生成一个名为 "employes" 的属性,可以通过该属性获取该部门的员工的信息
    departemnt = db.relationship(Departments, backref="employes")

注意:

  • 如果数据库中没有这两张表,需要先生成迁移脚本,然后执行在数据库中创建表。
  • 如果表中的字段或者约束等发生了变化,也是执行下面的第二、三命令(此时命令:flask db init 不需要再执行 )

flask db init 
flask db migrate
flask db upgrade

执行演示如下:

注意:如果创建的表的编码不是utf8mb4,需要修改为utf8mb4,不然插入中文的数据会出现编码错误,执行以下SQL语句:

ALTER TABLE t_dept CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE t_emp CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2、插入测试数据

INSERT INTO t_dept (name) VALUES ('研发部'), ('市场部'),('财务部'), ('销售部'), ('总经办'), ('人事部');

INSERT INTO t_emp (id, name, age, job,salary, entrydate, managerid, dept_id) VALUES
(1, '大刘', 28, '总裁',40000, '2000-01-01', null,5),
(2, '夏析', 20, '项目经理',20000, '2005-12-05', 1,1),
(3, '李兴', 33, '开发', 8000,'2000-11-03', 2,1),
(4, '张敏', 30, '开发',11000, '2002-02-05', 2,1),
(5, '林夕', 43, '开发',10500, '2004-09-07', 3,1),
(6, '小美', 19, '程序员鼓励师',6600, '2004-10-12', 2,1),
(7, '林逸', 60, '财务总监',8500, '2002-09-12', 1,3),
(8, '李媛', 19, '会计',48000, '2006-06-02', 7,3),
(9, '林妙妙', 23, '出纳',5250, '2009-05-13', 7,3),
(10, '赵芳', 20, '市场部总监',12500, '2004-10-12', 1,2),
(11, '张三', 56, '职员',3750, '2006-10-03', 10,2),
(12, '李四', 19, '职员',3750, '2007-05-09', 10,2),
(13, '王二', 19, '职员',5500, '2009-02-12', 10,2),
(14, '周鑫', 88, '销售总监',14000, '2004-10-12', 1,4),
(15, '刘达', 38, '销售',4600, '2004-10-12', 14,4),
(16, '老钱', 40, '销售',4600, '2004-10-12', 14,4),
(17, '小六', 42, null,2000, '2011-10-12', 1,null);

1.2.4、直接执行SQl语句

说明:在 Flask-SQLAlchemy 中,虽然推荐使用 ORM(对象关系映射)来进行数据库操作,但有时候你可能需要直接执行 SQL 语句。Flask-SQLAlchemy 提供了 db.session.execute() 方法来执行原生的 SQL 语句。

注意:使用 db.session.execute() 方法执行 SQL 语句时,请确保你的 SQL 语句是安全的,特别是当 SQL 语句中包含用户输入时。防止 SQL 注入的最佳做法是使用参数化查询或 ORM 提供的方法。

示例:

# 直接执行 SQL 语句来更新数据  
# 注意:使用 execute 方法时,你需要自己确保 SQL 语句的安全性  
update_sql = "UPDATE employees SET name='John Doe Jr.' WHERE id=1"  
db.session.execute(update_sql)  
db.session.commit()  
  
# 直接执行 SQL 语句来查询数据  
select_sql = "SELECT * FROM employees WHERE department_id=1"  
results = db.session.execute(select_sql).fetchall()  
for row in results:  
    print(row)  # 输出查询结果  
  
# 如果你想将查询结果映射到模型类,可以使用 Model.query.from_statement()  
# 但这通常不如直接使用 ORM 方法来得直观和简单  
# # 注意:在使用 text() 函数时,你需要从 sqlalchemy.sql 导入 text 
from sqlalchemy.orm import aliased  
EmployesAlias = aliased(Employes)  
results = Employes.query.from_statement(text(select_sql)).all()  
for employee in results:  
    print(employee.name)  # 假设查询结果包含了员工的名字  

1.2.5、新增数据

需求:演示在t_emp表中插入单条数据和插入多条数据

说明:在app.py文件中进行演示,可以使用函数直接执行的方式,也可以使用请求路由的方式,因为实际使用中都是请求路由,所以这里使用请求路由的方式演示数据的增删改查。

注意:只要涉及到表的数据变化的都需要提交会话

@app.route("/add")
def add():
    emp1 = Employes(name="小胖虎", age=22, job="产品", salary=12000, entrydate="2008-05-09", managerid=1, dept_id=1)
    emp2 = Employes(name="虎妞", age=24, job="产品", salary=20000, entrydate="2009-05-09", managerid=1, dept_id=1)
    emp3 = Employes(name="大胖", age=23, job="职员", salary=8000, entrydate="2008-06-09", managerid=10, dept_id=2)
    try:
        # 插入一条数据到数据库中
        db.session.add(emp1)

        # 插入多条数据到数据库中
        db.session.add_all([emp2, emp3])

        # 提交事务已保存更改到数据库
        db.session.commit()
        # 如果在添加过程中发生错误,可以执行回归事务
        # db.session.rollback()
        return "数据添加成功"
    except Exception as e:
        db.session.rollback()
        return f"数据添加失败,失败原因:{e}"
  • 浏览器访问或者使用工具访问接口(如:curl,postman等)

  • 数据库查看添加数据是否成功

1.2.6、修改数据

修改数据流程:先查询出数据, 然后修改(想要这些更改被 session 跟踪以便后续可以回滚或提交时使用)。

  • 缺点
    • 查询和更新分两条语句, 效率低
    • 如果并发更新, 可能出现更新丢失问题

所以推荐基于过滤条件的更新,也就是使用 update() 方法,这个方法直接对数据库执行操作,不会触发模型的 events 或 session 的变化;具有如下优势:

  • 一条语句, 被网络IO影响程度低, 执行效率更高
  • 查询和更新在一条语句中完成, 单条SQL具有原子性, 不会出现更新丢失问题
  • 会对满足过滤条件的所有记录进行更新, 可以实现批量更新处理
@app.route("/update")
def update():
    try:
        # 1、使用先查询后更新的方式
        # 更新t_emp表中id=11的员工姓名为:弓长张
        emp = Employes.query.filter_by(id=11).first()
        emp.name = "弓长张"
        # 提交会话
        db.session.commit()

        # 2、使用update的方式
        # 更新t_emp表中name=小六的员工姓名为:老六
        Employes.query.filter(Employes.name == "小六").update({"name": "老六"})
        # 提交会话
        db.session.commit()
        return "数据更新成功"
    except Exception as e:
        db.session.rollback()
        return f"数据更新失败,失败原因:{e}"

1.2.6、删除数据

删除数据流程:先查询数据, 再删除

推荐基于过滤条件的删除,也就是使用delete()方法

@app.route("/delete")
def delete():
    try:
        # 1、使用先查询后删除的方式
        # 删除t_emp表中员工姓名为:弓长张 的员工
        emp = Employes.query.filter_by(name="弓长张").first()
        # 删除数据
        db.session.delete(emp)
        # 提交会话
        db.session.commit()

        # 2、使用delete的方式
        # 删除t_emp表中员工姓名为:老钱 的员工
        Employes.query.filter(Employes.name == "老钱").delete()
        db.session.commit()
        return "数据删除成功"
    except Exception as e:
        db.session.rollback()
        return f"数据删除失败,失败原因:{e}"

1.2.6、查询数据

说明:因为flask-sqlalchemy是基于sqlalchemy扩展的,所以flask-sqlalchemy的使用仅仅是在sqlalchemy之前进行封装了一下,本质还是基于sqlalchemy的,这里的查询可以使用flask-sqlalchemy封装的语法,也可以只有sqlalchemy的语法查询。

这里仅仅展示flsk-sqlalchemy的一些基本查询,具体更加全面的可以参考另一篇关于sqlalchemy使用的文章:Python 之SQLAlchemy使用详细说明-CSDN博客

@app.route("/query")
def query():
    try:
        # 全表查询t_emp flask-sqlalchemy语法
        emps = Employes.query.all()
        # sqlalchemy语法
        emps_sqlalchemy = db.session.query(Employes).all()

        # 模糊查询匹配
        # 查询姓刘的员工
        res = Employes.query.filter(Employes.name.like("刘%")).all()

        # 条件查询
        # 查询李四和王二的工资信息
        res2 = Employes.query.options(load_only(Employes.name, Employes.salary)).filter(Employes.name == "李四", Employes.name == "王二").all()
        # 查询年龄等于20或30的员工信息
        res2_1 = Employes.query.filter(or_(Employes.age == 20, Employes.age == 30)).all()
        # 或者使用in_()
        res2_2 = Employes.query.filter(Employes.age.in_([20, 30]))

        # 聚合函数
        # 查询每个年龄对应的人数
        # 对应的SQL:select age, count(id) as "人数" from t_emp group by age
        res3 = db.session.query(Employes.age, func.count(Employes.id).label("nums")).group_by(Employes.age).all()

        # 分组查询
        # 根据职位分组 , 统计每个职位平均工资
        # select job, avg(salary) as "平均工资" from t_emp group by job
        res4 = db.session.query(Employes.job, func.avg(Employes.salary).label("avg_salary")).group_by(Employes.job).all()

        # 排序查询
        # 根据员工年龄从小到大排序,年龄相同的根据工资从高到低排序
        # select * from t_emp order by age asc, salary decs
        res5 = Employes.query.order_by(Employes.age, Employes.salary.desc()).all()

        # 分页查询
        # 查询员工信息,每页5条数据,查询第2页的数据
        # res6.pages 总页数  res6.page 当前页码 res6.items 当前页的数据  res6.total 总条数
        res6 = Employes.query.paginate(page=2, per_page=5)
        # 或者使用offset和limit实现
        res6_1 = Employes.query.order_by(Employes.age).offset(5).limit(5).all()

        return "查询数据成功"
    except Exception as e:
        return f"查询数据失败,失败的原因:{e}"

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

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

相关文章

一维时间序列信号的改进小波降噪方法(MATLAB R2021B)

目前国内外对于小波分析在降噪方面的方法研究中,主要有小波分解与重构法降噪、小波阈值降噪、小波变换模极大值法降噪等三类方法。 (1)小波分解与重构法降噪 早在1988 年,Mallat提出了多分辨率分析的概念,利用小波分析的多分辨率特性进行分…

【Unity】使用Jenkins实现远程Unity打包

前言 很多时候,我们需要自动打包,比如下班了,我要出一个包明天早上用。比如每天夜里12点,我需要定时出一个稳定包。 这个时候就需要Jenkins了。 1.安装环境 安装 jenkins 之前,需要安装Java 。Java下载网站 ①下载…

Unity 实现让物体渲染在最前面

演示 实现方案 1.创建一个shader脚本 2.删掉原来的内容:我们自己写 附上完整的shader代码: Shader "Custom/ZTestAlways" {Properties {_Color ("Color Tint",Color) (1,1,1,1)_MainTex("Main Tex",2D) "white&q…

【EI会议|检索稳定】2024年通讯工程与云计算国际会议(CECC 2024)

2024年通讯工程与云计算国际会议(CECC 2024) 2024 International Conference on Communication Engineering and Cloud Computing 【重要信息】 大会地点:武汉 大会官网:http://www.iaccecc.com 投稿邮箱:iacceccsub-…

突破 LST/LRT 赛道中心化困境,Puffer Finance 何以重塑以太坊再质押未来

纵观过去的 2023 年,LST 赛道竞争进入“白热化”状态。去中心化、DeFi 增强、全链化成为市场争夺关键词,诸多 LST 赛道老牌项目纷纷陷入“中心化矛盾”,指责对方在以太坊去中心化进程中的不利作为。 在这样的竞争情形下,以太坊联…

skywalking介绍及搭建

链路追踪框架比对: skywalking安装部署: 下载地址:Downloads | Apache SkyWalking 配置微服务与skywalking整合: copy agent/optional-plugins/apm-spring-cloud-getway-xx.jar到plugins,然后重启skywalking 监控界面…

MOE模型入门

一、目录 定义:MOE架构代表类型如何解决expert 平衡的?而不是集中到某一专家。如何训练、微调MOE模型?基础架构优缺点不同MOE 模型实现方式、训练方法 二、实现 定义:MOE架构 MOE:混合专家模型,多个专家共同决策的模…

2024年Kubernetes管理的发展趋势及预测

Kubernetes管理的概念 Kubernetes管理是指用于监督使用Kubernetes的跨机器集群的容器化应用程序的部署、扩展和操作的过程和工具。这个编排平台自动化了部署、管理和扩展容器化应用程序的许多方面,但它也引入了配置、网络、安全性和资源管理方面的复杂性。 有效的K…

Linux - 文件管理高级1

0.管道 | 将前面命令的标准输出传递给管道作为后面的标准输入 1.文件查找 find find 进行文件查找时,默认进行递归查找,会查找隐藏目录下的文件 1.1 用法 # find 查找路径 查找条件... -type // 文件类型 f 普通文件 b 设备 d …

使用LLaMA-Factory微调大模型

使用LLaMA-Factory微调大模型 github 地址 https://github.com/hiyouga/LLaMA-Factory 搭建环境 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory在 LLaMA-Factory 路径下 创建虚拟环境 conda create -p ./venv python3.10激活环境 c…

迅狐跨境电商系统源码:技术栈与多端集成

随着全球化贸易的不断深入,跨境电商系统源码成为了连接不同国家和地区消费者与商家的重要桥梁。本文将探讨跨境电商系统源码的技术栈以及如何通过多端集成来提升用户体验。 技术栈概览 跨境电商系统源码的技术栈是构建高效、稳定平台的基础。以下是构建跨境电商系…

Dynamics 365:安全的客户参与应用程序

客户参与应用程序使用Microsoft Dataverse提供了一个丰富的安全模型,可以适应许多业务场景。本节为您提供了应考虑的安全措施的特定于产品的指导。 Dataverse安全模型有以下目标: 只允许用户访问他们工作所需的信息。按角色对用户进行分组,并…

Leetcode刷题笔记6

34. 在排序数组中查找元素的第一个和最后一个位置 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 解法一:暴力查找 [1, 2, 3, 3, 3, 4, 5] t 3 从前往后扫描暴力查找,最坏情况下O(N) 优化 利用数组有序的…

安泰电压放大器的设计要求有哪些内容

电压放大器是电子电路中常见的一种放大器类型,用于将输入电压信号放大到更高的幅度。设计一个高性能的电压放大器需要考虑多个方面的要求和指标。以下是设计电压放大器时需要考虑的几个重要内容: 1.放大增益 放大增益是电压放大器的核心指标,…

再度“痛失”TOP5的小米手机,能否接好这碗AI“大活水”?

国产手机终端需求持续修复,国产品牌商是最大受益者。 近日,中国信通院发布2024年4月国内手机市场运行分析报告。报告显示,今年4月,国内市场手机出货量同比增长了28.8%。按品牌来看,国产品牌手机4月出货量占同期手机出…

ubuntu 18.04 ros1学习

总结了一下,学习内容主要有: 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…

HTTP/超文本传输协议(Hypertext Transfer Protocol)及HTTP协议通信步骤介绍和请求、响应阶段详解;

目录 一、HTTP/超文本传输协议 特点和功能 请求-响应模型 版本和扩展 安全性和加密 二、HTTP协议通信步骤介绍 三、请求、响应阶段详解 HTTP请求 HTTP响应 示例 一、HTTP/超文本传输协议 HTTP/超文本传输协议(Hypertext Transfer Protocol)是…

推荐几款优秀的文档加密软件 | 企业文件加密解决方案

在数字化时代,信息安全问题日益突出,文档加密软件成为了保护数据安全的重要手段。但是,市面上的文档加密软件种类繁多,功能各异,如何选择一款好用的文档加密软件成为了许多用户关注的焦点。本文将为大家提供一份实用的…

北斗,推动公共安全行业应用的新时代

近年来,随着科技的迅猛发展,卫星导航系统在各个领域获得了广泛的应用。特别是在公共安全领域,北斗卫星系统的应用正在迅速扩展,成为保障社会安定的重要组成部分。本文将详细探讨北斗卫星在公共安全领域的多种应用,以及…

Facebook会话过期是什么情况?如何解决?

如果你点开这篇文章,可能你曾经遇到过Facebook会话过期的错误。无论你是在抓取Facebook数据还是只是浏览动态,看到这个错误消息都会让人很不爽。但别担心,我们将会分享解决Facebook会话过期错误的最佳方法,这样你就可以迅速修复问…