安全扫描
OpenClaw
安全
high confidence本技能为使用 tkms AsyncSqlSessionTemplate 编写 DAO 层 SQL 的指南,内容一致,无需额外权限、安装或凭证请求。
评估建议
本技能为编码/风格指南,逻辑清晰。使用前请确保:(1) 运行环境有 tkms 库和配置好的 AsyncSqlSessionTemplate;(2) 不给非受信任代理生产数据库凭证;(3) 审查生成的 SQL;(4) 有备份/事务机制;(5) 若需连接数据库,优先使用短期凭证或中间服务。...详细分析 ▾
✓ 用途与能力
名称/描述与内容匹配:SKILL.md 为 AsyncSqlSessionTemplate 提供了模式和示例(插入/更新/查询/计数)以及 MySQL 表约定,不请求无关访问或工具。
ℹ 指令范围
指令范围为写 DAO 代码,包括使用会话对象和参数化 SQL 的具体示例。注意:文档假设运行环境中已有 tkms 库和 AsyncSqlSessionTemplate 会话对象(无安装或连接指令),但不指示读取无关文件、环境变量或向外部端点传输数据。
✓ 安装机制
无安装规格或下载 — 仅指令技能,因此安装时不写入磁盘或获取内容。
✓ 凭证需求
不请求环境变量、凭证或配置路径。内容讨论数据库操作但不要求数据库凭证或其他秘密。
✓ 持久化与权限
always 为 false,本技能可由用户调用,允许正常的自动调用(平台默认)。不请求持久系统更改或修改其他技能的配置。
安全有层次,运行前请审查代码。
运行时依赖
无特殊依赖
版本
latestv1.0.02026/3/17
● 无害
安装命令 点击复制
官方npx clawhub@latest install gi-database-query-patterns
镜像加速npx clawhub@latest install gi-database-query-patterns --registry https://cn.clawhub-mirror.com
技能文档
使用 tkms 的 AsyncSqlSessionTemplate 进行数据库操作。适用于 app/dao 层,MySQL 8.0,UTF8 字符集。
何时使用
- 用户请求「写 dao」「写数据库操作」「查表」
- 实现 app/dao 下的数据访问逻辑
- 设计表结构、索引、SQL 语句
核心 API
from tkms.database.async_template import AsyncSqlSessionTemplate
# 插入
await session.insert(table="t_user", params=entity, primary_key="tid")
# 更新
await session.update(table="t_user", params=entity, primary_key="tid")
# 查询单条
row = await session.query_one("SELECT FROM t_user WHERE id = :id", {"id": user_id})
# 查询列表
rows = await session.query_list("SELECT FROM t_user WHERE status = :status", {"status": 1})
操作规范
1. 插入
async def add_user(self, user: UserEntity):
await self.session.insert(table="t_user", params=user, primary_key="tid")
params:实体或字典,字段名与表列对应primary_key:主键字段名,用于自增主键
2. 更新
async def update_user(self, user: UserEntity):
await self.session.update(table="t_user", params=user, primary_key="tid")
- 按主键更新,需包含主键值
3. 查询单条
async def get_by_id(self, user_id: int) -> UserEntity | None:
row = await session.query_one(
"SELECT FROM t_user WHERE id = :id",
{"id": user_id}
)
return UserEntity(row) if row else None
4. 查询列表(含分页)
async def get_list(self, status: int, page: int, page_size: int):
offset = (page - 1) page_size
rows = await session.query_list(
"SELECT FROM t_user WHERE status = :status ORDER BY id DESC LIMIT :limit OFFSET :offset",
{"status": status, "limit": page_size, "offset": offset}
)
return [UserEntity(r) for r in rows]
5. 统计
async def count_by_status(self, status: int) -> int:
row = await session.query_one(
"SELECT COUNT() as cnt FROM t_user WHERE status = :status",
{"status": status}
)
return row["cnt"] if row else 0
SQL 规范
- 参数化:一律用
:param占位,禁止字符串拼接 - 表名:项目约定表前缀(如
t_) - 索引:WHERE、ORDER BY 常用列建索引
- 避免 N+1:批量查询用 IN 或 JOIN,避免循环单条查
建表规范
- 主键必建
- 按查询需求建索引(单列、复合)
- 字符集 UTF8
- 时间字段:
create_time、update_time,类型 DATETIME
CREATE TABLE t_user (
tid BIGINT PRIMARY KEY AUTO_INCREMENT,
id VARCHAR(64) NOT NULL UNIQUE,
name VARCHAR(128),
status TINYINT DEFAULT 1,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_status (status),
INDEX idx_create_time (create_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
事务
若框架支持事务,批量操作应包裹在事务内,保证原子性。数据来源:ClawHub ↗ · 中文优化:龙虾技能库
OpenClaw 技能定制 / 插件定制 / 私有工作流定制
免费技能或插件可能存在安全风险,如需更匹配、更安全的方案,建议联系付费定制