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

《Python星球日记》第30天:Flask数据库集成

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》
创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
专栏:《Python星球日记》,限时特价订阅中ing

目录

    • 一、数据库基础
      • 1. SQLite 数据库简介
      • 2. 使用 SQLAlchemy 管理数据库
    • 二、模型定义
      • 1. 创建表:`db.Model`
      • 2. 定义字段:`Column()`、`String()`、`Integer()` 等
      • 3. 定义关系
      • 4. 创建数据库表
    • 三、CRUD 操作
      • 1. 创建记录(Create)
      • 2. 读取记录(Read)
      • 3. 更新记录(Update)
      • 4. 删除记录(Delete)
    • 四、实战项目:为博客系统添加用户系统
      • 1. 项目结构
      • 2. 安装依赖
      • 3. 定义数据模型
      • 4. 创建应用入口
      • 5. 创建模板
      • 6. 修改基础模板
      • 7. 更新CSS样式
      • 8. 更新首页模板
      • 9. 更新文章详情模板
      • 10. 运行与测试
    • 五、总结与进阶方向
      • 进阶方向

👋 专栏介绍: Python星球日记专栏介绍(持续更新ing)
上一篇: 《Python星球日记》第29天:Flask进阶

欢迎来到Python星球日记第30天🪐!

一、数据库基础

在构建Web应用时,数据持久化存储是一个核心需求。

前一天我们使用简单的JSON文件存储博客文章,但这种方式在实际应用中存在诸多限制:不支持复杂查询、并发访问控制薄弱、缺乏数据完整性保障等。数据库系统解决了这些问题,为我们提供更强大的数据管理能力。

1. SQLite 数据库简介

在这里插入图片描述

SQLite 是一个轻量级的、基于文件的关系型数据库,具有以下特点:

  • 零配置:不需要安装服务器或进行复杂设置
  • 自包含:整个数据库就是一个单独的文件
  • 跨平台:可在各种操作系统上使用
  • 标准兼容:支持大部分标准SQL语法
  • Python内置支持:Python标准库中包含sqlite3模块

SQLite非常适合小型到中型应用,特别是在以下场景:

  • 需要嵌入式数据库的应用
  • 开发和测试环境
  • 数据量不是特别大的网站
  • 移动应用的本地存储
