SQLModel入门

SQLModel 系统性指南

目录

  1. 简介
    • 什么是 SQLModel?
    • 为什么使用 SQLModel?
  2. 安装
  3. 快速入门
    • 定义模型
    • 创建数据库和表
  4. 基本 CRUD 操作
    • 创建(Create)
    • 读取(Read)
    • 更新(Update)
    • 删除(Delete)
  5. 处理关系
    • 一对多关系
    • 多对多关系
  6. 高级功能
    • 异步支持
    • 自定义查询
    • 迁移(Migrations)
  7. 与 FastAPI 的集成
    • 依赖注入
    • 路由保护
  8. 性能优化与最佳实践
  9. 常见问题解答
  10. 参考资料

1. 简介

什么是 SQLModel?

SQLModel 是一个现代化的 Python 库,旨在简化与数据库的交互。它结合了 PydanticSQLAlchemy 的优势,使得定义数据模型、进行数据验证和与数据库交互变得更加直观和高效。SQLModel 由 Sebastián Ramírez(FastAPI 的创始人)开发,专为与 FastAPI 框架无缝集成而设计。

为什么使用 SQLModel?

  • 简洁性:通过结合 Pydantic 的数据验证和 SQLAlchemy 的 ORM 功能,SQLModel 使模型定义和数据库操作更加简洁。
  • 类型安全:充分利用 Python 的类型提示,增强代码的可读性和可靠性。
  • 与 FastAPI 无缝集成:优化了与 FastAPI 的集成,支持自动文档生成和依赖注入。
  • 灵活性:支持同步和异步操作,适应不同的性能需求。
  • 现代化设计:采用现代化的 Python 编码风格和最佳实践,提升开发体验。

2. 安装

首先,确保您已经安装了 Python 3.7 或更高版本。然后,使用 pip 安装 sqlmodel 包:

pip install sqlmodel

此外,根据您使用的数据库,还需要安装相应的数据库驱动。例如:

  • SQLite:无需额外安装驱动,Python 内置支持。

  • PostgreSQL

    pip install asyncpg
    
  • MySQL

    pip install pymysql
    

3. 快速入门

定义模型

使用 SQLModel 定义数据模型时,通常会继承自 SQLModel 并使用 table=True 参数指示这是一个数据库表。

from typing import Optional
from sqlmodel import SQLModel, Field
from datetime import datetimeclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: str = Field(index=True, nullable=False, unique=True)hashed_password: str = Field(nullable=False)is_active: bool = Field(default=True)created_at: datetime = Field(default_factory=datetime.utcnow)

创建数据库和表

使用 SQLAlchemy 的引擎和 SQLModel 的元数据来创建数据库和表。

from sqlmodel import SQLModel, create_engine
from models import User  # 假设上面的模型保存在 models.py 文件中DATABASE_URL = "sqlite:///./test.db"  # 或者使用其他数据库,如 PostgreSQL
engine = create_engine(DATABASE_URL, echo=True)def create_db_and_tables():SQLModel.metadata.create_all(engine)

在应用启动时调用 create_db_and_tables 来创建数据库表。


4. 基本 CRUD 操作

创建(Create)

向数据库中插入一条新记录。

from sqlmodel import Session, select
from models import User
from database import engine, create_db_and_tablesdef create_user(username: str, email: str, hashed_password: str) -> User:user = User(username=username, email=email, hashed_password=hashed_password)with Session(engine) as session:session.add(user)session.commit()session.refresh(user)return user

读取(Read)

从数据库中查询记录。

def get_user_by_id(user_id: int) -> Optional[User]:with Session(engine) as session:user = session.get(User, user_id)return userdef get_user_by_username(username: str) -> Optional[User]:with Session(engine) as session:statement = select(User).where(User.username == username)user = session.exec(statement).first()return user

更新(Update)

更新数据库中的记录。

def update_user_email(user_id: int, new_email: str) -> Optional[User]:with Session(engine) as session:user = session.get(User, user_id)if user:user.email = new_emailsession.add(user)session.commit()session.refresh(user)return userreturn None

