Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/advanced/filter.md
Original file line number Diff line number Diff line change
Expand Up @@ -286,5 +286,5 @@ recent_users = await user_crud.select_models(

## 下一步

- [关系查询](../relationships/overview.md) - 学习表关系处理
- [关系查询](relationship.md) - 学习表关系处理
- [事务控制](transaction.md) - 掌握事务管理
114 changes: 4 additions & 110 deletions docs/relationships/overview.md → docs/advanced/relationship.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@ SQLAlchemy CRUD Plus 提供强大的关系查询功能,支持 ORM 关系预加
- **join_conditions** - JOIN 条件控制(支持有无 relationship)
- **load_options** - 原生 SQLAlchemy 选项

## 两种关联方式

### ORM 关系(有 relationship)
## ORM 关系(有 relationship)

使用 SQLAlchemy 的 `relationship` 定义关系,适合标准的外键关联。

Expand Down Expand Up @@ -53,7 +51,7 @@ users = await user_crud.select_models(
)
```

### 纯逻辑关联(无 relationship)
## 纯逻辑关联(无 relationship)

不定义 `relationship`,在查询时通过 `JoinConfig` 动态关联。适合无外键约束的场景。

Expand Down Expand Up @@ -324,110 +322,6 @@ users = await user_crud.select_models(
- **需要关联表数据**:使用 `fill_result=True`
- **复杂查询/自定义字段**:使用原生 `select()`

#### 获取关联表数据

**重要**:使用 `join_conditions` 的目的是获取多个表的数据,而不只是主表数据。

```python
from sqlalchemy import select

# 方式1:使用原生 select 获取多表数据
stmt = select(User, Post).join(
Post, User.id == Post.author_id
)
result = await session.execute(stmt)
for user, post in result.all():
print(f"{user.name}: {post.title}")

# 方式2:使用 JoinConfig + fill_result
results = await user_crud.select_models(
session,
join_conditions=[
JoinConfig(
model=Post,
join_on=User.id == Post.author_id,
join_type='left',
fill_result=True # 包含关联表数据
)
]
)
for user, post in results:
print(f"{user.name}: {post.title if post else 'No post'}")

# 方式3:构建字典结果(推荐用于 API 返回)
stmt = select(User.name, User.email, Post.title, Post.created_at).join(
Post, User.id == Post.author_id
)
result = await session.execute(stmt)
data = [
{
'user_name': row.name,
'user_email': row.email,
'post_title': row.title,
'post_created': row.created_at
}
for row in result.all()
]
```

#### 实际应用示例

```python
# 查询用户和文章数据
async def get_users_with_posts(session: AsyncSession):
stmt = select(User, Post).join(
Post,
User.id == Post.author_id,
isouter=True
).where(User.is_active == True)

result = await session.execute(stmt)
rows = result.all()

# 组织数据
user_posts = {}
for user, post in rows:
if user.id not in user_posts:
user_posts[user.id] = {
'user': user,
'posts': []
}
if post:
user_posts[user.id]['posts'].append(post)

return list(user_posts.values())


# 查询多表数据用于 API
async def get_post_list_api(session: AsyncSession, page: int = 1):
stmt = (
select(
Post.id,
Post.title,
Post.created_at,
User.name.label('author_name'),
Category.name.label('category_name')
)
.join(User, Post.author_id == User.id)
.join(Category, Post.category_id == Category.id, isouter=True)
.where(Post.is_published == True)
.limit(20)
.offset((page - 1) * 20)
)

result = await session.execute(stmt)
return [
{
'id': row.id,
'title': row.title,
'created_at': row.created_at,
'author': row.author_name,
'category': row.category_name
}
for row in result.all()
]
```

### JOIN 类型说明

| 类型 | 说明 | 使用场景 |
Expand Down Expand Up @@ -657,6 +551,6 @@ user = await user_crud.select_model(

## 相关资源

- [过滤条件](../advanced/filter.md) - 高级过滤技术
- [事务控制](../advanced/transaction.md) - 事务管理
- [过滤条件](filter.md) - 高级过滤技术
- [事务控制](transaction.md) - 事务管理
- [API 参考](../api/crud-plus.md) - 完整 API 文档
2 changes: 1 addition & 1 deletion docs/advanced/transaction.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,6 @@ async def bulk_process_with_savepoints(session: AsyncSession, items: list):

## 下一步

- [关系查询](../relationships/overview.md) - 学习关系查询和 JOIN
- [关系查询](relationship.md) - 学习关系查询和 JOIN
- [过滤条件](filter.md) - 高级过滤技术
- [API 参考](../api/crud-plus.md) - 完整 API 文档
2 changes: 1 addition & 1 deletion docs/getting-started/quick-start.md
Original file line number Diff line number Diff line change
Expand Up @@ -376,5 +376,5 @@ if __name__ == "__main__":

- [基础用法](../usage/crud.md) - 详细的 CRUD 操作
- [过滤条件](../advanced/filter.md) - 过滤操作符详解
- [关系查询](../relationships/overview.md) - 关系查询详解
- [关系查询](../advanced/relationship.md) - 关系查询详解
- [事务控制](../advanced/transaction.md) - 事务管理
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,6 @@ users = await user_crud.select_models(
- [快速开始](getting-started/quick-start.md) - 基础用法示例
- [基础 CRUD](usage/crud.md) - 增删改查操作详解
- [过滤条件](advanced/filter.md) - 查询过滤操作符
- [关系查询](relationships/overview.md) - 预加载和 JOIN 查询
- [关系查询](advanced/relationship.md) - 预加载和 JOIN 查询
- [事务控制](advanced/transaction.md) - 事务管理
- [API 参考](api/crud-plus.md) - 完整 API 文档
2 changes: 1 addition & 1 deletion docs/usage/crud.md
Original file line number Diff line number Diff line change
Expand Up @@ -339,5 +339,5 @@ async def batch_update_same_data(session: AsyncSession, update_data: dict, **fil
## 下一步

- [过滤条件](../advanced/filter.md) - 学习过滤操作符
- [关系查询](../relationships/overview.md) - 处理表关系
- [关系查询](../advanced/relationship.md) - 处理表关系
- [事务控制](../advanced/transaction.md) - 深入事务管理
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ nav:
- CRUD 操作: usage/crud.md
- 高级用法:
- 过滤条件: advanced/filter.md
- 关系查询: relationships/overview.md
- 关系查询: advanced/relationship.md
- 事务控制: advanced/transaction.md
- API 参考: api/crud-plus.md
- 更新日志: changelog.md
Expand Down