当前位置:首页>python>Python操作数据库还在写SQL?SQLAlchemy保姆级教程来了

Python操作数据库还在写SQL?SQLAlchemy保姆级教程来了

  • 2026-07-02 16:37:49
Python操作数据库还在写SQL?SQLAlchemy保姆级教程来了

前言

写 Python 的人几乎都要和数据库打交道。最原始的方式就是拼 SQL 字符串——cursor.execute("SELECT * FROM users WHERE id = " + user_id)——这种方式不仅容易出 SQL 注入漏洞,而且代码一多就乱成一团。如果你正在寻找一种更优雅、更安全的数据库操作方式,SQLAlchemy 就是 Python 生态里的标准答案。

这篇文章从零开始,带你一步步掌握 SQLAlchemy 2.0 的核心用法。不绕弯子,直接上手。


一、SQLAlchemy 是什么?为什么选它?

SQLAlchemy 是 Python 中最流行的 ORM(对象关系映射)框架。简单来说,它让你用 Python 对象来操作数据库,而不是写 SQL 语句。

ORM 做了什么?

你把数据库表想象成 Python 类,把表里的每一行想象成类的实例。插入数据就是创建一个对象,查询数据就是调用类的方法,删除数据就是删除对象——SQLAlchemy 在背后帮你把这些操作翻译成 SQL。

和同类工具比,SQLAlchemy 强在哪?

       
                                           
对比维度SQLAlchemyDjango ORMPeeweeTortoise ORM
学习曲线中等中等
功能完整度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
异步支持✅ 2.0+
类型提示✅ 2.0+部分
复杂查询极强一般一般一般
社区规模最大较小
适用场景全场景Django 项目小型项目异步项目
       
     

实际选型建议:

  • • 如果你用 Django 框架,Django ORM 够用,不用额外引入
  • • 如果你的项目需要复杂查询、多数据库、或者未来可能扩展,SQLAlchemy 是首选
  • • 如果你只是写个小脚本,Peewee 更轻量
  • • 如果你需要异步数据库操作,SQLAlchemy 2.0 和 Tortoise ORM 都可以

二、安装与环境搭建

# 安装 SQLAlchemy 2.0
pip install sqlalchemy

# 如果使用 MySQL,还需要安装驱动

pip install pymysql
# 或者

pip install mysqlclient

# 如果使用 PostgreSQL

pip install psycopg2-binary

# 如果使用异步

pip install sqlalchemy[asyncio]
pip install asyncpg  # PostgreSQL 异步驱动
pip install aiosqlite  # SQLite 异步驱动

验证安装:

import sqlalchemy
print
(sqlalchemy.__version__)  # 应该输出 2.0.x

三、第一个 SQLAlchemy 程序:5 分钟跑通

我们用一个实际场景来演示——一个用户管理系统,包含用户表和地址表。

3.1 定义数据模型

from typing import List, Optional
from
 sqlalchemy import create_engine, String, ForeignKey
from
 sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship

# 1. 定义基类

class
 Base(DeclarativeBase):
    pass


# 2. 定义用户表

class
 User(Base):
    __tablename__ = "user_account"
    
    id
: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))
    fullname: Mapped[Optional[str]] = mapped_column(String(100))
    age: Mapped[Optional[int]]
    
    # 一对多关系:一个用户可以有多个地址

    addresses: Mapped[List["Address"]] = relationship(
        back_populates="user", cascade="all, delete-orphan"
    )
    
    def
 __repr__(self):
        return
 f"User(id={self.id}, name='{self.name}', fullname='{self.fullname}')"

# 3. 定义地址表

class
 Address(Base):
    __tablename__ = "address"
    
    id
: Mapped[int] = mapped_column(primary_key=True)
    email_address: Mapped[str] = mapped_column(String(100))
    user_id: Mapped[int] = mapped_column(ForeignKey("user_account.id"))
    
    # 多对一关系:多个地址属于一个用户

    user: Mapped["User"] = relationship(back_populates="addresses")
    
    def
 __repr__(self):
        return
 f"Address(id={self.id}, email='{self.email_address}')"

