重要前提
安装AI Skills的关键前提是:必须科学上网,且开启TUN模式,这一点至关重要,直接决定安装能否顺利完成,在此郑重提醒三遍:科学上网,科学上网,科学上网。查看完整安装教程 →
database-management by autumnsgrove/groveengine
npx skills add https://github.com/autumnsgrove/groveengine --skill database-management在以下情况下激活此技能:
重要提示:所有需要数据库功能的项目必须使用此技能。
database.py 进行database.py 中project/
├── database.py # 所有 SQL 语句都在这里
├── app.py # 使用数据库函数(没有 SQL!)
└── tests/
└── test_database.py
# database.py - 所有数据库代码都在这里
import sqlite3
from typing import List, Dict, Optional, Any
DB_PATH = "app.db"
def get_connection(db_path: str = DB_PATH) -> sqlite3.Connection:
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
return conn
def init_db(db_path: str = DB_PATH) -> None:
"""使用模式初始化数据库。"""
conn = get_connection(db_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
def db_query(query: str, params: tuple = ()) -> List[Dict[str, Any]]:
"""执行 SELECT 查询并返回结果。"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
rows = cursor.fetchall()
conn.close()
return [dict(row) for row in rows]
def db_execute(query: str, params: tuple = ()) -> int:
"""执行 INSERT/UPDATE/DELETE 并返回受影响的行数。"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
conn.commit()
affected = cursor.rowcount
conn.close()
return affected
def db_insert(query: str, params: tuple = ()) -> int:
"""执行 INSERT 并返回最后插入行的 ID。"""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
conn.commit()
last_id = cursor.lastrowid
conn.close()
return last_id
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
# 添加到 database.py - 为应用代码提供简洁的 API
def get_user_by_id(user_id: int) -> Optional[Dict[str, Any]]:
"""根据 ID 获取用户。"""
results = db_query("SELECT * FROM users WHERE id = ?", (user_id,))
return results[0] if results else None
def get_user_by_email(email: str) -> Optional[Dict[str, Any]]:
"""根据邮箱获取用户。"""
results = db_query("SELECT * FROM users WHERE email = ?", (email,))
return results[0] if results else None
def create_user(username: str, email: str) -> int:
"""创建新用户并返回 ID。"""
return db_insert(
"INSERT INTO users (username, email) VALUES (?, ?)",
(username, email)
)
def delete_user(user_id: int) -> bool:
"""根据 ID 删除用户。"""
return db_execute("DELETE FROM users WHERE id = ?", (user_id,)) > 0
# app.py - 这里没有 SQL!
from database import init_db, get_user_by_id, create_user
def main():
init_db()
# 创建用户(没有 SQL!)
user_id = create_user("alice", "alice@example.com")
print(f"创建的用户: {user_id}")
# 获取用户(没有 SQL!)
user = get_user_by_id(user_id)
print(f"用户: {user['username']}")
def process_user(user_id):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
def process_user(user_id):
user = get_user_by_id(user_id)
# ❌ 错误:存在 SQL 注入漏洞!
query = f"SELECT * FROM users WHERE email = '{email}'"
# ✅ 正确:参数化查询
query = "SELECT * FROM users WHERE email = ?"
results = db_query(query, (email,))
def get_users_paginated(page: int = 1, per_page: int = 10):
offset = (page - 1) * per_page
return db_query(
"SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?",
(per_page, offset)
)
def db_transaction(operations: List[tuple]) -> bool:
conn = get_connection()
cursor = conn.cursor()
try:
for query, params in operations:
cursor.execute(query, params)
conn.commit()
return True
except:
conn.rollback()
return False
finally:
conn.close()
完整文档请参阅 AgentUsage/db_usage.md,包括:
每周安装次数
49
代码仓库
GitHub 星标数
2
首次出现
2026年1月28日
安全审计
安装于
opencode49
gemini-cli49
codex49
github-copilot48
cline48
cursor48
Activate this skill when:
IMPORTANT : This is MANDATORY for all projects requiring database functionality.
database.pydatabase.pyproject/
├── database.py # ALL SQL lives here
├── app.py # Uses database functions (no SQL!)
└── tests/
└── test_database.py
# database.py - All database code lives here
import sqlite3
from typing import List, Dict, Optional, Any
DB_PATH = "app.db"
def get_connection(db_path: str = DB_PATH) -> sqlite3.Connection:
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
return conn
def init_db(db_path: str = DB_PATH) -> None:
"""Initialize database with schema."""
conn = get_connection(db_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
def db_query(query: str, params: tuple = ()) -> List[Dict[str, Any]]:
"""Execute SELECT query and return results."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
rows = cursor.fetchall()
conn.close()
return [dict(row) for row in rows]
def db_execute(query: str, params: tuple = ()) -> int:
"""Execute INSERT/UPDATE/DELETE and return affected rows."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
conn.commit()
affected = cursor.rowcount
conn.close()
return affected
def db_insert(query: str, params: tuple = ()) -> int:
"""Execute INSERT and return last row ID."""
conn = get_connection()
cursor = conn.cursor()
cursor.execute(query, params)
conn.commit()
last_id = cursor.lastrowid
conn.close()
return last_id
# Add to database.py - Clean API for application code
def get_user_by_id(user_id: int) -> Optional[Dict[str, Any]]:
"""Get user by ID."""
results = db_query("SELECT * FROM users WHERE id = ?", (user_id,))
return results[0] if results else None
def get_user_by_email(email: str) -> Optional[Dict[str, Any]]:
"""Get user by email."""
results = db_query("SELECT * FROM users WHERE email = ?", (email,))
return results[0] if results else None
def create_user(username: str, email: str) -> int:
"""Create new user and return ID."""
return db_insert(
"INSERT INTO users (username, email) VALUES (?, ?)",
(username, email)
)
def delete_user(user_id: int) -> bool:
"""Delete user by ID."""
return db_execute("DELETE FROM users WHERE id = ?", (user_id,)) > 0
# app.py - NO SQL HERE!
from database import init_db, get_user_by_id, create_user
def main():
init_db()
# Create user (no SQL!)
user_id = create_user("alice", "alice@example.com")
print(f"Created user: {user_id}")
# Get user (no SQL!)
user = get_user_by_id(user_id)
print(f"User: {user['username']}")
def process_user(user_id):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))
def process_user(user_id):
user = get_user_by_id(user_id)
# ❌ WRONG: SQL injection vulnerability!
query = f"SELECT * FROM users WHERE email = '{email}'"
# ✅ CORRECT: Parameterized query
query = "SELECT * FROM users WHERE email = ?"
results = db_query(query, (email,))
def get_users_paginated(page: int = 1, per_page: int = 10):
offset = (page - 1) * per_page
return db_query(
"SELECT * FROM users ORDER BY created_at DESC LIMIT ? OFFSET ?",
(per_page, offset)
)
def db_transaction(operations: List[tuple]) -> bool:
conn = get_connection()
cursor = conn.cursor()
try:
for query, params in operations:
cursor.execute(query, params)
conn.commit()
return True
except:
conn.rollback()
return False
finally:
conn.close()
See AgentUsage/db_usage.md for complete documentation including:
Weekly Installs
49
Repository
GitHub Stars
2
First Seen
Jan 28, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode49
gemini-cli49
codex49
github-copilot48
cline48
cursor48
Supabase 使用指南:安全最佳实践、CLI 命令与 MCP 服务器配置
11,600 周安装
Spring Boot 项目创建器 - 一键生成DDD/分层架构微服务脚手架
199 周安装
Sentry Next.js SDK 完整设置指南:错误监控、追踪、会话回放与性能分析
201 周安装
SimPy 离散事件仿真框架 - Python 过程建模与资源管理
203 周安装
Obsidian MCP技能:知识库管理、笔记操作与Git同步的完整指南
199 周安装
Shopify应用开发最佳实践模板 - React Router/App Bridge/Webhook处理指南
203 周安装
高级法规事务经理技能模板 - 医疗健康科技全球法规申报与合规管理专家
203 周安装