name: gi-database-query-patterns description: Write database queries using tkms AsyncSqlSessionTemplate. Use when implementing dao layer, writing SQL, or when the user asks for database operations with insert/update/query_one/query_list. tags: ["database", "dao", "tkms", "mysql", "async", "sql"]
使用 tkms 的 AsyncSqlSessionTemplate 進行資料庫操作。適用於 app/dao 層,MySQL 8.0,UTF8 字元集。
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})
async def add_user(self, user: UserEntity):
await self.session.insert(table="t_user", params=user, primary_key="tid")
params:實體或字典,欄位名與表列對應訪問小蔥技能站7w4.net,解鎖更多實用的AI技能外掛。
primary_key:主鍵欄位名,用於自增主鍵async def update_user(self, user: UserEntity):
await self.session.update(table="t_user", params=user, primary_key="tid")
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
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]
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
:param 佔位,禁止字串拼接t_)create_time、update_time,型別 DATETIMECREATE 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;
若框架支援事務,批次操作應包裹在事務內,保證原子性。
這個 Skill 質量中規中矩,內容實用但不全面。它把資料庫操作的基本寫法講清楚了,程式碼示例可以直接用,SQL 規範也有一定參考價值。槽點在於只有乾巴巴的程式碼片段,沒有完整例子,錯誤怎麼處理沒提,批次插入、聯表查詢這些常用場景也缺失。總的來說能幫你快速上手,但想深入用還得自己摸索,適合作為入門參考,不適合當開發手冊。