关键点解读:

  • DeclarativeBase 是所有模型的基类,类似于 Django 的 models.Model
  • Mapped[int] 是类型注解,SQLAlchemy 2.0 的新特性,让 IDE 能正确提示类型
  • mapped_column() 定义数据库列的各种属性
  • relationship() 建立表之间的关联,back_populates 实现双向引用
  • cascade="all, delete-orphan" 表示删除用户时自动删除其所有地址

3.2 创建数据库连接

# SQLite(适合开发和测试)
engine = create_engine("sqlite:///myapp.db", echo=True)

# MySQL(生产环境常用)

# engine = create_engine(

#     "mysql+pymysql://username:password@localhost:3306/mydb",

#     echo=True

# )


# PostgreSQL

# engine = create_engine(

#     "postgresql+psycopg2://username:password@localhost:5432/mydb",

#     echo=True

# )


# 创建所有表

Base.metadata.create_all(engine)

echo=True 会打印所有生成的 SQL 语句,调试时非常有用,生产环境记得关掉。

3.3 插入数据

from sqlalchemy.orm import Session

with
 Session(engine) as session:
    # 创建用户和地址

    user1 = User(
        name="zhangsan",
        fullname="张三",
        age=28,
        addresses=[
            Address(email_address="zhangsan@example.com"),
            Address(email_address="zhangsan@work.com"),
        ]
    )
    user2 = User(
        name="lisi",
        fullname="李四",
        age=32,
        addresses=[
            Address(email_address="lisi@example.com"),
        ]
    )
    user3 = User(name="wangwu", fullname="王五", age=25)  # 没有地址的用户
    
    # 批量插入

    session.add_all([user1, user2, user3])
    session.commit()
    
    print
(f"插入成功!用户ID:{user1.id}, {user2.id}, {user3.id}")

3.4 查询数据

from sqlalchemy import select

with
 Session(engine) as session:
    # 查询所有用户

    stmt = select(User)
    users = session.scalars(stmt).all()
    print
(f"所有用户:{users}")
    
    # 条件查询

    stmt = select(User).where(User.name == "zhangsan")
    user = session.scalar(stmt)
    print
(f"查询结果:{user}")
    
    # 查询用户的地址

    print
(f"张三的地址:{user.addresses}")
    
    # IN 查询

    stmt = select(User).where(User.age.in_([28, 32]))
    users = session.scalars(stmt).all()
    print
(f"年龄28或32的用户:{users}")
    
    # 模糊查询

    stmt = select(User).where(User.fullname.like("张%"))
    users = session.scalars(stmt).all()
    print
(f"姓张的用户:{users}")

3.5 更新数据

with Session(engine) as session:
    # 查询要更新的用户

    stmt = select(User).where(User.name == "zhangsan")
    user = session.scalar(stmt)
    
    # 直接修改属性

    user.age = 29
    user.fullname = "张三丰"
    
    # 提交更新

    session.commit()
    print
(f"更新后:{user}")

3.6 删除数据

with Session(engine) as session:
    # 方式1:按主键查询后删除

    user = session.get(User, 1)  # 获取 id=1 的用户
    if
 user:
        session.delete(user)
        session.commit()
        print
("用户已删除")
    
    # 方式2:批量删除(SQLAlchemy 2.0 新语法)

    from
 sqlalchemy import delete
    
    stmt = delete(Address).where(Address.email_address.like("%test%"))
    session.execute(stmt)
    session.commit()

四、进阶用法:JOIN 查询与关联操作

4.1 基本 JOIN 查询

# 查询拥有某个邮箱的用户
stmt = (
    select(User)
    .join(Address)
    .where(Address.email_address == "zhangsan@example.com")
)
user = session.scalar(stmt)
print
(f"查询结果:{user}")

# 反向查询:通过用户查地址

