从零到英雄:用SQLModel和Python构建你的第一个超级英雄数据库

别再折腾框架了!用华为应用市场官方渠道搞定GBOX,安全安装谷歌全家桶(鸿蒙HarmonyOS 3/4实测) 本文详细介绍了如何在鸿蒙系统上通过华为应用市场官方渠道安全安装GBOX,实现谷歌全家桶的无损使用。该方法避免了传统破解方式的安全风险,利用沙箱技术隔离运行环境,确保系统稳定性和数据安全。特别适合鸿蒙HarmonyOS 3/4用户安全使用谷歌生态应用。 阅读详情

从零构建超级英雄数据库:SQLModel实战全攻略

1. 为什么选择SQLModel构建数据层

第一次接触SQLModel时,我被它简洁而强大的设计理念所吸引。作为一个融合了Pydantic数据验证和SQLAlchemy ORM优势的现代Python库,SQLModel让数据库操作变得前所未有的直观。想象一下,你正在开发一个超级英雄管理系统,需要记录每位英雄的代号、真实身份和特殊能力——这正是SQLModel大显身手的场景。

与传统ORM工具相比,SQLModel有几个显著优势:

  • 类型提示全覆盖:从模型定义到查询结果,全程享受IDE自动补全
  • 无缝衔接FastAPI:同样的模型可直接用于API请求/响应验证
  • 开发体验优化:减少样板代码,专注业务逻辑实现
# 典型SQLModel模型定义示例
class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(index=True, max_length=100)
    secret_identity: str
    power_level: int = Field(ge=1, le=10)
    team_id: int | None = Field(default=None, foreign_key="team.id")

这个简单的模型定义已经包含了字段约束、索引、外键关系等数据库核心功能。特别值得注意的是power_level字段的验证规则——我们限定了英雄战力值必须在1到10之间,这种声明式的验证规则会在数据入库前自动生效。

2. 环境配置与数据库连接

2.1 安装必要依赖

开始前需要确保Python环境版本≥3.7。推荐使用虚拟环境隔离项目依赖:

python -m venv heroenv
source heroenv/bin/activate  # Linux/Mac
heroenv\Scripts\activate     # Windows

安装核心依赖包:

pip install sqlmodel mysqlclient pymysql

提示:生产环境建议使用mysqlclient驱动,它在性能上优于纯Python实现的pymysql

2.2 数据库连接配置

SQLModel支持多种数据库后端,我们以MySQL为例展示连接配置:

from sqlmodel import create_engine

DATABASE_URL = "mysql://user:password@localhost:3306/hero_db"
engine = create_engine(
    DATABASE_URL,
    echo=True,  # 开发时开启SQL日志
    pool_size=5,
    max_overflow=10,
    pool_recycle=3600
)

配置参数说明:

参数说明推荐值
echo输出执行SQL开发True/生产False
pool_size连接池大小根据并发量调整
max_overflow允许超出pool_size的连接数pool_size的1-2倍
pool_recycle连接回收时间(秒)小于数据库wait_timeout

3. 数据模型设计与高级特性

3.1 基础模型构建

让我们扩展最初的Hero模型,构建完整的超级英雄数据体系:

from datetime import datetime
from typing import Optional, List
from sqlmodel import SQLModel, Field, Relationship