删除(Delete)

从数据库中删除记录。

def delete_user(user_id: int) -> bool:with Session(engine) as session:user = session.get(User, user_id)if user:session.delete(user)session.commit()return Truereturn False

5. 处理关系

一对多关系

例如,一个用户可以有多条地址记录。

from typing import List, Optional
from sqlmodel import SQLModel, Field, Relationshipclass Address(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)street: strcity: struser_id: int = Field(foreign_key="user.id")user: Optional["User"] = Relationship(back_populates="addresses")class User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: str = Field(index=True, nullable=False, unique=True)hashed_password: str = Field(nullable=False)is_active: bool = Field(default=True)created_at: datetime = Field(default_factory=datetime.utcnow)addresses: List[Address] = Relationship(back_populates="user")

多对多关系

例如,用户和角色之间的多对多关系。

from typing import List, Optional
from sqlmodel import SQLModel, Field, Relationshipclass UserRoleLink(SQLModel, table=True):user_id: int = Field(foreign_key="user.id", primary_key=True)role_id: int = Field(foreign_key="role.id", primary_key=True)class Role(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)name: strusers: List["User"] = Relationship(back_populates="roles",link_model=UserRoleLink)class User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: str = Field(index=True, nullable=False, unique=True)hashed_password: str = Field(nullable=False)is_active: bool = Field(default=True)created_at: datetime = Field(default_factory=datetime.utcnow)roles: List[Role] = Relationship(back_populates="users",link_model=UserRoleLink)

6. 高级功能

异步支持

SQLModel 支持异步数据库操作,适用于需要高并发和高性能的应用。

首先,安装异步驱动(如 asyncpg 用于 PostgreSQL):

pip install asyncpg

然后,配置异步引擎和会话:

from sqlmodel import SQLModel, create_engine, select
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmaker
from models import User
from datetime import datetimeDATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
async_engine = create_async_engine(DATABASE_URL, echo=True)async_session = sessionmaker(async_engine, class_=AsyncSession, expire_on_commit=False
)async def init_db():async with async_engine.begin() as conn:await conn.run_sync(SQLModel.metadata.create_all)# 在应用启动时调用 init_db
import asyncio
asyncio.run(init_db())# 异步获取会话
async def get_async_session():async with async_session() as session:yield session# 异步 CRUD 操作示例
async def get_user_async(user_id: int) -> Optional[User]:async with async_session() as session:user = await session.get(User, user_id)return user

自定义查询

使用 SQLAlchemy 的强大查询功能,执行复杂的数据库操作。

from sqlmodel import Session, select, func
from models import Userdef count_users() -> int:with Session(engine) as session:statement = select(func.count(User.id))count = session.exec(statement).one()return countdef get_users_with_email_domain(domain: str) -> List[User]:with Session(engine) as session:statement = select(User).where(User.email.like(f"%@{domain}"))users = session.exec(statement).all()return users

迁移(Migrations)

虽然 SQLModel 本身不提供迁移工具,但它与 Alembic 完全兼容,可以使用 Alembic 进行数据库迁移。

安装 Alembic

pip install alembic

初始化 Alembic

alembic init alembic

配置 Alembic

编辑 alembic.ini,设置 sqlalchemy.url 为您的数据库 URL。

alembic/env.py 中,导入您的模型:

from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from sqlmodel import SQLModel
import sys
import os# 将项目路径添加到 sys.path
sys.path.append(os.path.dirname(os.path.dirname(__file__)))from models import User  # 导入您的模型# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config# Interpret the config file for Python logging.
# This line sets up loggers basically.
fileConfig(config.config_file_name)target_metadata = SQLModel.metadatadef run_migrations_offline():...# 保持默认配置def run_migrations_online():...# 保持默认配置if context.is_offline_mode():run_migrations_offline()
else:run_migrations_online()

创建迁移脚本

alembic revision --autogenerate -m "Initial migration"

应用迁移

alembic upgrade head

7. 与 FastAPI 的集成

依赖注入

利用 FastAPI 的依赖注入机制,将数据库会话注入到路由中。

