SQLAlchemy: Python中的强大数据库工具
SQLAlchemy: Python中的强大数据库工具
SQLAlchemy是一个功能强大的Python库,广泛应用于数据库操作。它提供了一个灵活的数据库抽象层,可以帮助开发者轻松与关系型数据库进行交互。本文将介绍SQLAlchemy的核心组件、常用功能以及它的优势。
1. SQLAlchemy简介
SQLAlchemy由两个主要组件组成:
- SQLAlchemy Core:提供了一组低级的数据库操作工具,允许开发者使用SQL表达式和数据库事务。
- SQLAlchemy ORM:提供了一个对象关系映射(Object-Relational Mapping,ORM)层,它将数据库表映射为Python类,从而实现更高层次的数据库操作。
SQLAlchemy的设计使其非常灵活,支持多种数据库(如MySQL、PostgreSQL、SQLite等),并且具有高度可扩展性。
2. 安装SQLAlchemy
SQLAlchemy可以通过pip轻松安装:
pip install sqlalchemy
如果需要使用SQLite数据库(SQLAlchemy默认支持SQLite),不需要额外安装数据库驱动程序;但如果使用其他数据库(如MySQL或PostgreSQL),需要安装对应的数据库驱动。
3. SQLAlchemy核心概念
3.1. 引擎(Engine)
引擎是SQLAlchemy与数据库进行交互的核心组件。它负责管理数据库连接、执行SQL语句,并返回结果。创建引擎的基本代码如下:
from sqlalchemy import create_engine# 创建引擎
engine = create_engine('sqlite:///example.db')
3.2. 会话(Session)
会话是SQLAlchemy ORM的核心,它负责数据库操作的生命周期管理。通过会话,开发者可以将对象保存到数据库中,或者从数据库中加载对象。
from sqlalchemy.orm import sessionmaker# 创建Session类
Session = sessionmaker(bind=engine)# 创建会话
session = Session()
3.3. 数据模型(Model)
数据模型是通过ORM映射数据库表与Python类的关系。在SQLAlchemy中,定义数据模型时,通常会继承Base
类,并使用类变量来定义表的列。
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_baseBase = declarative_base()# 定义数据模型
class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)age = Column(Integer)# 创建所有表
Base.metadata.create_all(engine)
4. 常见操作示例
4.1. 插入数据
通过Session将数据插入数据库:
# 创建新用户
new_user = User(name='Alice', age=30)# 将用户添加到会话
session.add(new_user)# 提交事务
session.commit()
4.2. 查询数据
SQLAlchemy提供了非常灵活的查询方式。以下是如何查询数据库中的所有用户:
# 查询所有用户
users = session.query(User).all()for user in users:print(user.name, user.age)
4.3. 更新数据
要更新数据,只需查询到要更新的对象,并修改它的属性,然后提交会话:
# 查询特定用户并更新
user = session.query(User).filter_by(name='Alice').first()
user.age = 31# 提交更改
session.commit()
4.4. 删除数据
删除操作也通过查询对象并删除来完成:
# 查询并删除用户
user = session.query(User).filter_by(name='Alice').first()
session.delete(user)# 提交删除
session.commit()
5. SQLAlchemy的优势
- 灵活性:SQLAlchemy不仅支持ORM,还支持底层的SQL表达式语言,使开发者可以根据需要选择使用高层次或低层次的操作。
- 跨平台支持:SQLAlchemy支持多种数据库引擎,包括MySQL、PostgreSQL、SQLite、Oracle等。
- 简洁的查询:SQLAlchemy的ORM使得数据库操作更加简洁,开发者只需要关注Python对象的操作,而不必手动编写SQL语句。
- 事务管理:SQLAlchemy内置的事务管理机制可以帮助开发者确保数据的完整性和一致性。
- 高效的查询优化:SQLAlchemy支持惰性加载和预加载等优化机制,帮助提高查询效率。
6. 基础总结
SQLAlchemy是一个非常强大且灵活的Python数据库库,适用于各种规模的项目。它不仅支持传统的SQL查询,还提供了易于使用的ORM功能,能够提高开发效率并减少手动编写SQL的工作量。无论是新手还是经验丰富的开发者,都可以轻松掌握并应用SQLAlchemy。
如果你正在开发一个Python项目,并且需要与数据库进行交互,SQLAlchemy无疑是一个值得尝试的工具。
7. 高级功能
SQLAlchemy不仅提供基础的CRUD操作,还具有许多高级功能,能够处理复杂的数据库交互和优化。下面介绍一些常见的高级功能。
7.1. 关系(Relationships)
SQLAlchemy的ORM提供了对表之间关系的支持,主要有三种关系类型:
- 一对多(One-to-Many)
- 多对一(Many-to-One)
- 多对多(Many-to-Many)
通过relationship()
函数,可以定义类之间的关系。例如,假设有两个模型,User
和Post
,其中一个用户可以拥有多个帖子(一对多关系):
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationshipclass Post(Base):__tablename__ = 'posts'id = Column(Integer, primary_key=True)title = Column(String)body = Column(String)user_id = Column(Integer, ForeignKey('users.id'))# 定义一对多关系user = relationship('User', back_populates='posts')class User(Base):__tablename__ = 'users'id = Column(Integer, primary_key=True)name = Column(String)# 定义一对多关系的反向关系posts = relationship('Post', back_populates='user')# 创建所有表
Base.metadata.create_all(engine)
7.2. 聚合函数与分组
SQLAlchemy的查询接口支持SQL聚合函数(如count()
、sum()
、avg()
等),并且可以方便地对查询结果进行分组。例如,获取每个用户发布的帖子数量:
from sqlalchemy import func# 查询每个用户的帖子数量
result = session.query(User.name, func.count(Post.id)).join(Post).group_by(User.id).all()for user, count in result:print(f"User {user} has {count} posts")
7.3. 事务与上下文管理
SQLAlchemy支持通过session
对象进行事务管理。在执行多个操作时,事务可以确保操作要么全部成功,要么全部回滚。
from sqlalchemy.exc import IntegrityError# 使用上下文管理器来管理事务
try:with session.begin():# 添加多个记录user1 = User(name='Bob', age=25)user2 = User(name='Charlie', age=28)session.add(user1)session.add(user2)# 触发错误时回滚session.commit()
except IntegrityError:session.rollback()print("An error occurred, transaction has been rolled back.")
7.4. 复杂查询与子查询
SQLAlchemy允许进行复杂的查询操作,支持多种SQL功能,如子查询、连接、联接等。
# 使用子查询
subquery = session.query(Post.user_id, func.count(Post.id).label('post_count')).group_by(Post.user_id).subquery()
result = session.query(User.name, subquery.c.post_count).join(subquery, User.id == subquery.c.user_id).all()for name, post_count in result:print(f"User {name} has {post_count} posts")
7.5. 数据迁移(Alembic)
SQLAlchemy本身并不直接提供数据库迁移功能,但是它与Alembic集成非常紧密。Alembic是一个数据库迁移工具,可以自动生成数据库迁移脚本,使得数据库结构能够随项目的发展而更新。
安装Alembic:
pip install alembic
然后,通过命令行工具来初始化Alembic:
alembic init alembic
Alembic提供了一些命令来生成和应用迁移脚本,例如:
alembic revision --autogenerate -m "Initial migration"
alembic upgrade head
8. SQLAlchemy与其他库的集成
SQLAlchemy不仅可以独立使用,还能与其他Python库很好地集成。以下是几个常见的集成示例:
8.1. Flask-SQLAlchemy
Flask是一个轻量级的Python web框架,SQLAlchemy可以与Flask结合使用,Flask-SQLAlchemy提供了一个便捷的接口来配置和操作数据库。
安装:
pip install flask-sqlalchemy
在Flask应用中使用SQLAlchemy:
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)class User(db.Model):id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(50))@app.route('/')
def index():users = User.query.all()return ', '.join([user.name for user in users])if __name__ == '__main__':app.run(debug=True)
8.2. SQLAlchemy与Pandas集成
SQLAlchemy还可以与Pandas集成,通过read_sql
和to_sql
方法,允许在Pandas中加载和存储数据,方便进行数据分析。
import pandas as pd# 从数据库加载数据到DataFrame
df = pd.read_sql('SELECT * FROM users', engine)# 将DataFrame数据存储到数据库
df.to_sql('new_users', engine, if_exists='replace')
9. 性能优化
虽然SQLAlchemy功能强大,但在高负载的环境下,性能仍然是一个需要关注的问题。以下是一些常见的优化技巧:
9.1. 延迟加载与预加载
SQLAlchemy支持延迟加载(Lazy Loading)和预加载(Eager Loading)。通过设置lazy
选项,可以控制关联对象的加载策略。通常情况下,lazy='subquery'
或lazy='joined'
能优化查询效率。
# 预加载所有帖子的作者信息
posts = session.query(Post).options(joinedload(Post.user)).all()
9.2. 批量插入
对于大量数据的插入,可以使用session.add_all()
进行批量添加,以提高插入效率。
# 批量添加多个用户
users = [User(name=f'User {i}', age=20+i) for i in range(1000)]
session.add_all(users)
session.commit()
9.3. 使用原生SQL查询
对于性能敏感的操作,SQLAlchemy允许使用原生SQL语句进行查询,避免ORM带来的开销。
# 使用原生SQL查询
result = engine.execute('SELECT * FROM users')
for row in result:print(row)
10. 总结
SQLAlchemy是一个功能全面、灵活且强大的数据库工具,适用于从小型到大型项目的各种需求。它的核心功能包括ORM、数据库引擎、会话管理以及关系模型的定义等,帮助开发者简化数据库交互并提供高效的操作方法。
无论你是构建一个Web应用、数据分析平台,还是需要处理复杂的数据模型和查询,SQLAlchemy都能提供稳定和高效的支持。
相关文章:
SQLAlchemy: Python中的强大数据库工具
SQLAlchemy: Python中的强大数据库工具 SQLAlchemy是一个功能强大的Python库,广泛应用于数据库操作。它提供了一个灵活的数据库抽象层,可以帮助开发者轻松与关系型数据库进行交互。本文将介绍SQLAlchemy的核心组件、常用功能以及它的优势。 1. SQLAlch…...
scala的泛型特质的应用场景
//泛型特质的应用场景 //作比较找出最大值 //定义一个函数,用来求List元素中的最大值参考代码:object Test4 {def getMax[T](list:List[T])(implicit ev:T > Ordered[T]): T {list.reduce((a:T,b:T)> if(a>b) a else b)}def main(args: Array…...
【C++】重载运算与类型转换(七):成员访问运算符
14.7 成员访问运算符 在迭代器类和智能指针类常常用到解引用运算符(*)和箭头运算符(->)。以如下形式向 StrBlobPtr 类添加这两种运算符: class StrBlobPtr {public:std::string& operator*() const{ auto p …...
论文结论:GPTs and Hallucination Why do large language models hallucinate
GPTs and Hallucination 当一个主题有普遍共识,并且有大量语言可用于训练模型时,大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】,或者主题有争议,或是对主题没有明确共识的情况下,就…...
修改通过 Docker 部署的 WordPress 上传文件的大小
要修改通过 Docker 部署的 WordPress 上传文件的大小,你可以按照以下步骤操作: 进入 Docker 容器:首先,你需要进入 WordPress 容器内部。可以使用如下命令: docker exec -it wordpress /bin/bash其中wordpress是你的 W…...
微信小程序:实现节点进度条的效果;正在完成的节点有动态循环效果;横向,纵向排列
参考说明 微信小程序实现流程进度功能 - 知乎 上面的为一个节点进度条的例子,但并不完整,根据上述代码,进行修改完善,实现其效果 横向效果 代码 wxml <view classorder_process><view classprocess_wrap wx:for&quo…...
信而泰网络测试仪校准解决方案
一、影响仪表精度的因素 网络测试仪是用于对数据网络及其相关设备性能参数进行测试的仪表,可以模拟网络终端产生流量,进行网络性能测试,对网络状态进行实时监测,分析和统计。数字计量对于精准数据的网络测试仪来说是一剂强心针&a…...
聊聊在应用层面实现内网穿透功能是否可行
前言 最近接手了供方开发的网关项目,交接文档里面有个内网穿透的功能,一下子就吸引的我的目光。实现这个内网穿透的背景是业务部门有些业务是部署在公网,这些公网的业务想访问内网的业务,但因为公网和内网没打通,导致…...
linux 20.04 安装sougou输入法 重启 可视化界面 无法点击
在Linux 20.04(Ubuntu 20.04)系统中安装搜狗输入法后,如果遇到重启后可视化界面无法点击的问题,这通常是由于搜狗输入法或其依赖的输入法框架(如fcitx)与系统的某些部分不兼容所导致的。以下是一些可能的解…...
springboot整合lua脚本在Redis实现商品库存扣减
1、目的 使用lua脚本,可以保证多条命令的操作原子性;同时可以减少操作IO(比如说判断redis对应数据是否小于0,小于0就重置为100,这个场景一般是取出来再判断,再存放进行,就至少存在2次IO,用lua脚…...
lspci简介
lspci命令用于列出系统中所有pci设备信息,其输出信息包括设备的bdf地址(总线号、设备号和功能号)、设备类型、厂商信息等。 lspci命令的基本用法: lspci:列出所有pci设备的详细信息 参数: -v:显示详细信息,包括驱动程序、总线和端口等信息 -t:以属性结构显…...
Java从入门到工作2 - IDEA
2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…...
Mave下载、安装以及idea(2024)进行配置
目录 Maven简介 Maven下载 配置环境变量 配置本地仓库 在idea环境配置Maven 使用Maven创建工程 创建一个普通的java工程 创建一个Web项目 Maven简介 Maven是一个跨平台的项目管理工具,也是Apache组织中的一个成功的开源项目。它主要服务于基于Java的项目构…...
Spark SQL 执行计划解析源码分析
本文用于记录Spark SQL执行计划解析的源码分析。文中仅对关键要点进行提及,无法面面具到,仅描述大体的框架。 Spark的Client有很多种,spark-sql,pyspark,spark- submit,R等各种提交方式,这里以…...
51c嵌入式~单片机~合集2
我自己的原文哦~ https://blog.51cto.com/whaosoft/12362395 一、不同的电平信号的MCU怎么通信? 下面这个“电平转换”电路,理解后令人心情愉快。电路设计其实也可以很有趣。 先说一说这个电路的用途:当两个MCU在不同的工作电压下工作&a…...
【electron】electron forge + vite + vue + electron-release-server 自动更新客户端
基本信息 electron forge vue页面(中文):https://forge.electron.js.cn/guides/framework-integration/vue-3 electron forge vue页面(英文,中文版下面的tab无法点击):https://www.electronfor…...
FastAPI vs Flask 选择最适合您的 Python Web 框架
文章目录 1. 简介2. 安装和设置3. 路由和视图4. 自动文档生成5. 数据验证和序列化6. 性能和异步支持结论 在 Python Web 开发领域,FastAPI 和 Flask 是两个备受欢迎的选择。它们都提供了强大的工具和功能,但是在某些方面有所不同。本文将比较 FastAPI…...
E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其他进程正占用它?
我们在使用Ubuntu系统时经常性使用sudo apt install命令安装所需要的软件库,偶尔会出现如下问题: E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),是否有其…...
Spring Boot整合 RabbitMQ
文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…...
Spring Boot 进阶指南:深入核心与实战技巧
当你掌握了 Spring Boot 的基础开发流程后,可以进一步学习其高级功能和优化技巧,以便在复杂场景中高效开发和维护应用。本篇博客将带你深入探讨 Spring Boot 的核心机制,覆盖配置管理、高级特性以及性能优化等内容。 1. 深入理解 Spring Boot…...
淘宝详情网页爬虫:技术解析与实战指南
引言 淘宝作为中国最大的电商平台之一,拥有海量的商品数据。对于开发者来说,获取淘宝商品详情接口是一个常见的需求。本文将介绍如何使用Python编写爬虫,获取淘宝商品详情信息,并探讨在实际应用中可能遇到的挑战与解决方案。 环…...
远程桌面防护的几种方式及优缺点分析
远程桌面登录是管理服务器最主要的方式,于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码,悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全,攻击者可以利…...
WordPress后门插件Query Console 未授权RCE漏洞复现(CVE-2024-50498)
0x01 产品描述: WP Query Console是一个为...
机器学习经典算法
机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...
Mac/Windows端长期破解myBase8方法(无需安装火绒)
提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...
数据结构:原地移除所有数值等于 val 的元素,删除排序数组中的重复项,数组形式的整数加法
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> 给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素。 要求时间复杂度为O(N),空间复杂度为O(1)。 int removeElement(int* nums, int numsSize, int val) { int sc…...
python3 re正则入门
Python 中的 re 模块是处理正则表达式的标准库,可以用来匹配字符串模式、提取子字符串、替换文本等。以下是 re 模块的基本用法和常见正则表达式模式入门。 1. 导入模块 在使用正则表达式之前,需要导入 re 模块: import re2. 常用函数 1&a…...
一个用于 SMB/CIFS 网络的 Java 库-JCIFS
1.引言 在网络通信中,服务器消息块(SMB)协议在计算机之间实现文件共享和通信方面发挥着重要作用。对于 Java 开发者来说,由于缺乏对该协议的内置支持,使用 SMB 可能会面临挑战。这时,JCIFS(Jav…...
AI 编程入门:理解核心算法与数据结构基础
在踏上人工智能(AI)编程的奇妙之旅时,掌握核心算法与数据结构基础就像是为自己打造了一把开启知识宝库的万能钥匙。这些基础元素不仅是构建智能系统的基石,更是理解AI如何学习、推理和决策的关键所在。 一、线性回归:从数据中探寻线性关系的基础算法 线性回归是AI编程中…...
js:v-for循环中我希望再次循环七张图片,需要在v-for中嵌套一个v-for还是?
问: div classxxxx v-for(item,index) in data :keyindex div classimgDiv div classimgDivBox /div /div .imgDivBox { .background-img(/assets/images/top_01.png) } 这是现在设置的图片,但是现在我希望遍历一个数组然后遍历top01-top07&…...
【问题记录】07 MAC电脑,使用FileZilla(SFTP)连接堡垒机不成功
项目场景: 使用MAC电脑,以子账号(非root)的形式登录,连接堡垒机CLB(传统型负载均衡),使用FileZilla(SFTP)进行FTP文件传输。 问题描述: MAC电脑…...
Spring Security授权案例集合
目录 授权前置内容权限表的设计建表和相关说明 用户权限配置内部关键类GrantedAuthority和SimpleGrantedAuthority关键类使用示例 资源访问控制方法一、配置类设置访问控制方法二、注解类设置访问控制(优选) 权限不足的处理方法 授权 前置内容 描述&am…...
自动化中关于文本的xpath定位
selenium中://*[text()内容] appium中://*[text热门] 如果是网页端元素,可以打开console,编写 $x("//div[1]") 判断自己写的xpath是否正确; 如果是appium,settings里面PLugins,下载XPathViewXS…...
数据结构 -- #栈和队列的定义和基本实现
文章目录 栈和队列的基本概念栈栈的顺序存储实现栈的链式存储实现(不带头结点) 队列队列的顺序存储实现队列的链式存储实现(带头结点)入队图解出队图解 总结 若没有相关知识基础,可以先看看下面文章哦🤗👇 线性表 栈和队列的基本概念 栈 栈…...
共享GitLab中CICD自动生成的软件包
0 Preface/Foreword 1 分享软件包地址 为了方便给接收对象方便下载固件,在下载固件时候,而无需打开网页,直接输入地址,弹出的对话框是将固件另存为。 或者进入CICD页面,找到job,在Download的标签上单击右键…...
JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测
JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…...
c# 协变与抗变
协变与抗变 1. 背景 一个简单的例子, public class Sharp {}public class Rectange : Sharp {}上面定义了两个简单的类,一个是图形类,一个是矩形类;它们之间有简单的继承关系:矩形是图形的一种。 接下来是常见的一种里氏替换写法: Sharp sharp = new Rectange();“子…...
Android Studio 创建虚拟设备的详细图文操作教程
本篇文章主要讲解 Android Studio 创建模拟器详细图文操作,包含了每一步的详细操作,便于理解和掌握对模拟的创建。 日期:2024年12月9日 作者:任聪聪 运行效果: 说明:创建运行后,点击右侧如下图…...
高级数据结构-树状数组
介绍 树状数组的推导 两个基础操作 模板-acwing795. 前缀和 #include<bits/stdc.h> using namespace std;const int N 1e610; int c[N]; int lowbit(int x){return x & -x; }int query(int x){int ans 0;for(; x; x - lowbit(x)) ans c[x];return ans; }void add…...
Android SDK 平台工具版本说明
Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具,主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的,但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...
【数据结构——内排序】快速排序(头歌实践教学平台习题)【合集】
目录😋 任务描述 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现快速排序算法。 测试说明 平台会对你编写的代码进行测试: 测试输入示例: 10 6 8 7 9 0 1 3 2 4 5 (说明:第一行是元素个数&a…...
Vue项目打包部署到服务器
1. Vue项目打包部署到服务器 1.1. 配置 (1)修改package.json文件同级目录下的vue.config.js文件。 // vue.config.js module.exports {publicPath: ./, }(2)检查router下的index.js文件下配置的mode模式。 检查如果模式改…...
写作词汇积累:差池、一体两面、切实可行极简理解
差池 【差池】可以是名词,是指意外的事或错误。 【差池】也可以是形容词,是指参差不齐、差劲或不行。 1. 由于操作不当,导致这次实验出现了【差池】,我们需要重新分析原因并调整方案。(名词,表示意外的事…...
【ubuntu18.04】ubuntu18.04安装EasyCwmp操作说明
参考链接 Tutorial – EasyCwmphttps://easycwmp.org/tutorial/ EasyCwmp 介绍 EasyCwmp 设计包括 2 个部分: EasyCwmp 核心:它包括 TR069 CWMP 引擎,负责与 ACS 服务器的通信。它是用 C 语言开发的。EasyCwmp DataModel:它包…...
C++ STL学习
首先声明:本文内容全部来自bilibili的【【C】算法竞赛常用 STL 用法】 https://www.bilibili.com/video/BV1L8411y7th/?share_sourcecopy_web&vd_source6548350a40ddeb68e9c477994f630bf0这个视频,在此对up主表示感谢,大家也可以直接去看…...
【源码+文档+调试讲解】校园零售商城微信小程序
摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括校园零售商城微信小程序的网络应用,在外国校园零售商城微信小程序已经是很普遍的方式,不过国内的校园零售商城微信小程序可能还处于起步阶段。校…...
BUUCTF Pwn bjdctf_2020_babystack2 题解
1.下载 checksec 64位 拖入IDA64 定位到main函数 以及后门函数 发现read需要读取输入——nbytes的数字来决定长度 同时nbytes是size_t类型 也就是无符号整型的 所以想到整数溢出漏洞 将nbytes设置为-1就会回绕,变成超大整数 从而实现栈溢出漏洞 exp:…...
【架构】从 Socket 的角度认识非阻塞模型
文章目录 前言1. 阻塞模型2. 非阻塞模型2.1 Reactor 模型优势2.2 Reactor 模型劣势 后记 前言 近期看了很多中间件的文章,RocketMQ,Dubbo 这些中间件内部的rpc通信都用的是非阻塞的模型。(Netty),这里从 Socket 的角度总结一下。 1. 阻塞模…...
PyTorch练习——张量的四则运算与矩阵运算
练习1: # 导入Torch库 import torch# 创建两个张量 x torch.tensor([1, 2, 3]) y torch.tensor([4, 5, 6])# 执行加法操作 z torch.add(x, y) print("加法结果:", z)# 执行减法操作 z torch.subtract(x, y) print("减法结果…...
验证码功能实现
预览: 前端代码 让图片src 产生验证码图片的servlet <img src""></img> servlet代码 public void checkCode(HttpServletRequest request, HttpServletResponse response) throws IOException {ServletOutputStream os response.getOutputStream()…...