class Team(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(unique=True)
    headquarters: str
    formed_date: datetime = Field(default_factory=datetime.now)
    heroes: List["Hero"] = Relationship(back_populates="team")

class Hero(SQLModel, table=True):
    id: int | None = Field(default=None, primary_key=True)
    name: str = Field(index=True)
    secret_identity: str
    power_level: int = Field(ge=1, le=10)
    is_active: bool = Field(default=True)
    created_at: datetime = Field(default_factory=datetime.now)
    team_id: int | None = Field(default=None, foreign_key="team.id")
    team: Optional[Team] = Relationship(back_populates="heroes")

这个设计展示了SQLModel的几个高级特性:

  1. 一对多关系:通过Relationship建立团队与英雄的关联
  2. 字段默认值:使用default_factory动态生成创建时间
  3. 数据约束:power_level的范围限制和team_name的唯一性

3.2 数据库迁移策略

虽然SQLModel可以通过metadata.create_all()创建表结构,但对于生产环境,建议使用专业的迁移工具Alembic:

pip install alembic
alembic init migrations

配置alembic.ini中的数据库连接后,生成迁移脚本:

alembic revision --autogenerate -m "init"
alembic upgrade head

4. CRUD操作实战技巧

4.1 批量数据操作优化

当需要插入大量英雄数据时,单个session.add()效率低下。SQLModel提供了批量操作优化:

from sqlmodel import Session

def batch_create_heroes(hero_data: List[dict]):
    with Session(engine) as session:
        heroes = [Hero(**data) for data in hero_data]
        session.bulk_save_objects(heroes)
        session.commit()
        
        # 返回带ID的对象列表
        return session.exec(select(Hero).where(
            Hero.name.in_([h.name for h in heroes])
        )).all()

性能对比测试结果:

操作方式1000条数据耗时(ms)
单条插入1250
批量插入180

4.2 高级查询技巧

SQLModel的查询能力建立在SQLAlchemy Core之上,支持各种复杂查询场景:

from sqlmodel import select, or_, and_

# 复合条件查询
def search_heroes(name: str = None, min_power: int = None):
    stmt = select(Hero)
    conditions = []
    if name:
        conditions.append(Hero.name.contains(name))
    if min_power:
        conditions.append(Hero.power_level >= min_power)
    if conditions:
        stmt = stmt.where(and_(*conditions))
    return session.exec(stmt.order_by(Hero.power_level.desc())).all()

# 关联查询
def get_team_with_heroes(team_id: int):
    return session.exec(
        select(Team, Hero)
        .join(Hero)
        .where(Team.id == team_id)
    ).all()

4.3 事务管理与错误处理

关键业务操作应该放在事务中执行:

from sqlalchemy.exc import SQLAlchemyError

def transfer_hero(hero_id: int, new_team_id: int):
    try:
        with Session(engine) as session:
            hero = session.get(Hero, hero_id)
            if not hero:
                raise ValueError("Hero not found")
                
            team = session.get(Team, new_team_id)
            if not team:
                raise ValueError("Team not found")
                
            hero.team_id = new_team_id
            session.add(hero)
            session.commit()
            return hero
    except SQLAlchemyError as e:
        session.rollback()
        raise RuntimeError("Database operation failed") from e

5. 性能优化实战

5.1 索引策略优化

合理的索引可以大幅提升查询性能。以下是针对英雄系统的索引建议:

class Hero(SQLModel, table=True):
    # ...其他字段...
    name: str = Field(index=True)  # 单字段索引
    power_level: int = Field(index=True)
    
    # 复合索引示例
    __table_args__ = (
        Index("ix_hero_team_status", "team_id", "is_active"),
    )

索引使用原则:

  1. 高频查询条件:为WHERE子句常用字段建立索引
  2. 避免过度索引:每个索引会增加写入开销
  3. 复合索引顺序:区分度高的字段在前

5.2 查询性能分析

使用SQLAlchemy的事件监听器监控查询性能:

from sqlalchemy import event
import time

@event.listens_for(engine, "before_cursor_execute")
def before_cursor_execute(conn, cursor, statement, parameters, context, executemany):
    context._query_start_time = time.time()

@event.listens_for(engine, "after_cursor_execute")
def after_cursor_execute(conn, cursor, statement, parameters, context, executemany):
    duration = (time.time() - context._query_start_time) * 1000
    if duration > 50:  # 记录慢查询
        print(f"Slow query ({duration:.2f}ms): {statement}")

5.3 缓存策略实现

对于不常变动的数据,如英雄团队信息,可以引入缓存层:

from functools import lru_cache

@lru_cache(maxsize=32)
def get_team_cached(team_id: int):
    with Session(engine) as session:
        return session.get(Team, team_id)

缓存更新策略:

  1. 定时过期:适合数据变化不频繁的场景
  2. 主动失效:在数据变更时清除相关缓存
  3. 分级缓存:热点数据使用内存缓存,全量数据使用Redis

6. 与FastAPI集成实战

SQLModel与FastAPI的集成堪称完美,下面展示如何构建超级英雄API:

from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_methods=["*"],
    allow_headers=["*"],
)