from fastapi import FastAPI, Depends, HTTPException
from sqlmodel import Session, select
from models import User
from database import engine, get_sessionapp = FastAPI()@app.post("/users/", response_model=User)
def create_user(user: User, session: Session = Depends(get_session)):db_user = session.exec(select(User).where(User.username == user.username)).first()if db_user:raise HTTPException(status_code=400, detail="Username already exists")session.add(user)session.commit()session.refresh(user)return user@app.get("/users/{user_id}", response_model=User)
def read_user(user_id: int, session: Session = Depends(get_session)):user = session.get(User, user_id)if not user:raise HTTPException(status_code=404, detail="User not found")return user

路由保护

结合 JWT 进行身份验证,保护特定路由。

安装 fastapi-jwt-auth

pip install fastapi-jwt-auth

配置 JWT

from fastapi import FastAPI, Depends, HTTPException
from fastapi_jwt_auth import AuthJWT
from pydantic import BaseModel
from sqlmodel import Session, select
from models import User
from database import engine, get_sessionclass Settings(BaseModel):authjwt_secret_key: str = "your-secret-key"app = FastAPI()@AuthJWT.load_config
def get_config():return Settings()@app.post('/login')
def login(user: User, Authorize: AuthJWT = Depends()):# 验证用户凭证(此处省略具体验证逻辑)access_token = Authorize.create_access_token(subject=user.username)return {"access_token": access_token}@app.get('/protected')
def protected(Authorize: AuthJWT = Depends()):Authorize.jwt_required()current_user = Authorize.get_jwt_subject()return {"message": f"Hello, {current_user}"}

8. 性能优化与最佳实践

8.1 使用连接池

优化数据库连接,使用连接池以提高性能和资源利用率。

from sqlmodel import create_engineDATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, echo=True, pool_size=20, max_overflow=0)

8.2 异步操作

对于高并发应用,使用异步数据库操作。

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import sessionmakerDATABASE_URL = "postgresql+asyncpg://user:password@localhost/dbname"
async_engine = create_async_engine(DATABASE_URL, echo=True)
async_session = sessionmaker(async_engine, class_=AsyncSession, expire_on_commit=False
)

8.3 缓存

使用缓存机制(如 Redis)减少数据库查询,提高响应速度。

import redisredis_client = redis.Redis(host='localhost', port=6379, db=0)def get_user_cached(user_id: int) -> Optional[User]:cached_user = redis_client.get(f"user:{user_id}")if cached_user:return User.parse_raw(cached_user)with Session(engine) as session:user = session.get(User, user_id)if user:redis_client.set(f"user:{user_id}", user.json(), ex=3600)return user

8.4 索引优化

为常用查询字段添加索引,提高查询性能。

class User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: str = Field(index=True, nullable=False, unique=True)# 其他字段...

8.5 分页

对于大量数据查询,使用分页机制减少单次查询的数据量。

def get_users_paginated(skip: int = 0, limit: int = 10) -> List[User]:with Session(engine) as session:statement = select(User).offset(skip).limit(limit)users = session.exec(statement).all()return users

9. 常见问题解答

9.1 如何在 SQLModel 中使用外键?

在定义模型时,使用 Fieldforeign_key 参数指定外键。

class Address(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)street: strcity: struser_id: int = Field(foreign_key="user.id")user: Optional["User"] = Relationship(back_populates="addresses")

9.2 SQLModel 支持哪些数据库?

SQLModel 基于 SQLAlchemy,支持所有 SQLAlchemy 支持的数据库,包括:

  • SQLite
  • PostgreSQL
  • MySQL
  • SQL Server
  • Oracle
  • 以及其他数据库,通过相应的数据库驱动支持。

9.3 如何进行数据库迁移?

SQLModel 本身不提供迁移工具,但可以与 Alembic 配合使用进行数据库迁移。

安装 Alembic

pip install alembic

初始化 Alembic

alembic init alembic

配置 Alembic

编辑 alembic.ini,设置 sqlalchemy.url 为您的数据库 URL。