stmt = (
    select(Address)
    .join(User)
    .where(User.name == "zhangsan")
)
addresses = session.scalars(stmt).all()
print
(f"张三的地址:{addresses}")

4.2 延迟加载 vs 立即加载

这是 SQLAlchemy 最容易踩坑的地方。默认情况下,user.addresses延迟加载的——只有你访问它的时候才会发 SQL 查询。如果循环中访问大量用户的地址,会产生 N+1 查询问题。

# ❌ 问题代码:N+1 查询
users = session.scalars(select(User)).all()
for
 user in users:
    print
(user.addresses)  # 每个用户都会发一次查询!

# ✅ 解决方案:使用 joinedload 立即加载

from
 sqlalchemy.orm import joinedload

stmt = select(User).options(joinedload(User.addresses))
users = session.scalars(stmt).all()
for
 user in users:
    print
(user.addresses)  # 不会再发额外查询

加载策略对比:

       
                                           
策略适用场景SQL 数量性能
延迟加载(默认)单个对象、偶尔访问关联N+1差(循环场景)
joinedload需要关联数据、一对多1(JOIN)
subqueryload一对多、数据量大2
selectinload多对多、数据量大2
       
     

4.3 聚合查询

from sqlalchemy import func

# 统计用户数量

count = session.scalar(select(func.count(User.id)))
print
(f"用户总数:{count}")

# 按年龄分组统计

stmt = select(User.age, func.count(User.id)).group_by(User.age)
results = session.execute(stmt).all()
print
(f"各年龄人数:{results}")

# 求平均年龄

avg_age = session.scalar(select(func.avg(User.age)))
print
(f"平均年龄:{avg_age}")

五、SQLAlchemy 2.0 的重大变化

如果你之前用过 1.x 版本,以下变化必须注意:

5.1 查询语法变化

# ❌ 1.x 旧语法(2.0 中已废弃)
session.query(User).filter(User.name == "zhangsan").all()

# ✅ 2.0 新语法(统一使用 select)

stmt = select(User).where(User.name == "zhangsan")
session.scalars(stmt).all()

5.2 删除操作变化

# ❌ 1.x 旧语法
session.query(Address).filter(Address.email.like("%test%")).delete()

# ✅ 2.0 新语法

from
 sqlalchemy import delete
stmt = delete(Address).where(Address.email.like("%test%"))
session.execute(stmt)

5.3 自动提交已移除

2.0 不再自动提交事务,必须显式调用 session.commit()。这是好事——避免了隐式提交导致的难以追踪的 bug。

5.4 类型注解支持

2.0 全面支持 PEP 484 类型注解,IDE 提示更准确:

class User(Base):
    id
: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(30))
    # IDE 现在能正确推断 user.name 是 str 类型

六、实战:FastAPI + SQLAlchemy 完整项目

下面是一个完整的 FastAPI + SQLAlchemy 项目结构,适合实际开发参考。

6.1 项目结构

myapp/
├── app/
│   ├── __init__.py
│   ├── main.py           # FastAPI 入口
│   ├── database.py       # 数据库配置
│   ├── models.py         # 数据模型
│   ├── schemas.py        # Pydantic 模型
│   └── routers/
│       └── users.py      # 用户路由
└── requirements.txt

6.2 数据库配置(database.py)

from sqlalchemy import create_engine
from
 sqlalchemy.orm import DeclarativeBase, sessionmaker

# 数据库 URL

SQLALCHEMY_DATABASE_URL = "sqlite:///./myapp.db"
# SQLALCHEMY_DATABASE_URL = "mysql+pymysql://root:password@localhost/mydb"


# 创建引擎

engine = create_engine(SQLALCHEMY_DATABASE_URL, echo=False)

# 创建 Session 工厂

SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 基类

class
 Base(DeclarativeBase):
    pass


# 依赖注入:获取数据库会话

def
 get_db():
    db = SessionLocal()
    try
:
        yield
 db
    finally
:
        db.close()

6.3 数据模型(models.py)