@app.post("/heroes/", response_model=Hero)
def create_hero(hero: Hero):
    with Session(engine) as session:
        session.add(hero)
        session.commit()
        session.refresh(hero)
        return hero

@app.get("/heroes/{hero_id}", response_model=Hero)
def read_hero(hero_id: int):
    with Session(engine) as session:
        hero = session.get(Hero, hero_id)
        if not hero:
            raise HTTPException(status_code=404, detail="Hero not found")
        return hero

@app.get("/teams/{team_id}/heroes", response_model=List[Hero])
def read_team_heroes(team_id: int, active_only: bool = True):
    with Session(engine) as session:
        team = session.get(Team, team_id)
        if not team:
            raise HTTPException(status_code=404, detail="Team not found")
            
        query = select(Hero).where(Hero.team_id == team_id)
        if active_only:
            query = query.where(Hero.is_active == True)
            
        return session.exec(query).all()

API设计最佳实践:

  1. 资源命名:使用复数名词(/heroes而非/hero)
  2. 状态码规范:正确使用200/201/404等状态码
  3. 分页支持:大数据集返回时分页处理
  4. 版本控制:API路径中包含版本号(/v1/heroes)

7. 测试策略与质量保障

7.1 单元测试实现

使用pytest编写数据库操作测试:

import pytest
from sqlmodel import SQLModel, create_engine
from sqlmodel.pool import StaticPool

@pytest.fixture
def test_session():
    engine = create_engine(
        "sqlite://",
        connect_args={"check_same_thread": False},
        poolclass=StaticPool
    )
    SQLModel.metadata.create_all(engine)
    with Session(engine) as session:
        yield session

def test_create_hero(test_session):
    hero = Hero(name="TestHero", secret_identity="John Doe")
    test_session.add(hero)
    test_session.commit()
    
    db_hero = test_session.exec(
        select(Hero).where(Hero.name == "TestHero")
    ).first()
    assert db_hero is not None
    assert db_hero.secret_identity == "John Doe"

7.2 集成测试方案

使用TestClient测试完整API链路:

from fastapi.testclient import TestClient

def test_create_hero_api():
    client = TestClient(app)
    response = client.post(
        "/heroes/",
        json={"name": "APITest", "secret_identity": "Tester"}
    )
    assert response.status_code == 200
    assert response.json()["name"] == "APITest"

7.3 性能测试要点

使用locust进行负载测试,重点关注:

  1. 并发创建英雄:测试写入性能瓶颈
  2. 复杂查询负载:模拟真实搜索场景
  3. 长时间运行测试:检测内存泄漏问题

测试指标参考值:

场景达标QPS平均响应时间
单条插入≥50<100ms
主键查询≥500<20ms
复杂搜索≥100<200ms

8. 部署与监控

8.1 容器化部署

Dockerfile配置示例:

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

最佳实践:

  1. 多阶段构建:减少最终镜像大小
  2. 非root用户:增强安全性
  3. 健康检查:配置容器健康探针

8.2 性能监控配置

使用Prometheus+Grafana监控系统:

from prometheus_fastapi_instrumentator import Instrumentator

Instrumentator().instrument(app).expose(app)

关键监控指标:

  1. 数据库连接池:活跃连接数、等待连接数
  2. API性能:请求耗时、错误率
  3. 系统资源:CPU、内存使用率

8.3 日志策略

结构化日志配置示例:

import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger("hero-api")
handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter(
    "%(asctime)s %(levelname)s %(message)s"
)
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