alembic/env.py 中,导入您的模型:

from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from sqlmodel import SQLModel
import sys
import os# 将项目路径添加到 sys.path
sys.path.append(os.path.dirname(os.path.dirname(__file__)))from models import User  # 导入您的模型config = context.configfileConfig(config.config_file_name)target_metadata = SQLModel.metadatadef run_migrations_offline():...def run_migrations_online():...if context.is_offline_mode():run_migrations_offline()
else:run_migrations_online()

创建迁移脚本

alembic revision --autogenerate -m "Initial migration"

应用迁移

alembic upgrade head

9.4 如何处理模型验证错误?

SQLModel 结合了 Pydantic 的数据验证功能,可以在模型定义中使用 Pydantic 的字段验证器。

from sqlmodel import SQLModel, Field
from pydantic import validator, EmailStrclass User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: EmailStr = Field(index=True, nullable=False, unique=True)hashed_password: str = Field(nullable=False)@validator('username')def username_must_not_be_empty(cls, v):if not v or not v.strip():raise ValueError('Username must not be empty')return v

10. 参考资料

  • SQLModel 官方文档:https://sqlmodel.tiangolo.com/
  • SQLAlchemy 官方文档:https://www.sqlalchemy.org/
  • FastAPI 官方文档:https://fastapi.tiangolo.com/
  • Alembic 官方文档:https://alembic.sqlalchemy.org/en/latest/
  • Real Python 的 SQLModel 教程:https://realpython.com/sqlmodel-python-orm/
  • Pydantic 官方文档:https://pydantic-docs.helpmanual.io/
  • GitHub 上的 SQLModel 仓库:https://github.com/tiangolo/sqlmodel

附录:完整示例

以下是一个完整的 FastAPI 应用示例,展示了如何使用 SQLModel 进行数据库操作和 API 构建。

目录结构

my_fastapi_app/
├── main.py
├── models.py
├── database.py
├── schemas.py
└── alembic/├── env.py├── script.py.mako└── versions/

models.py

from typing import List, Optional
from sqlmodel import SQLModel, Field, Relationship
from datetime import datetimeclass Address(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)street: strcity: struser_id: int = Field(foreign_key="user.id")user: Optional["User"] = Relationship(back_populates="addresses")class User(SQLModel, table=True):id: Optional[int] = Field(default=None, primary_key=True)username: str = Field(index=True, nullable=False, unique=True)email: str = Field(index=True, nullable=False, unique=True)hashed_password: str = Field(nullable=False)is_active: bool = Field(default=True)created_at: datetime = Field(default_factory=datetime.utcnow)addresses: List[Address] = Relationship(back_populates="user")

schemas.py

from typing import List, Optional
from pydantic import BaseModel, EmailStr
from datetime import datetimeclass AddressCreate(BaseModel):street: strcity: strclass AddressRead(BaseModel):id: intstreet: strcity: strclass Config:orm_mode = Trueclass UserCreate(BaseModel):username: stremail: EmailStrpassword: strclass UserRead(BaseModel):id: intusername: stremail: EmailStris_active: boolcreated_at: datetimeaddresses: List[AddressRead] = []class Config:orm_mode = True

database.py

from sqlmodel import SQLModel, create_engine, Session
from models import User, AddressDATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL, echo=True)def create_db_and_tables():SQLModel.metadata.create_all(engine)def get_session():with Session(engine) as session:yield session

main.py

