视图访问
视图是数据库中的预定义查询,对外表现为一张虚拟表。数据墙DBW 支持将视图作为实体公开,通过 REST 和 GraphQL 访问。视图的配置方式与表几乎相同,关键区别在于必须手动指定主键。
数据库支持
| 数据库 | 视图支持 |
|---|---|
| SQL Server | 支持 |
| PostgreSQL | 支持 |
| MySQL | 支持 |
配置视图
视图的配置有两点与表不同:source.type 设为 "view",且必须在 fields 中通过 primary-key: true 标记主键字段:
json
{
"BookDetail": {
"source": {
"type": "view",
"object": "dbo.vw_books_details"
},
"fields": [
{ "name": "id", "primary-key": true },
{ "name": "title" },
{ "name": "author_name" }
],
"permissions": [
{ "role": "anonymous", "actions": ["read"] }
]
}
}CLI 添加视图
bash
dab add BookDetail \
--source "dbo.vw_books_details" \
--source.type "view" \
--fields.name "id" \
--fields.primary-key "true" \
--permissions "anonymous:read"REST 访问
视图实体的 REST 端点与表实体完全相同:
bash
# 列表查询
curl http://localhost:5000/api/BookDetail
# 按主键查询
curl http://localhost:5000/api/BookDetail/id/42
# 筛选 + 排序 + 字段选择
curl "http://localhost:5000/api/BookDetail?\$filter=year%20ge%202000&\$orderby=title%20asc&\$select=id,title,authorName"
# 分页
curl "http://localhost:5000/api/BookDetail?\$first=20"GraphQL 访问
视图在 GraphQL 架构中显示为独立的类型,用法与表查询一致:
graphql
{
bookDetails {
items {
id
title
authorName
year
}
}
}按主键查询:
graphql
{
bookDetail_by_pk(id: 42) {
title
authorName
}
}筛选和排序:
graphql
{
bookDetails(
filter: { year: { gte: 2000 } }
orderBy: { title: ASC }
first: 20
) {
items { id title authorName year }
}
}主键的重要性
视图没有物理主键。如果没有在 fields 中指定 primary-key: true:
- REST 按主键查询(
GET /api/View/id/1)会返回 400 错误。 - GraphQL
view_by_pk查询会返回错误。
必须从视图的字段中选择一到多个能唯一标识每行的列作为主键。
可更新视图
如果数据库中的视图是可更新的(通常基于单表、没有聚合的简单视图),可以授予写权限:
json
{
"BookSimple": {
"source": {
"type": "view",
"object": "dbo.vw_books_simple"
},
"permissions": [
{
"role": "editor",
"actions": ["read", "create", "update"]
}
]
}
}可更新视图支持 POST(创建)、PUT/PATCH(更新)和 DELETE(删除),前提是底层数据库允许这些操作。
权限建议
| 视图类型 | 推荐权限 |
|---|---|
| 只读视图(聚合、多表 JOIN) | "actions": ["read"] |
| 可更新视图(单表简单视图) | 按需求添加 create、update、delete |
只读视图配置 create/update/delete 权限不会报错,但操作执行时会被数据库拒绝。
限制
| 限制 | 说明 |
|---|---|
| 必须指定主键 | 引擎无法自动推断视图的主键 |
| 不支持关系 | 视图实体不能配置 relationships |
| 数据库依赖 | 可更新性取决于底层数据库对视图的更新支持 |
除此之外,视图实体支持分页、筛选、排序、字段选择和缓存,与表实体的能力一致。