日志分析建议:

  1. 错误日志聚合:使用Sentry或ELK
  2. 访问日志分析:统计API使用模式
  3. 审计日志:记录关键数据变更

9. 项目结构优化

成熟的超级英雄管理系统建议采用模块化结构:

hero_system/
├── api/
│   ├── endpoints/
│   │   ├── heroes.py
│   │   └── teams.py
│   └── dependencies.py
├── core/
│   ├── config.py
│   └── security.py
├── db/
│   ├── models.py
│   ├── session.py
│   └── repositories/
│       ├── hero_repo.py
│       └── team_repo.py
├── schemas/
│   ├── hero.py
│   └── team.py
├── tests/
│   ├── unit/
│   └── integration/
├── main.py
└── requirements.txt

架构优势:

  1. 关注点分离:路由、业务逻辑、数据访问分层明确
  2. 易于测试:各模块可独立测试
  3. 可扩展性:新增功能不影响现有结构

10. 进阶开发技巧

10.1 自定义字段类型

处理特殊数据类型示例:

from typing import Any
from sqlmodel import SQLModel, Field
from pydantic import validator
import json

class PowerSet(SQLModel):
    offensive: list[str]
    defensive: list[str]
    utility: list[str]

class Hero(SQLModel, table=True):
    # ...其他字段...
    powers: str  # 实际存储JSON字符串
    
    @validator("powers", pre=True)
    def validate_powers(cls, v):
        if isinstance(v, PowerSet):
            return v.json()
        if isinstance(v, str):
            try:
                return PowerSet.parse_raw(v).json()
            except ValueError:
                pass
        raise ValueError("Invalid power set format")
    
    def get_powers(self) -> PowerSet:
        return PowerSet.parse_raw(self.powers)

10.2 多数据库支持

通过路由策略实现多数据库访问:

from sqlalchemy.orm import Session, sessionmaker
from contextlib import contextmanager

class Router:
    def __init__(self):
        self.engines = {
            "primary": create_engine(PRIMARY_DB_URL),
            "replica": create_engine(REPLICA_DB_URL)
        }
    
    @contextmanager
    def get_session(self, read_only=False):
        engine = self.engines["replica"] if read_only else self.engines["primary"]
        session = sessionmaker(engine)()
        try:
            yield session
            if not read_only:
                session.commit()
        except:
            session.rollback()
            raise
        finally:
            session.close()

db_router = Router()

# 使用示例
with db_router.get_session(read_only=True) as session:
    heroes = session.exec(select(Hero)).all()

10.3 异步支持

SQLModel兼容异步IO,与FastAPI的异步端点完美配合:

from sqlmodel.ext.asyncio.session import AsyncSession
from sqlmodel import select

async def get_heroes_by_team(team_id: int):
    async with AsyncSession(engine) as session:
        result = await session.exec(
            select(Hero).where(Hero.team_id == team_id)
        )
        return result.all()

异步配置要点:

  1. 使用async驱动:如asyncmy或asyncpg
  2. 连接池管理:注意异步连接池配置
  3. 事务处理:使用async with管理会话

11. 安全最佳实践

11.1 数据验证深度防御

from pydantic import BaseModel, constr, conint

class HeroCreate(BaseModel):
    name: constr(max_length=100, strip_whitespace=True)
    secret_identity: constr(min_length=2)
    power_level: conint(ge=1, le=10)
    team_id: int | None = None

@app.post("/heroes/")
def create_hero(hero: HeroCreate):
    # 输入数据已通过Pydantic验证
    db_hero = Hero(**hero.dict())
    # ...保存到数据库...

11.2 SQL注入防护

SQLModel自动处理参数化查询,但需注意:

  1. 避免直接拼接SQL:即使是原生SQL也要使用参数
  2. 权限最小化:数据库账号仅授予必要权限
  3. 敏感数据加密:如真实身份信息应加密存储

11.3 审计日志实现

记录关键数据变更:

from sqlalchemy import event
from datetime import datetime