from fastapi import FastAPI, Depends, HTTPException
from sqlmodel import Session, select
from models import User, Address
from schemas import UserCreate, UserRead, AddressCreate, AddressRead
from database import create_db_and_tables, get_session
from typing import Listapp = FastAPI()@app.on_event("startup")
def on_startup():create_db_and_tables()@app.post("/users/", response_model=UserRead)
def create_user(user: UserCreate, session: Session = Depends(get_session)):db_user = session.exec(select(User).where(User.username == user.username)).first()if db_user:raise HTTPException(status_code=400, detail="Username already exists")new_user = User(username=user.username,email=user.email,hashed_password=user.password  # 实际项目中应进行哈希处理)session.add(new_user)session.commit()session.refresh(new_user)return new_user@app.get("/users/{user_id}", response_model=UserRead)
def read_user(user_id: int, session: Session = Depends(get_session)):user = session.get(User, user_id)if not user:raise HTTPException(status_code=404, detail="User not found")return user@app.post("/users/{user_id}/addresses/", response_model=AddressRead)
def create_address(user_id: int, address: AddressCreate, session: Session = Depends(get_session)):user = session.get(User, user_id)if not user:raise HTTPException(status_code=404, detail="User not found")new_address = Address(**address.dict(), user_id=user_id)session.add(new_address)session.commit()session.refresh(new_address)return new_address@app.get("/users/{user_id}/addresses/", response_model=List[AddressRead])
def read_addresses(user_id: int, session: Session = Depends(get_session)):user = session.get(User, user_id)if not user:raise HTTPException(status_code=404, detail="User not found")return user.addresses

运行应用

使用 uvicorn 运行 FastAPI 应用:

uvicorn main:app --reload

访问 http://127.0.0.1:8000/docs 查看自动生成的 API 文档,并进行测试。


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【案例学习】如何使用Minitab实现包装过程的自动化和改进

Masimo 是一家全球性的医疗技术公司,致力于开发和生产各种行业领先的监控技术,包括创新的测量、传感器和患者监护仪。在 Masimo Hospital Automation 平台的助力下,Masimo 的连接、自动化、远程医疗和远程监控解决方案正在改善医院内外的护理…

【C语言】结构体、联合体、枚举类型的字节大小详解

在C语言中,结构体(struct)和联合体(union) 是常用的复合数据类型,它们的内存布局和字节大小直接影响程序的性能和内存使用。下面为大家详细解释它们的字节大小计算方法,包括对齐规则、内存分配方…

中科亿海微SoM模组——波控处理软硬一体解决方案

本文介绍的波控处理软硬一体解决方案主要是面向相控阵天线控制领域,波控处理通过控制不同天线组件的幅相来调整天线波束的方向和增益,实现高精度角度控制和高增益。本方案由波控处理板、波控处理控制软件算法和上位机软件共同构成。波控处理SoM模组原型样…

Java设计模式 —— 【创建型模式】工厂模式(简单工厂、工厂方法模式、抽象工厂)详解

文章目录 前言一、简单工厂(静态工厂)1、概述2、代码实现3、优缺点 二、工厂方法模式1、概述2、代码实现3、优缺点 三、抽象工厂模式1、概述2、代码实现3、优缺点 四、总结 前言 先看个案例:【手机和手机店】在没有工厂的时候,手…

【阅读记录-章节4】Build a Large Language Model (From Scratch)

文章目录 4. Implementing a GPT model from scratch to generate text4.1 Coding an LLM architecture4.1.1 配置小型 GPT-2 模型4.1.2 DummyGPTModel代码示例4.1.3 准备输入数据并初始化 GPT 模型4.1.4 初始化并运行 GPT 模型 4.2 Normalizing activations with layer normal…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框,点左边的“Expert”(专家),然后找到“IdleTimeout”,将数值设置为0,点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络

遗传算法与深度学习实战(25)——使用Keras构建卷积神经网络 0. 前言1. 卷积神经网络基本概念1.1 卷积1.2 步幅1.3 填充1.4 激活函数1.5 池化 2. 使用 Keras 构建卷积神经网络3. CNN 层的问题4. 模型泛化小结系列链接 0. 前言 卷积神经网络 (Convolution…

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用,并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…

快速理解倒排索引在ElasticSearch中的作用

一.基础概念 定义: 倒排索引是一种数据结构,用来加速文本数据的搜索和检索,和传统的索引方式不同,倒排索引会被每个词汇项与包含该词汇项的文档关联起来,从而去实现快速的全文检索。 举例: 在传统的全文…

跨平台应用开发框架(3)-----Qt(样式篇)

目录 1.QSS 1.基本语法 2.QSS设置方式 1.指定控件样式设置 2.全局样式设置 1.样式的层叠特性 2.样式的优先级 3.从文件加载样式表 4.使用Qt Designer编辑样式 3.选择器 1.类型选择器 2.id选择器 3.并集选择器 4.子控件选择器 5.伪类选择器 4.样式属性 1.盒模型 …

Pump Science平台深度剖析:兴起、优势、影响与未来

在过去的几个月里,人们越来越关注去中心化科学(DeSci)。DeSci 是一种利用区块链技术进行科学研究的新方法。传统的科学研究经常面临所谓的“死亡之谷”,这指的是基础科学研究与成功开发和造福患者的实施之间的重要时期。DeSci 旨在…

网安瞭望台第4期:nuclei最新poc分享

国内外要闻 多款 D-Link 停产路由器漏洞:攻击者可远程执行代码 近日,知名网络硬件制造商 D-Link 发布重要安全公告。由于存在严重的远程代码执行(RCE)漏洞,其敦促用户淘汰并更换多款已停产的 VPN 路由器型号。 此次…

TDengine在debian安装

参考官网文档&#xff1a; 官网安装文档链接 从列表中下载获得 Deb 安装包&#xff1b; TDengine-server-3.3.4.3-Linux-x64.deb (61 M) 进入到安装包所在目录&#xff0c;执行如下的安装命令&#xff1a; sudo dpkg -i TDengine-server-<version>-Linux-x64.debNOTE 当…

Mybatis集成篇(一)

Spring 框架集成Mybatis 目前主流Spring框架体系中&#xff0c;可以集成很多第三方框架&#xff0c;方便开发者利用Spring框架机制使用第三方框架的功能。就例如本篇Spring集成Mybatis 简单集成案例&#xff1a; Config配置&#xff1a; Configuration MapperScan(basePack…

k8s Init:ImagePullBackOff 的解决方法

kubectl describe po (pod名字) -n kube-system 可查看pod所在的节点信息 例如&#xff1a; kubectl describe po calico-node-2lcxx -n kube-system 执行拉取前先把用到的节点的源换了 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"re…

nginx+php压测及报错优化

测试环境&#xff1a;虚拟机centos7&#xff0c;nginxphp 压测工具&#xff1a;Apipost 访问的php程序中添加sleep()增加程序执行时长&#xff0c;使用Apipost进行压测&#xff0c;根据服务器配置设置一个大概可能触发报错的并发和轮训次数&#xff0c;若无报错逐渐增加并发和…

【数据结构】ArrayList与顺序表

ArrayList与顺序表 1.线性表2.顺序表2.1 接口的实现 3. ArrayList简介4. ArrayList使用4.2 ArrayList常见操作4.3 ArrayList的遍历4.4 ArrayList的扩容机制 5. ArrayList的具体使用5.1 杨辉三角5.2 简单的洗牌算法 6. ArrayList的问题及思考 【本节目标】 线性表顺序表ArrayLis…

GaussDB高智能--智能优化器介绍

书接上文库内AI引擎&#xff1a;模型管理&数据集管理&#xff0c;从模型管理与数据集管理两方面介绍了GaussDB库内AI引擎&#xff0c;本篇将从智能优化器方面解读GaussDB高智能技术。 4 智能优化器 随着数据库与AI技术结合的越来越紧密&#xff0c;相关技术在学术界的数…

GDPU Android移动应用 数据存储

又是学到了数据持久化。 登录界面 题外话&#xff1a;有无动画大佬带带呀&#xff0c;前端移动端可免( •̀ .̫ •́ )&#xff0c;合作可私信哦。 1.用户登陆和“记住我”功能 该内容拥有两个Activity活动视图&#xff1a; &#xff08;1&#xff09;LoginActivity&#x…

麒麟性能评估优化

cpu性能 Vmstat输出结果详解如下: r 列表示运行和等待cpu时间片的进程数,这个值如果长期大于系统CPU的个数,说 明CPU不足,需要增加CPU; b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等; us 列显示了用户进程消耗的CPU 时间百分比。us的值比较高时,说明用…