from sqlalchemy import String, Integer, DateTime, func
from
 sqlalchemy.orm import Mapped, mapped_column
from
 app.database import Base

class
 User(Base):
    __tablename__ = "users"
    
    id
: Mapped[int] = mapped_column(primary_key=True, index=True)
    name: Mapped[str] = mapped_column(String(50))
    email: Mapped[str] = mapped_column(String(100), unique=True, index=True)
    age: Mapped[int | None]
    created_at: Mapped[str] = mapped_column(
        default=func.now()
    )

6.4 Pydantic 模型(schemas.py)

from pydantic import BaseModel, EmailStr
from
 typing import Optional

class
 UserCreate(BaseModel):
    name: str
    email: EmailStr
    age: Optional[int] = None

class
 UserResponse(BaseModel):
    id
: int
    name: str
    email: str
    age: Optional[int]
    
    class
 Config:
        from_attributes = True  # 支持从 ORM 对象转换

6.5 路由(routers/users.py)

from fastapi import APIRouter, Depends, HTTPException
from
 sqlalchemy.orm import Session
from
 sqlalchemy import select
from
 app.database import get_db
from
 app import models, schemas

router = APIRouter(prefix="/users", tags=["users"])

# 获取所有用户

@router.get("/", response_model=list[schemas.UserResponse])

def
 get_users(skip: int = 0, limit: int = 10, db: Session = Depends(get_db)):
    stmt = select(models.User).offset(skip).limit(limit)
    return
 db.scalars(stmt).all()

# 创建用户

@router.post("/", response_model=schemas.UserResponse)

def
 create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    # 检查邮箱是否已存在

    stmt = select(models.User).where(models.User.email == user.email)
    existing = db.scalar(stmt)
    if
 existing:
        raise
 HTTPException(status_code=400, detail="邮箱已存在")
    
    # 创建新用户

    db_user = models.User(**user.model_dump())
    db.add(db_user)
    db.commit()
    db.refresh(db_user)
    return
 db_user

# 获取单个用户

@router.get("/{user_id}", response_model=schemas.UserResponse)

def
 get_user(user_id: int, db: Session = Depends(get_db)):
    user = db.get(models.User, user_id)
    if
 not user:
        raise
 HTTPException(status_code=404, detail="用户不存在")
    return
 user

# 更新用户

@router.put("/{user_id}", response_model=schemas.UserResponse)

def
 update_user(user_id: int, user_update: schemas.UserCreate, db: Session = Depends(get_db)):
    user = db.get(models.User, user_id)
    if
 not user:
        raise
 HTTPException(status_code=404, detail="用户不存在")
    
    for
 key, value in user_update.model_dump().items():
        setattr
(user, key, value)
    
    db.commit()
    db.refresh(user)
    return
 user

# 删除用户

@router.delete("/{user_id}")

def
 delete_user(user_id: int, db: Session = Depends(get_db)):
    user = db.get(models.User, user_id)
    if
 not user:
        raise
 HTTPException(status_code=404, detail="用户不存在")
    
    db.delete(user)
    db.commit()
    return
 {"message": "用户已删除"}

七、避坑指南:新手最常犯的 5 个错误

7.1 忘记 commit

# ❌ 错误:数据不会保存
session.add(user)
# 没有 commit


# ✅ 正确

session.add(user)
session.commit()

7.2 在循环中触发 N+1 查询

# ❌ 错误:每个用户都会触发一次查询
users = session.scalars(select(User)).all()
for
 user in users:
    print
(len(user.addresses))  # N 次额外查询

# ✅ 正确:使用 joinedload

from
 sqlalchemy.orm import joinedload
stmt = select(User).options(joinedload(User.addresses))
users = session.scalars(stmt).all()

7.3 Session 不关闭导致连接泄漏

# ❌ 错误
session = Session(engine)
# ... 使用 session

# 忘记关闭


# ✅ 正确:使用 with 语句

with
 Session(engine) as session:
    # ... 使用 session

    pass
  # 自动关闭

7.4 混淆 scalar 和 scalars