@event.listens_for(Hero, "after_update")
def hero_updated_listener(mapper, connection, target):
    changes = {}
    for attr in inspect(target).attrs:
        hist = attr.history
        if hist.has_changes():
            changes[attr.key] = {
                "old": hist.deleted[0] if hist.deleted else None,
                "new": hist.added[0] if hist.added else None
            }
    
    if changes:
        audit_log = AuditLog(
            table_name="hero",
            record_id=target.id,
            action="update",
            changes=changes,
            changed_at=datetime.now()
        )
        connection.execute(audit_log.__table__.insert(), audit_log.dict())

12. 疑难问题解决方案

12.1 N+1查询问题

典型场景:获取团队及其所有英雄信息

问题代码:

teams = session.exec(select(Team)).all()
for team in teams:
    print(team.name)
    for hero in team.heroes:  # 每次循环产生一次查询
        print(f"- {hero.name}")

优化方案:

from sqlalchemy.orm import joinedload

teams = session.exec(
    select(Team).options(joinedload(Team.heroes))
).unique().all()

12.2 批量更新性能优化

低效方式:

for hero in session.exec(select(Hero)):
    hero.power_level += 1
    session.add(hero)
session.commit()

高效方式:

session.exec(
    update(Hero).values(power_level=Hero.power_level + 1)
)
session.commit()

12.3 复杂事务处理

跨模型原子操作示例:

from sqlalchemy import update

def promote_hero(hero_id: int, new_level: int):
    with session.begin():
        # 更新英雄等级
        session.exec(
            update(Hero)
            .where(Hero.id == hero_id)
            .values(power_level=new_level)
        )
        
        # 记录晋升历史
        promotion = PromotionLog(
            hero_id=hero_id,
            old_level=current_level,
            new_level=new_level
        )
        session.add(promotion)

13. 项目扩展思路

13.1 数据分析扩展

利用SQLModel模型快速构建数据分析功能:

from sqlalchemy import func

def team_power_stats():
    with Session(engine) as session:
        return session.exec(
            select(
                Team.name,
                func.count(Hero.id).label("hero_count"),
                func.avg(Hero.power_level).label("avg_power")
            )
            .join(Hero)
            .group_by(Team.id)
        ).all()

13.2 实时功能集成

使用WebSocket推送数据变更:

from fastapi import WebSocket
from sqlalchemy import event

active_connections: list[WebSocket] = []

@event.listens_for(Hero, "after_insert")
def hero_created_listener(mapper, connection, target):
    for connection in active_connections:
        connection.send_json({
            "event": "hero_created",
            "data": target.dict()
        })

@app.websocket("/updates")
async def updates_websocket(websocket: WebSocket):
    await websocket.accept()
    active_connections.append(websocket)
    try:
        while True:
            await websocket.receive_text()  # 保持连接
    finally:
        active_connections.remove(websocket)

13.3 微服务拆分策略

当系统规模扩大时,可考虑按领域拆分:

  1. 英雄服务:核心CRUD功能
  2. 团队服务:团队管理与分析
  3. 任务服务:英雄任务分配系统

各服务通过REST或gRPC通信,共享数据库或各自维护数据副本。

14. 持续集成与交付

14.1 CI流水线配置

GitHub Actions示例:

name: CI Pipeline

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          MYSQL_ROOT_PASSWORD: root
          MYSQL_DATABASE: test_db
        ports:
          - 3306:3306
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-python@v2
      - run: pip install -r requirements.txt
      - run: pytest --cov=.

14.2 代码质量门禁

集成pre-commit钩子:

repos:
- repo: https://github.com/psf/black
  rev: 22.3.0
  hooks:
    - id: black
- repo: https://github.com/PyCQA/flake8
  rev: 4.0.1
  hooks:
    - id: flake8

14.3 部署策略选择

根据场景选择合适策略:

策略适用场景优势风险
蓝绿部署关键业务系统零停机资源消耗大
金丝雀发布渐进式更新风险可控流量分配复杂
滚动更新常规服务资源高效版本共存期长