# 基本的sqlite3使用示例
import sqlite3# 连接到数据库(如果不存在会自动创建)
conn = sqlite3.connect('example.db')
cursor = conn.cursor()# 创建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT NOT NULL UNIQUE,email TEXT NOT NULL
)
''')# 提交事务
conn.commit()
conn.close()

2. 使用 SQLAlchemy 管理数据库

在这里插入图片描述
图片:SQLAlchemyORM概念图

直接使用sqlite3模块需要编写原始SQL语句,而SQLAlchemy作为Python最著名的ORM(对象关系映射)库,提供了更高级的抽象:

  • ORM模式:将数据库表映射为Python类,将记录映射为对象
  • 多数据库支持:除SQLite外,还支持MySQL、PostgreSQL等
  • 会话管理:提供事务管理和连接池
  • 查询构建器:使用Python语法构建SQL查询

在这里插入图片描述
图片:Flask-SQLAlchemy架构图

在Flask中,通常使用Flask-SQLAlchemy扩展,它是SQLAlchemy的Flask集成版本,提供了额外的集成特性。

# 安装Flask-SQLAlchemy
# pip install flask-sqlalchemyfrom flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
# 配置数据库URI
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
# 禁用追踪修改(减少开销)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 创建数据库对象
db = SQLAlchemy(app)

模型
图片:Flask、SQLAlchemy和数据库的关系

二、模型定义

模型(Model)是SQLAlchemy ORM中的核心概念,它定义了数据库表的结构和行为。在Flask-SQLAlchemy中,我们通过继承db.Model类来创建模型。

1. 创建表:db.Model

每个继承自db.Model的类对应数据库中的一个表:

class User(db.Model):# 定义表名(可选,默认为类名小写)__tablename__ = 'users'# 定义列id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)# 表示对象的方法def __repr__(self):return f'<User {self.username}>'

2. 定义字段:Column()String()Integer()

SQLAlchemy提供了多种列类型,对应不同的数据类型:

  • db.Integer:整数
  • db.String(length):定长字符串
  • db.Text:不定长文本
  • db.Float:浮点数
  • db.Boolean:布尔值
  • db.DateTime:日期时间
  • db.Date:日期
  • db.Time:时间
  • db.LargeBinary:二进制数据

每个列还可以配置多种约束和选项

  • primary_key=True:设置为主键
  • unique=True:值必须唯一
  • nullable=False:不允许为NULL
  • index=True:在此列创建索引
  • default=value:设置默认值
  • server_default=value:设置数据库级别的默认值

3. 定义关系

SQLAlchemy强大之处在于可以轻松定义表间关系:

class Post(db.Model):__tablename__ = 'posts'id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)created_at = db.Column(db.DateTime, default=datetime.utcnow)# 外键 - 引用users表的id列user_id = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=False)# 关系 - 定义与User的关系# backref会在User模型中创建posts属性,实现反向引用author = db.relationship('User', backref=db.backref('posts', lazy=True))

常见的关系类型:

  • 一对多:上例中的User和Post(一个用户可以有多篇文章)

在这里插入图片描述

  • 多对一:Post到User(多篇文章可以对应到一个用户)
  • 一对一:通过uselist=False参数实现
  • 多对多:需要定义关联表

4. 创建数据库表

模型定义好后,需要创建实际的数据库表:

# 在应用上下文中创建所有表
with app.app_context():db.create_all()# 或在初始化时创建
if __name__ == '__main__':with app.app_context():db.create_all()app.run(debug=True)

在这里插入图片描述
图片:博客系统数据库模型关系图

三、CRUD 操作

CRUD数据库操作的基本模式,代表创建(Create)、读取(Read)、更新(Update) 和 删除(Delete)四种基本操作。使用SQLAlchemy,我们可以通过Python对象来执行这些操作。

在这里插入图片描述

1. 创建记录(Create)

在这里插入图片描述

创建新记录的步骤:

  1. 创建模型实例
  2. 将实例添加到会话(Session)
  3. 提交会话
# 创建新用户
@app.route('/register', methods=['POST'])
def register():# 获取表单数据username = request.form.get('username')email = request.form.get('email')password = request.form.get('password')# 创建用户对象new_user = User(username=username,email=email,password_hash=generate_password_hash(password)  # 假设使用werkzeug的密码哈希)# 添加到会话并提交try:db.session.add(new_user)db.session.commit()return jsonify({'message': '用户创建成功'}), 201except Exception as e:db.session.rollback()  # 出错时回滚return jsonify({'error': str(e)}), 400

2. 读取记录(Read)

在这里插入图片描述

SQLAlchemy提供多种查询方法:

# 查询单个用户
user = User.query.get(1)  # 通过主键查询
user = User.query.filter_by(username='python_fan').first()  # 通过条件查询第一个匹配# 查询所有用户
all_users = User.query.all()# 条件查询
users = User.query.filter(User.email.endswith('@example.com')).all()# 排序
recent_users = User.query.order_by(User.created_at.desc()).limit(5).all()# 分页
page = User.query.paginate(page=2, per_page=10)
users_on_page = page.items

3. 更新记录(Update)

在这里插入图片描述

更新记录的步骤:

  1. 查询要更新的记录
  2. 修改属性
  3. 提交会话
@app.route('/users/<int:user_id>', methods=['PUT'])
def update_user(user_id):user = User.query.get_or_404(user_id)  # 如果不存在返回404错误# 更新属性if 'email' in request.json:user.email = request.json['email']if 'username' in request.json:user.username = request.json['username']# 提交更改try:db.session.commit()return jsonify({'message': '用户更新成功'})except Exception as e:db.session.rollback()return jsonify({'error': str(e)}), 400

4. 删除记录(Delete)

在这里插入图片描述

删除记录的步骤:

  1. 查询要删除的记录
  2. 从会话中删除
  3. 提交会话
@app.route('/users/<int:user_id>', methods=['DELETE'])
def delete_user(user_id):user = User.query.get_or_404(user_id)try:db.session.delete(user)db.session.commit()return jsonify({'message': '用户删除成功'})except Exception as e:db.session.rollback()return jsonify({'error': str(e)}), 400

四、实战项目:为博客系统添加用户系统

现在,让我们将前面学到的知识应用到实践中,为昨天构建的博客系统添加用户注册和登录功能。我们将使用Flask-SQLAlchemy来管理数据库,使用Flask-Login来处理用户会话。

1. 项目结构

首先,确定新的项目结构:

flask_blog/
├── app.py              # 应用入口
├── models.py           # 数据模型
├── forms.py            # 表单定义(可选)
├── static/             # 静态文件
│   ├── css/
│   │   └── style.css
│   ├── js/
│   │   └── script.js
│   └── images/
├── templates/          # 模板文件
│   ├── base.html       # 基础模板
│   ├── index.html      # 首页
│   ├── post.html       # 文章详情页
│   ├── about.html      # 关于页面
│   ├── login.html      # 登录页面
│   ├── create.html     # 创建新文章页面
│   └── register.html   # 注册页面
└── instance/           # 实例文件夹(存放数据库文件等)└── blog.db         # SQLite数据库文件

2. 安装依赖

首先,安装所需的扩展:

pip install flask-sqlalchemy flask-login werkzeug

3. 定义数据模型

创建models.py文件,定义用户和文章模型:

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash# 创建数据库对象
db = SQLAlchemy()class User(db.Model, UserMixin):"""用户模型"""id = db.Column(db.Integer, primary_key=True)username = db.Column(db.String(80), unique=True, nullable=False)email = db.Column(db.String(120), unique=True, nullable=False)password_hash = db.Column(db.String(128), nullable=False)created_at = db.Column(db.DateTime, default=datetime.utcnow)# 关系 - 一个用户可以有多篇文章posts = db.relationship('Post', backref='author', lazy=True, cascade='all, delete-orphan')@propertydef password(self):"""密码属性不可读"""raise AttributeError('密码不是可读属性')@password.setterdef password(self, password):"""设置密码时进行哈希"""self.password_hash = generate_password_hash(password)def verify_password(self, password):"""验证密码"""return check_password_hash(self.password_hash, password)def __repr__(self):return f'<User {self.username}>'class Post(db.Model):"""文章模型"""id = db.Column(db.Integer, primary_key=True)title = db.Column(db.String(100), nullable=False)content = db.Column(db.Text, nullable=False)created_at = db.Column(db.DateTime, default=datetime.utcnow)# 外键 - 关联到用户user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)def __repr__(self):return f'<Post {self.title}>'

4. 创建应用入口

修改app.py文件,集成数据库和用户认证:

from flask import Flask, render_template, redirect, url_for, flash, request
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
from werkzeug.security import generate_password_hash
import os
from datetime import datetime# 创建应用实例
app = Flask(__name__)# 配置密钥和数据库
app.config['SECRET_KEY'] = 'your-secret-key'  # 用于会话安全# 获取应用的绝对路径
basedir = os.path.abspath(os.path.dirname(__file__))# 确保instance文件夹存在
instance_path = os.path.join(basedir, 'instance')
os.makedirs(instance_path, exist_ok=True)# 配置数据库URI使用绝对路径
db_path = os.path.join(instance_path, 'blog.db')
app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{db_path}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 初始化数据库
from models import db, User, Post# 在应用上下文中初始化数据库
db.init_app(app)# 设置Flask-Login
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'  # 未登录时重定向到登录页面# 用户加载函数
@login_manager.user_loader
def load_user(user_id):return User.query.get(int(user_id))# 创建所有表
with app.app_context():db.create_all()# 首页路由
@app.route('/')
def index():posts = Post.query.order_by(Post.created_at.desc()).all()return render_template('index.html', posts=posts)# 文章详情页
@app.route('/post/<int:post_id>')
def post(post_id):post = Post.query.get_or_404(post_id)return render_template('post.html', post=post)# 注册路由
@app.route('/register', methods=['GET', 'POST'])
def register():if current_user.is_authenticated:return redirect(url_for('index'))if request.method == 'POST':username = request.form.get('username')email = request.form.get('email')password = request.form.get('password')# 验证用户名和邮箱是否已存在if User.query.filter_by(username=username).first():flash('用户名已被使用')return redirect(url_for('register'))if User.query.filter_by(email=email).first():flash('邮箱已被注册')return redirect(url_for('register'))# 创建新用户new_user = User(username=username, email=email)new_user.password = password  # 使用setter方法哈希密码# 添加到数据库db.session.add(new_user)db.session.commit()flash('注册成功!请登录')return redirect(url_for('login'))return render_template('register.html')# 登录路由
@app.route('/login', methods=['GET', 'POST'])
def login():if current_user.is_authenticated:return redirect(url_for('index'))if request.method == 'POST':email = request.form.get('email')password = request.form.get('password')remember = True if request.form.get('remember') else False# 查找用户user = User.query.filter_by(email=email).first()# 检查用户是否存在和密码是否正确if not user or not user.verify_password(password):flash('请检查邮箱和密码')return redirect(url_for('login'))# 登录用户login_user(user, remember=remember)return redirect(url_for('index'))return render_template('login.html')# 登出路由
@app.route('/logout')
@login_required
def logout():logout_user()return redirect(url_for('index'))# 创建文章路由
@app.route('/create', methods=['GET', 'POST'])
@login_required
def create_post():if request.method == 'POST':title = request.form.get('title')content = request.form.get('content')# 创建新文章new_post = Post(title=title,content=content,user_id=current_user.id)# 添加到数据库db.session.add(new_post)db.session.commit()return redirect(url_for('post', post_id=new_post.id))return render_template('create.html')# 编辑文章路由
@app.route('/post/<int:post_id>/edit', methods=['GET', 'POST'])
@login_required
def edit_post(post_id):post = Post.query.get_or_404(post_id)# 确保只有作者才能编辑if post.user_id != current_user.id:flash('您无权编辑此文章')return redirect(url_for('post', post_id=post_id))if request.method == 'POST':post.title = request.form.get('title')post.content = request.form.get('content')db.session.commit()return redirect(url_for('post', post_id=post_id))return render_template('edit.html', post=post)# 删除文章路由
@app.route('/post/<int:post_id>/delete', methods=['POST'])
@login_required
def delete_post(post_id):post = Post.query.get_or_404(post_id)# 确保只有作者才能删除if post.user_id != current_user.id:flash('您无权删除此文章')return redirect(url_for('post', post_id=post_id))db.session.delete(post)db.session.commit()flash('文章已删除')return redirect(url_for('index'))# 关于页面
@app.route('/about')
def about():return render_template('about.html')if __name__ == '__main__':app.run(debug=True)

5. 创建模板

接下来,创建新的登录和注册模板。

templates/register.html:

{% extends "base.html" %}{% block title %}注册 - Python星球博客{% endblock %}{% block content %}
<section class="auth-form"><h2>注册新账号</h2>{% with messages = get_flashed_messages() %}{% if messages %}<div class="flashes">{% for message in messages %}<div class="flash-message">{{ message }}</div>{% endfor %}</div>{% endif %}{% endwith %}<form method="post"><div class="form-group"><label for="username">用户名</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="email">邮箱</label><input type="email" id="email" name="email" required></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" name="password" required></div><button type="submit" class="submit-btn">注册</button></form><div class="auth-links">已有账号?<a href="{{ url_for('login') }}">登录</a></div>
</section>
{% endblock %}

templates/login.html:

{% extends "base.html" %}{% block title %}登录 - Python星球博客{% endblock %}{% block content %}
<section class="auth-form"><h2>登录账号</h2>{% with messages = get_flashed_messages() %}{% if messages %}<div class="flashes">{% for message in messages %}<div class="flash-message">{{ message }}</div>{% endfor %}</div>{% endif %}{% endwith %}<form method="post"><div class="form-group"><label for="email">邮箱</label><input type="email" id="email" name="email" required></div><div class="form-group"><label for="password">密码</label><input type="password" id="password" name="password" required></div><div class="form-group checkbox"><input type="checkbox" id="remember" name="remember"><label for="remember">记住我</label></div><button type="submit" class="submit-btn">登录</button></form><div class="auth-links">还没有账号?<a href="{{ url_for('register') }}">注册</a></div>
</section>
{% endblock %}

6. 修改基础模板

修改base.html以支持用户登录状态:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{% block title %}Python星球博客{% endblock %}</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">{% block styles %}{% endblock %}
</head>
<body><header class="main-header"><div class="container"><h1 class="site-title">Python星球博客</h1><nav class="main-nav"><ul><li><a href="{{ url_for('index') }}">首页</a></li>{% if current_user.is_authenticated %}<li><a href="{{ url_for('create_post') }}">写文章</a></li><li><a href="{{ url_for('logout') }}">登出 ({{ current_user.username }})</a></li>{% else %}<li><a href="{{ url_for('login') }}">登录</a></li><li><a href="{{ url_for('register') }}">注册</a></li>{% endif %}<li><a href="{{ url_for('about') }}">关于</a></li></ul></nav></div></header><main class="container">{% with messages = get_flashed_messages() %}{% if messages %}<div class="flashes">{% for message in messages %}<div class="flash-message">{{ message }}</div>{% endfor %}</div>{% endif %}{% endwith %}{% block content %}{% endblock %}</main><footer class="main-footer"><div class="container"><p>&copy; 2025 Python星球日记 | Flask数据库集成教程</p></div></footer>{% block scripts %}{% endblock %}
</body>
</html>

7. 更新CSS样式

static/css/style.css添加认证表单的样式:

/* 认证表单样式 */
.auth-form {max-width: 500px;margin: 2rem auto;padding: 2rem;background: white;border-radius: 5px;box-shadow: 0 2px 5px rgba(0,0,0,0.05);
}.auth-form h2 {margin-top: 0;margin-bottom: 1.5rem;text-align: center;
}.flashes {margin-bottom: 1.5rem;
}.flash-message {padding: 0.75rem;margin-bottom: 0.5rem;border-radius: 3px;background-color: #f8d7da;color: #721c24;border: 1px solid #f5c6cb;
}.auth-links {margin-top: 1.5rem;text-align: center;font-size: 0.9rem;
}.checkbox {display: flex;align-items: center;
}.checkbox input {width: auto;margin-right: 0.5rem;
}.checkbox label {margin-bottom: 0;font-weight: normal;
}

8. 更新首页模板

修改index.html以显示文章作者:

{% extends "base.html" %}{% block title %}首页 - Python星球博客{% endblock %}{% block content %}
<section class="blog-list"><h2>最新文章</h2>{% if posts %}<div class="posts">{% for post in posts %}<article class="post-card"><h3><a href="{{ url_for('post', post_id=post.id) }}">{{ post.title }}</a></h3><div class="post-meta"><span class="author">作者: {{ post.author.username }}</span><span class="date">{{ post.created_at.strftime('%Y-%m-%d %H:%M') }}</span></div><div class="post-excerpt">{{ post.content[:100] }}{% if post.content|length > 100 %}...{% endif %}</div><a href="{{ url_for('post', post_id=post.id) }}" class="read-more">阅读全文</a></article>{% endfor %}</div>{% else %}<p class="no-posts">暂无文章,来创建第一篇吧!</p>{% endif %}
</section>
{% endblock %}

9. 更新文章详情模板

修改post.html以显示文章作者:

{% extends "base.html" %}{% block title %}{{ post.title }} - Python星球博客{% endblock %}{% block content %}
<article class="post-detail"><header class="post-header"><h2 class="post-title">{{ post.title }}</h2><div class="post-meta"><span class="author">作者: {{ post.author.username }}</span><span class="date">{{ post.created_at.strftime('%Y-%m-%d %H:%M') }}</span></div></header><div class="post-content">{{ post.content|safe }}</div><footer class="post-footer"><a href="{{ url_for('index') }}" class="back-link">返回首页</a>{% if current_user.is_authenticated and current_user.id == post.user_id %}<div class="post-actions"><a href="{{ url_for('edit_post', post_id=post.id) }}" class="edit-link">编辑</a><form method="post" action="{{ url_for('delete_post', post_id=post.id) }}" class="inline-form"><button type="submit" class="delete-btn" onclick="return confirm('确定要删除这篇文章吗?')">删除</button></form></div>{% endif %}</footer>
</article>
{% endblock %}

10. 运行与测试

完成所有修改后,按照以下步骤运行和测试项目:

1. 确保安装了所有依赖:

pip install flask flask-sqlalchemy flask-login werkzeug

2. 运行应用:

python app.py

3. 访问 http://127.0.0.1:5000/ 查看博客系统

在这里插入图片描述
图片:首页

在这里插入图片描述
图片:注册界面

在这里插入图片描述
图片:登录界面

在这里插入图片描述
图片:登录后的首页界面

在这里插入图片描述
图片:写文章界面

写好的文章可以编辑,可以删除

在这里插入图片描述

我们写了一篇文章,回到首页可以看到最新文章

在这里插入图片描述

4. 主要功能汇总:

  • 注册新用户
  • 登录系统
  • 创建新文章
  • 查看文章详情
  • 登出系统

五、总结与进阶方向

在本章中,我们学习了Flask数据库集成的核心概念和实践,包括:

  1. SQLite数据库的基础知识和优势
  2. 使用SQLAlchemy ORM进行数据库抽象
  3. 定义数据模型和表关系
  4. 执行基本的CRUD操作
  5. 实现完整的用户认证系统

相比昨天使用JSON文件存储数据,今天的博客系统在以下方面得到了显著提升:

  • 数据结构化:通过关系型数据库保证了数据的结构化存储
  • 查询能力:可以执行复杂的数据查询
  • 数据完整性:通过外键和约束保证数据一致性
  • 用户认证:添加了安全的用户注册和登录功能
  • 功能扩展:为后续添加更多功能奠定了基础

进阶方向

想要继续提升Flask和数据库集成技能,可以探索以下方向:

  1. 数据库迁移:使用Flask-Migrate管理数据库架构变更
  2. 更复杂的数据关系:实现多对多关系、自引用关系等
  3. 高级查询:聚合函数、子查询、联结查询等
  4. 性能优化:数据库索引、查询优化、连接池配置
  5. 测试:数据库操作的单元测试和集成测试
  6. 安全性:防SQL注入、数据验证、访问控制
  7. 扩展功能:评论系统、标签分类、搜索功能

通过这一章的学习,我们已经掌握了Flask与数据库集成的核心技能,这为构建更复杂、功能更丰富的Web应用奠定了坚实基础。

数据库是几乎所有现代Web应用的核心组件,深入理解这一部分对于成为一名全栈Python开发者至关重要。

创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊)
如果你对今天的内容有任何问题,或者想分享你的学习心得,欢迎在评论区留言讨论!

相关文章:

《Python星球日记》第30天:Flask数据库集成

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、数据库…...

GAF-CNN-SSA-LSSVM故障诊断/分类预测,附带模型研究报告(Matlab)

GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09; 目录 GAF-CNN-SSA-LSSVM故障诊断/分类预测&#xff0c;附带模型研究报告&#xff08;Matlab&#xff09;效果一览基本描述程序设计参考资料 效果一览 基本描述 本研究提出的GA…...

轻松养生:让健康融入生活

养生不是负担&#xff0c;而是可以轻松融入日常的生活方式。掌握以下要点&#xff0c;就能开启健康之旅。 清晨醒来&#xff0c;先喝一杯常温水&#xff0c;唤醒沉睡的肠胃。早餐选择富含膳食纤维的燕麦片搭配新鲜水果&#xff0c;补充能量又促进消化。午餐和晚餐做到荤素搭配&…...

工业主义与民主的兴衰:历史逻辑与未来危机

一、工业主义催生大众民主的机制 经济基础变革 非技术工人崛起&#xff1a;工业革命后&#xff0c;机器生产替代传统手工业&#xff0c;非熟练工人&#xff08;包括妇女、儿童&#xff09;收入提升&#xff0c;财富分配趋于平等&#xff0c;形成新兴中产阶级。 政府财政能力增…...

从代码学习深度学习 - 目标检测前置知识(二) PyTorch版

文章目录 前言一、多尺度目标检测1.1 多尺度锚框1.2 绘图工具函数 (`utils_for_huitu.py`)1.3 可视化多尺度锚框1.4 多尺度检测(理论)二、自定义目标检测数据集2.1 读取数据2.2 创建 Dataset 类2.3 创建 DataLoader2.4 验证数据加载2.5 可视化数据集样本总结前言 大家好!欢…...

什么是“系统调用”

一、什么是“系统调用”&#xff1f;用生活中的比喻理解 可以把“系统调用”比作你&#xff08;用户&#xff09;向“管理员”请求帮助完成某件事情的过程。 举个例子&#xff1a; 你想借书&#xff0c;去图书馆&#xff08;操作系统&#xff09;找管理员&#xff08;内核&a…...

代码异味(Code Smell)识别与重构指南

1、引言:什么是“代码异味”? 在软件开发中,“代码异味(Code Smell)”是指那些虽然不会导致程序编译失败或运行错误,但暗示着潜在设计缺陷或可维护性问题的代码结构。它们是代码演进过程中的“信号灯”,提示我们某段代码可能需要优化。 1.1 ✅ 为什么关注代码异味? 预…...

005-nlohmann/json 基础方法-C++开源库108杰

《二、基础方法》&#xff1a;节点访问、值获取、显式 vs 隐式、异常处理、迭代器、类型检测、异常处理……一节课搞定C处理JSON数据85%的需求…… JSON 字段的简单类型包括&#xff1a;number、boolean、string 和 null&#xff08;即空值&#xff09;&#xff1b;复杂类型则有…...

java学习之数据结构:四、树(代码补充)

这部分主要是用代码实现有序二叉树、树遍历、删除节点 目录 1.构建有序二叉树 1.1原理 1.2插入实现 2.广度优先遍历--队列实现 3.深度优先遍历--递归实现 3.1先序遍历 3.2中序遍历 3.3后序遍历 4.删除 4.1删除叶子节点 4.2删除有一棵子树的节点 4.3删除有两棵子树的节…...

Java面试场景分析:从音视频到安全与风控的技术探讨

Java面试场景分析&#xff1a;从音视频到安全与风控的技术探讨 在一个阳光明媚的早晨&#xff0c;互联网大厂的面试室里&#xff0c;面试官李老师坐在桌前&#xff0c;严肃认真&#xff1b;而程序员小张则显得有些紧张&#xff0c;甚至有些搞笑。 第一轮提问&#xff1a; 李老…...

《OmniMeetProTrack 全维会议链智能追录系统 软件设计文档》

撰稿人&#xff1a;wjz 一、引言 1.1 目的 本软件设计文档详细描述了 OmniMeetProTrack 全维会议链智能追录系统的架构、组件、模块设计及实现细节&#xff0c;旨在为开发人员、利益相关者和维护人员提供系统的全面设计蓝图。本文档基于需求定义文档&#xff0c;确保系统实现…...

C 语言逻辑运算符:组合判断,构建更复杂的条件

各类资料学习下载合集 ​​https://pan.quark.cn/s/8c91ccb5a474​​ 在 C 语言编程中,我们已经学习了如何使用比较运算符(如 ​​==​​​, ​​<​​​, ​​>​​)来判断两个值之间的关系,从而得到“真”或“假”的结果。但很多时候,我们需要根据多个条件的组合…...

大模型推理框架简介

概述 通常需要大量的计算资源&#xff0c;高效运行LLMs仍然是一个挑战&#xff0c; 推理框架作为LLM高效部署的关键组件&#xff0c;直接关系到应用的性能、成本和开发效率。 高性能框架 vLLM GitHub&#xff0c;由SKYPILOT构建的推理优化框架&#xff0c;旨在提高在GPU上…...

《MATLAB实战训练营:从入门到工业级应用》高阶挑战篇-《5G通信速成:MATLAB毫米波信道建模仿真指南》

《MATLAB实战训练营&#xff1a;从入门到工业级应用》高阶挑战篇-5G通信速成&#xff1a;MATLAB毫米波信道建模仿真指南 &#x1f680;&#x1f4e1; 大家好&#xff01;今天我将带大家进入5G通信的奇妙世界&#xff0c;我们一起探索5G通信中最激动人心的部分之一——毫米波信…...

word导出pdf带有目录导航栏-error记

1、打开word文档——>点击"视图"选项卡——>勾选"导航窗格" 2、点击"文件"——>导出——>创建PDF/XPS 3、点击"选项"——>勾选"创建书签时使用(C)" "标题(H)" 4、点击"确定"——>点击…...

word怎么删除空白页?word最后一页删不掉怎么办

在使用word的过程中&#xff0c;有时出现空白页就可能会给大家带来一些困扰。到底怎么样才能把这些空白页删除&#xff0c;又应该如何解决最后也删不掉的问题呢&#xff1f; 要想删除普通的空白页&#xff0c;那就需要将光标直接放在空白页&#xff0c;然后按【Delete】键&…...

虚幻基础:硬件输入

文章目录 triggered&#xff1a;按下一直触发 等于tickcompleted&#xff1a;必须等到triggered结束后 才触发松下triggered结束 默认按键触发顺序按下&#xff1a;触发两个先 Started后 Triggered 松开Completed 触发器&#xff1a;用于修改triggered 触发和结束驱动阈值&…...

【Java ee初阶】多线程(5)

一、wait 和 notify wait notify 是两个用来协调线程执行顺序的关键字&#xff0c;用来避免“线程饿死”的情况。 wait 和 notify 其实都是 Object 这个类的方法&#xff0c;而 Object这个类是所有类的“祖宗类”&#xff0c;也就是说明&#xff0c;任何一个类&#xff0c;都…...

售前赢单评分是越权吗?

相关文章 软件实施工作个人看法 当前部门软件产品经理的职责涵盖售前支持工作。此前梳理工作时&#xff0c;计划在每个售前支持项目完成后&#xff0c;由支持人对项目赢单概率进行评估&#xff0c;旨在通过这一机制筛选重点项目&#xff0c;为赢单率高的项目优先配置资源。 …...

uniapp中用canvas绘制简单柱形图,小容量,不用插件——简单使用canvas

uniapp中用canvas绘制简单柱形图&#xff0c;小容量&#xff0c;不用插件——简单使用canvas 完整代码 <template><view><!-- 学习数据 --><!-- 头部选项卡 --><view class"navTab"><view :class"listIndexi?activite:"…...

SecureCRT 使用指南:安装、设置与高效操作

目录 一、SecureCRT 简介 1.1 什么是 SecureCRT&#xff1f; 1.2 核心功能亮点 1.3 软件特点 二、SecureCRT 安装与激活 2.1 安装步骤&#xff08;Windows 系统&#xff09; 2.2 激活与破解&#xff08;仅供学习参考&#xff09; 三、基础配置与优化 3.1 界面与编码设…...

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…...

第R8周:RNN实现阿尔兹海默病诊断(pytorch)

- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/rnFa-IeY93EpjVu0yzzjkw) 中的学习记录博客** - **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 一&#xff1a;前期准备工作 1.设置硬件设备 impo…...

vue+element 导航 实现例子

项目使用的是 vue 3&#xff0c;安装配置可以查看栏目前面的文章。 组件 导航&#xff1a;https://element-plus.org/zh-CN/component/menu.html 面包屑&#xff1a;https://element-plus.org/zh-CN/component/breadcrumb.html 安装element库 PS D:\code\my-vue3-project&g…...

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析

金仓数据库 KingbaseES 在电商平台数据库迁移与运维中深入复现剖析 前言 在当今数字化商业蓬勃发展的时代&#xff0c;电商平台的数据量呈爆发式增长&#xff0c;对数据库性能、稳定性和扩展性提出了极高要求。本文章基于大型电商平台原本采用 MySQL 数据库&#xff0c;但随着业…...

Go小技巧易错点100例(三十)

本期分享&#xff1a; 1.切片共享底层数组 2.获取Go函数的注释 切片共享底层数组 在Go语言中&#xff0c;切片和数组是两种不同的元素&#xff0c;但是切片的底层是数组&#xff0c;并且还有一个比较重要的机制&#xff1a;切片共享底层数组。 下面这段代码演示了切片&…...

LeetCode 热题 100 78. 子集

LeetCode 热题 100 | 78. 子集 大家好&#xff0c;今天我们来解决一道经典的算法题——子集。这道题在 LeetCode 上被标记为中等难度&#xff0c;要求给定一个整数数组 nums&#xff0c;返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集不能包含重复的子集&#x…...

苹果公司正在与亚马逊支持的初创公司Anthropic展开合作

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

Python项目源码57:数据格式转换工具1.0(csv+json+excel+sqlite3)

1.智能路径处理&#xff1a;自动识别并修正文件扩展名&#xff0c;根据转换类型自动建议目标路径&#xff0c;实时路径格式验证&#xff0c;自动补全缺失的文件扩展名。 2.增强型预览功能&#xff1a;使用pandastable库实现表格预览&#xff0c;第三方模块自己安装一下&#x…...

Redis总结(六)redis持久化

本文将简单介绍redis持久化的两种方式 redis提供了两种不同级别的持久化方式&#xff1a; RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 5.3 相关性分析&#xff08;PEARSON/SPEARMAN相关系数&#xff09;5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数&#xff08; Pearson Corr…...

C++负载均衡远程调用学习之负载均衡算法与实现

目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

AIGC学术时代:DeepSeek如何助力实验与数值模拟

目录 1.实验和数值模拟工具 2.结合使用 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 在工程和科学研究的世界里&#xff0c;实验与数值模拟是探索未知、验证理论和推动创新的两大支柱。它们如同一对翅膀&#xff0c;让思想得以飞翔&#xf…...

PHP数组排序深度解析:sort()、rsort()、asort()、arsort()、ksort()、krsort() 的适用场景与性能对比

在PHP开发中&#xff0c;数组排序是日常操作的核心技能之一。无论是处理用户数据、产品列表&#xff0c;还是分析日志信息&#xff0c;合理的排序方法能显著提升代码的效率和可维护性。PHP提供了多种数组排序函数&#xff08;如 sort()、rsort()、asort() 等&#xff09;&#…...

2025年企业Radius认证服务器市场深度调研:中小企业身份安全投入产出比最优解

引言&#xff1a;数字化转型浪潮下的身份安全新命题 在混合办公成为常态、物联网设备呈指数级增长、网络攻击手段日益隐蔽的2025年&#xff0c;企业网络边界正在经历前所未有的重构。据IDC预测&#xff0c;全球企业网络安全投入中&#xff0c;身份与访问管理&#xff08;IAM&a…...

开源模型应用落地-qwen模型小试-Qwen3-8B-快速体验-批量推理(三)

一、前言 阿里云最新推出的 Qwen3-8B 大语言模型,作为国内首个集成“快思考”与“慢思考”能力的混合推理模型,凭借其 80 亿参数规模及 128K 超长上下文支持,正在重塑 AI 应用边界。该模型既可通过轻量化“快思考”实现低算力秒级响应,也能在复杂任务中激活深度推理模式,以…...

相同IP和端口的服务器ssh连接时出现异常

起因 把服务器上的一个虚拟机搞坏了&#xff0c;所以删除重新创建了一个&#xff0c;端口号和IP与之前的虚拟机相同。 ssh usernameIP -p port 时报错 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone…...

VScode中关于Copilot的骚操作

目录 1. Ctrl I 直接在工作区对话 2.Tab 党福音&#xff1a;写注释生成代码 3. 连续写几行函数头&#xff0c;Copilot 会自动“补全全函数” 4. 自动写单元测试 5. 在注释中要求它写某种风格 6. 代码重写器 7. 多语言切换无痛自动翻译 8. 在空文件中写注释&#xff0c…...

linux inotify 资源详解

Linux 的 inotify 是一个强大的文件系统监控机制&#xff0c;允许应用程序实时监听文件和目录的变化。这对于需要响应文件系统事件的应用&#xff08;如配置热加载、备份工具、文件同步服务等&#xff09;至关重要。以下是对 inotify 资源的深度解析&#xff1a; 一、核心概念…...

Java SE(8)——继承

1.继承的概念&作用 在Java中&#xff0c;继承是面向对象编程的三大基本特性之一&#xff08;还有封装和多态&#xff09;&#xff0c;允许一个类&#xff08;子类/继承类&#xff09;继承另一个类&#xff08;父类/基类&#xff09;的属性和方法 继承的核心目的是&#xf…...

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…...

AIDC智算中心建设:资源池化核心技术解析

目录 一、池化技术架构 二、池化核心技术 三、展望 一、池化技术架构 智能算力池化指依托云计算技术&#xff0c;整合 GPU/AI 芯片等异构算力资源&#xff0c;构建集中管理的资源池&#xff0c;并按上层智算业务的需求&#xff0c;对池化的资源进行统一调度、分配&#xff…...

flink监控指标

文章目录 一、flink yaml配置二、配置指标项情况 提示&#xff1a;以下是基于开源flink on k8s环境下配置监控指标(部分已实验&#xff0c;粗略记录) 一、flink yaml配置 配置完成后就可以在页面查询(部分 需要验证)指标 二、配置指标项情况 参考下面网址&#xff1a; 阿里…...

签名去背景图像处理实例

一、前言 在生活中我们经常用到电子签名&#xff0c;但有时候我们所获取的图像的彩色图像&#xff0c;我们需要获取白底黑字的电子签名&#xff0c;我们可以通过下面程序对彩色图像进行处理达到我们的处理目的。 原始彩色图像如下&#xff1a; 二、原始代码 clear all;close a…...

[人机交互]理解与概念化交互

零.本章重点&#xff08;理解和分析用户问题&#xff09; – 解释“问题空间”的概念和含义 – 解释如何概念化交互 – 描述什么是概念模型 – 讨论将界面隐喻作为概念模型的利弊 – 讨论界面具体化和抽象化各自的优缺点 – 概述概念设计和实际设计的关系 一.理解问题空间 简单…...

C与指针——常见库函数

字符串 #include<stdlibs.h> int abs(int); long labs(long); int rand(void);//0-RAND_MAX //字符串转值 int atoi(const char*); long atol(const char*); float atof(const char*);数学\排序 #include<math.h> \\常见三角&#xff0c;sqrt(); exp(); double p…...

【C++指南】STL list容器完全解读(一):从入门到掌握基础操作

. &#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 文章目录 一、初识list容器1.1 什么是list&#xff1f;1.2 核心特性1.3 典型应用场景 二、核心成员函数…...

Auto.js 脚本:清理手机数据但保留账号

Auto.js 脚本&#xff1a;清理手机数据但保留账号 以下是一个使用 Auto.js 实现的脚本&#xff0c;它可以帮你清理手机数据&#xff08;类似恢复出厂设置&#xff09;&#xff0c;同时尽可能保留已登录的账号状态。请注意&#xff0c;这个脚本不能完全等同于真正的恢复出厂设置…...

Web Workers 技术详解与最佳实践

Web Workers 是 HTML5 提供的一个强大的多线程解决方案&#xff0c;它允许在后台线程中运行 JavaScript 代码&#xff0c;从而避免阻塞主线程。本文将深入探讨 Web Workers 的技术实现和实际应用。 一、Web Workers 基础 1. 创建 Worker // 主线程代码 const worker new Wo…...

llama_factory0.9.3微调Qwen3

llama_factory微调QWen1.5-CSDN博客文章浏览阅读3.3k次,点赞36次,收藏10次。本文介绍了如何使用LLaMA-Factory微调Qwen1.5模型,包括1.8B和0.5B版本的训练细节。在数据、训练、LORA融合及...