# scalar:返回单个对象
user = session.scalar(select(User).where(User.id == 1))

# scalars:返回迭代器(多个对象)

users = session.scalars(select(User)).all()

7.5 主键冲突

# ❌ 错误:手动指定已存在的主键
user = User(id=1, name="test")  # id=1 已存在
session.add(user)
session.commit()  # 报错!

# ✅ 正确:让 SQLAlchemy 自动生成主键

user = User(name="test")
session.add(user)
session.commit()
print
(user.id)  # 自动生成

八、性能优化建议

8.1 连接池配置

from sqlalchemy import create_engine

engine = create_engine(
    "mysql+pymysql://user:pass@localhost/db"
,
    pool_size=10,          # 连接池大小
    max_overflow=20,       # 最大溢出连接数
    pool_recycle=3600,     # 连接回收时间(秒)
    pool_pre_ping=True,    # 连接前检查是否有效
)

8.2 使用批量操作

# ❌ 逐条插入(慢)
for
 data in large_dataset:
    user = User(**data)
    session.add(user)
session.commit()

# ✅ 批量插入(快)

session.bulk_save_objects([User(**data) for data in large_dataset])
session.commit()

# ✅ 或者使用 insert 语句(更快)

from
 sqlalchemy import insert
stmt = insert(User).values(large_dataset)
session.execute(stmt)
session.commit()

8.3 合理使用索引

class User(Base):
    __tablename__ = "users"
    
    id
: Mapped[int] = mapped_column(primary_key=True)
    name: Mapped[str] = mapped_column(String(50), index=True)  # 单列索引
    email: Mapped[str] = mapped_column(String(100), unique=True)  # 唯一索引

总结

SQLAlchemy 是 Python 数据库操作的瑞士军刀——从简单的 CRUD 到复杂的 JOIN、聚合、事务管理,它都能胜任。2.0 版本在类型注解、异步支持和 API 统一上做了大量改进,新手入门也更加友好。

核心要点回顾:

  1. 1. 用 select() 替代 query(),这是 2.0 的统一查询方式
  2. 2. 用 with Session() 管理会话,避免连接泄漏
  3. 3. 注意 N+1 查询问题,合理使用 joinedload
  4. 4. 生产环境用连接池,配置 pool_pre_ping=True
  5. 5. 批量操作用 bulk_save_objectsinsert,性能提升明显

下一篇预告: 我们将深入讲解 SQLAlchemy 的异步用法和 Alembic 数据库迁移工具,敬请期待。


互动时间

你在用 SQLAlchemy 的过程中遇到过哪些坑?或者有什么独门技巧?欢迎在评论区分享交流!如果觉得这篇文章对你有帮助,点个「在看」让更多人看到吧 🐾


本文基于 SQLAlchemy 2.0.39 编写,代码示例均可直接运行。如有疑问欢迎留言。

                 

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 06:41:04 HTTP/2.0 GET : https://f.mffb.com.cn/a/495124.html
  2. 运行时间 : 0.124620s [ 吞吐率:8.02req/s ] 内存消耗:4,771.25kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=fa672aaa9b7525cc80fdc669c79a4f0d
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000642s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000958s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000345s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000267s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000657s ]
  6. SELECT * FROM `set` [ RunTime:0.000234s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000678s ]
  8. SELECT * FROM `article` WHERE `id` = 495124 LIMIT 1 [ RunTime:0.005912s ]
  9. UPDATE `article` SET `lasttime` = 1783032064 WHERE `id` = 495124 [ RunTime:0.011925s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000465s ]
  11. SELECT * FROM `article` WHERE `id` < 495124 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000788s ]
  12. SELECT * FROM `article` WHERE `id` > 495124 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000642s ]
  13. SELECT * FROM `article` WHERE `id` < 495124 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000893s ]
  14. SELECT * FROM `article` WHERE `id` < 495124 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003741s ]
  15. SELECT * FROM `article` WHERE `id` < 495124 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.025214s ]
0.126185s