15. 项目文档自动化

15.1 API文档生成

FastAPI自动生成OpenAPI文档:

app = FastAPI(
    title="Hero Management API",
    description="Manage your superhero team with this powerful API",
    version="1.0.0",
    openapi_tags=[{
        "name": "heroes",
        "description": "Operations with hero entities"
    }]
)

访问/docs即可获得交互式文档。

15.2 数据库文档工具

使用sqlacodegen生成模型文档:

pip install sqlacodegen
sqlacodegen mysql://user:pass@localhost/dbname --outfile models.py

15.3 项目知识库

建议文档结构:

docs/
├── ARCHITECTURE.md
├── API_REFERENCE.md
├── DEVELOPMENT.md
└── OPERATION.md

使用mkdocs等工具构建可搜索文档网站。

JavaScript实现量化交易策略(附完整源码) 阅读详情

相关推荐

Nvidia AGX Xavier刷机指北

因为工作的关系,要在AGX上安装CUDA。nvidia官网上没找到适合AGX版本的CUDA,只能走刷机的路子。刷机过程中,也遇到一些坑,做个记录。 需要有一台ubuntu系统的电脑作为主机Host。我的主机系统为Ubuntu18.04 整个刷机过程为: 在Host上安装sdkmanager,整个刷机过程主要通过sdkmanager来操作。 在Host自动下载一些系统组件,各种deb包 Host上制作OS系统镜像,烧录到AGX中 Host上之前下载好的deb包,安装到AGX中。 完结,撒花 ...

sinat_38685124的博客 6292

Python类的定义和使用

优秀是一种属性,只要我们这类努力学习的人才能调用,带大家一起学习类的定义与使用(一起努力,咱们顶峰相见)

精益求精,永无止境,永远在路上! 11万+

从MATLAB到版图:手把手复现一篇16位1MSPS SAR ADC的完整设计流程(含Cadence与Verilog代码)

本文详细介绍了16位1MSPS SAR ADC的完整设计流程,从MATLAB行为级建模到Cadence电路实现,再到Verilog数字逻辑编码和版图生成。重点讲解了高精度逐次逼近型模数转换器的关键技术,包括电容阵列建模、校准算法实现、FFT性能验证以及混合信号仿真等,为工程师提供了实用的工业级设计指南。

weixin_28703507的博客 301

python类--定义及使用(类的属性及方法)

python类的基础知识:类定义(变量、方法)及使用(创建对象) 详细介绍了类的属性、实例属性、类方法、静态方法、实例方法; 详细介绍了类的三大特性:封装、继承、多态

weixin_42639395的博客 3万+

相机光学(三十八)——VCM(Voice Coil Motor)音圈马达

VCM(Voice Coil Motor)音圈马达全称Voice Coil Montor,电子学里面的音圈电机,是马达的一种。因为原理和扬声器类似,所以叫音圈电机,具有高频响、高精度的特点。其主要原理是在一个永久磁场内,通过改变马达内线圈的直流电流大小,来控制弹簧片的拉伸位置,从而带动上下运动。手机摄像头广泛的使用VCM实现自动对焦功能,通过VCM可以调节镜头的位置,呈现清晰的图像。弹片式结构滚珠式结构摩擦式结构Open loop开马达Close loop闭环马达。

图像学习之旅 7216

手把手教你用Cadence Virtuoso仿真一个5GHz CMOS分频器:从原理图到后仿,避开那些教科书上没写的坑

本文详细介绍了在Cadence Virtuoso环境中设计5GHz CMOS分频器的完整流程,从原理图设计到后仿真优化,特别关注实际工程中容易被忽视的关键问题。内容涵盖分频器核心指标解析、锁存器拓扑选择、接口设计匹配以及后仿真优化策略,为射频集成电路设计提供实用避坑指南。

weixin_26934905的博客 262

【Python详解】Python类的详细定义与使用案例

【Python详解】Python类的详细定义与使用案例

