mcpField
D
database-management

database-management

github.com/autumnsgrove数据与数据库674 次安装6 天前更新
代码仓库

关于 database-management

database-management 是面向需要配置数据库、持久化、模式或查询的项目开发技能。它规定默认使用 SQLite,并通过单一的 database.py 接口隔离 SQL,强调参数化查询和事务支持。

主要功能

  1. 01默认使用 SQLite
  2. 02将 SQL 集中在 database.py
  3. 03采用函数式数据库访问接口
  4. 04建议使用参数化查询
  5. 05涵盖分页与事务
  6. 06提供测试和迁移指导

适用场景

  1. 01为应用添加持久化
  2. 02创建数据库模式和查询
  3. 03避免在应用代码中编写 SQL
  4. 04通过参数化降低 SQL 注入风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/autumnsgrove/lattice --skill database-management

安装后在 Claude Code 中输入/database-management确认已加载。

详细介绍

数据库管理技能

何时启用

在以下情况下启用此技能:

  • 设置数据库功能
  • 创建数据库架构
  • 实现数据持久化
  • 编写数据库查询
  • 使用 SQLite 或任何数据库

重要:所有需要数据库功能的项目都必须使用此技能。

核心架构

原则
  1. 仅使用 SQLite:默认使用 SQLite 作为数据库
  2. 单一接口:所有数据库操作都通过 database.py
  3. 完全隔离 SQL:所有 SQL 语句都放在 database.py 中
  4. 基于函数:采用简单、可复用的函数接口
文件结构
project/
├── 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", "[email protected]")
    print(f"Created user: {user_id}")

    # Get user (no SQL!)
    user = get_user_by_id(user_id)
    print(f"User: {user['username']}")

应避免的反模式

❌ 错误:在应用程序代码中编写 SQL
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()

黄金法则

  1. ✅ 所有 SQL 都放在 database.py 中——不放在其他地方
  2. ✅ 参数化查询——防止 SQL 注入
  3. ✅ 有意义的返回类型——Optional、List、bool、int
  4. ✅ 支持事务——确保多项操作的一致性
  5. ✅ *将 .db 添加到 .gitignore——不要提交数据库文件

相关资源

请参阅 AgentUsage/db_usage.md,了解完整文档,包括:

  • 完整的 database.py 模板
  • 迁移模式
  • 测试数据库函数
  • 性能优化

评论

支持 Markdown