努力才是唯一的入场券。 7万+

大厂面试:字节跳动大数据面试题及参考答案(10万字长文及多张原理图持续更新)

在 Spark 中,宽窄依赖是用来描述 RDD(弹性分布式数据集)之间的依赖关系的概念。窄依赖是指父 RDD 的每个分区最多被一个子 RDD 的分区使用,即子 RDD 的分区可以通过确定的规则从父 RDD 的分区计算得到,并且不需要跨节点进行数据传输。窄依赖通常可以在一个节点上进行计算,不需要进行数据的 shuffle 操作,因此性能较高。宽依赖是指父 RDD 的一个分区可能被多个子 RDD 的分区使用,即子 RDD 的分区需要通过跨节点的数据 shuffle 操作从父 RDD 的多个分区获取数据。

大模型大数据攻城狮的专栏 1650

(27)python类的定义和使用

面向对象初步 面向对象(Object oriented Programming,OOP)编程的思想主要是针对大型软件设计而来的。面向对象编程使程序的扩展性更强、可读性更好,使的编程可以像搭积木一样简单。 面向对象编程将数据和操作数据相关的方法封装到对象中,组织代码和数据的方式更加接近人的思维,从而大大提高了编程的效率。 Python 完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向...

欢迎来到关关雎鸠儿的博客 2万+

【SpringBoot 3.x 第43节】你还敢说 Spring 启动慢是“宿命”?Spring AOT 把启动剧本都提前写死了,你服不服?

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。

**My Coding Family** 539

ROCm rocr-libhsakmt分析系列9-3: queue的内核创建流程

KFD队列是用户空间与GPU通信的核心机制,通过多种队列类型(计算、DMA、调试等)实现命令流管理。核心数据结构包括描述队列属性的queue_properties、内核调度对象queue、进程级管理器process_queue_manager,以及跨进程设备的qcm_process_device等。这些结构通过ring buffer、doorbell机制和MQD硬件描述符协同工作,支持队列全生命周期管理、资源调度、异常处理和上下文保存/恢复功能。

图形/计算GPU的驱动与虚拟化技术分享园地 2121

Python类的使用总结

Python是一个面向对象的解释型语言,所以当然也有类的概念。 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。 之前接触类的概念是在学习C++时,现在学习了python后,觉得两者还是有很大的区别的。面向对象的思想是一样的,但是python做为更高级的语言,在类的定义与使用方便更加简便。类的定义Python中,定义

rotation博客 3万+

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2917

用 SQLModel + FastAPI 构建第一个 Hero Web API:从零搭建到生产运行完整实战

本指南基于 SQLModel 官方教程的 FastAPI 入门章节,带你从安装依赖开始,用同一份 SQLModel 模型同时充当 SQLAlchemy 数据库模型与 Pydantic API 请求/响应模型,搭建一个具备建表、创建英雄(POST /heroes/)、读取英雄(GET /heroes/)能力的完整 Web API。读完本文,你将掌握 `check_same_thread` 配置的来龙

gitblog_09557的博客 466

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

使用 DB Browser for SQLite 创建 SQLite 数据库与数据表:SQLModel 实战前置教程

本篇文章是 SQLModel 官方教程的入门第一章,讲解如何在**不写一行 Python 代码**的前提下,用图形化工具 **DB Browser for SQLite** 完成 SQLite 数据库的创建、`hero` 表结构的定义,以及如何直接编写原生 SQL 再次建表。读完本文,你将掌握 SQLite 数据库文件(`.db`)的创建流程、`CREATE TABLE` 语句的逐行语义、主键与

gitblog_00011的博客 446

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

使用SQLModel与FastAPI构建英雄团队管理API教程

在构建现代Web API时,开发者经常面临数据库模型与API数据模型重复定义的问题。SQLModel与FastAPI的组合完美解决了这一痛点,让你能够: - ???? 使用单一模型定义数据库表和API数据结构 - ✨ 自动获得类型提示、数据验证和序列化 - ???? 自动生成交互式API文档 - ???? 简化开发流程,减少代码重复 本文将带你从零开始构建一个完整的英雄团队管理API,涵盖模型定义、关系处...

gitblog_00659的博客 360

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SQLModel 教程:为关联表创建行数据——外键列、自动刷新与连接团队和英雄

本指南基于 SQLModel 官方教程「Create and Connect Rows」章节,讲解如何通过**外键列(foreign key column)** 在两个已连接的数据库表(`team` 与 `hero`)中创建行数据,并用外键把「英雄」关联到「团队」。读完本文你将掌握:如何在同一个 Session 中先创建并提交团队、如何通过已提交对象的 `id` 字段拿到数据库自动生成的主键、如何

gitblog_01161的博客 426

SQLModel 项目代码结构与多文件拆分:循环导入、TYPE_CHECKING 与 Python 包实战

在 SQLModel 项目中,当模型之间通过 `Relationship` 形成相互引用(如 `Hero` 引用 `Team`,而 `Team` 又通过反向关系引用 `Hero`)时,如何在**大型多文件项目**中组织代码、规避 Python 循环导入错误,是每个从单文件示例走向真实项目的开发者都会遇到的关卡。本篇基于 SQLModel 官方教程(见 [docs/tutorial/code-str

gitblog_00473的博客 962

SQLModel 教程:使用 Python ORM 更新数据库记录

SQLModel 教程:使用 Python ORM 更新数据库记录 【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. ...

gitblog_01032的博客 499

SQLModel 数据库入门:从数据库概念到 SQL 关系模型的完整指南

本指南基于 SQLModel 官方文档《Intro to Databases》整理,面向刚接触数据库的开发者:先讲清楚"数据库是什么、为什么需要数据库、程序如何与数据库交互",再深入 SQL 数据库的表、主键、外键、关系等核心概念,最后落到 SQLModel 如何用 Python 对象替你完成与 SQL 数据库的通信。读完你将理解关系型数据库的基本原理,并掌握 SQLModel 模型与数据库表、行

gitblog_00669的博客 395

SQLModel 与 FastAPI:用 Dependency 管理数据库 Session 的完整重构指南

本篇技术指南聚焦 SQLModel 官方教程中的关键一环:将每个 *path operation* 内显式编写的 `with Session(engine)` 代码块,重构为基于 FastAPI **Dependency(依赖注入)** 的统一会话管理方案。这是构建可测试、可扩展的 FastAPI + SQLModel Web API 的基础能力。读完本文,你将掌握如何编写带 `yield` 的会

gitblog_00256的博客 1022

SQLModel 教程:使用 join 和 where 进行关联查询

SQLModel 教程:使用 join 和 where 进行关联查询 【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. ...

gitblog_00470的博客 417

SQLModel 教程:使用 Python ORM 进行数据库插入操作

SQLModel 教程:使用 Python ORM 进行数据库插入操作 【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. ...

gitblog_00473的博客 463

SQLModel教程:使用Python ORM实现数据库删除操作详解

SQLModel教程:使用Python ORM实现数据库删除操作详解 【免费下载链接】sqlmodel SQL databases in Python, designed for simplicity, compatibility, and robustness. ...

gitblog_00611的博客 353

SQLModel 插入数据实战:使用 Session 完成 INSERT 写入

本教程是 SQLModel 官方教程中「创建行数据(Create Rows)」章节的完整实战讲解,围绕 `docs/tutorial/insert.md` 展开,带你从 SQL 层面的 `INSERT INTO` 语句出发,逐步过渡到使用 SQLModel 的模型实例与 `Session` 完成同样的数据写入。读完本文,你将掌握「内存对象」与「数据库记录」两种数据形态的区别,理解 `Session

gitblog_00953的博客 659
上一篇: 从机械到数字:EC11旋转编码器与ESP32的PWM控制艺术
下一篇: 从神经元到智能:多层感知机如何模拟人脑的学习过程
android
博客等级 码龄22年 47粉丝 1455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值