database-management
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseDatabase Management Skill
数据库管理技能
When to Activate
激活场景
Activate this skill when:
- Setting up database functionality
- Creating database schemas
- Implementing data persistence
- Writing database queries
- Working with SQLite or any database
IMPORTANT: This is MANDATORY for all projects requiring database functionality.
在以下场景激活该技能:
- 搭建数据库功能
- 创建数据库模式
- 实现数据持久化
- 编写数据库查询语句
- 处理SQLite或其他数据库相关工作
重要提示:所有需要数据库功能的项目均强制使用该技能。
Core Architecture
核心架构
Principles
设计原则
- SQLite Only: Use SQLite as default database
- Single Interface: All database operations through
database.py - Complete SQL Isolation: All SQL statements in
database.py - Function-Based: Simple, reusable function interface
- 仅使用SQLite:默认使用SQLite作为数据库
- 单一接口:所有数据库操作均通过完成
database.py - 完全SQL隔离:所有SQL语句都应放在中
database.py - 基于函数:采用简洁、可复用的函数式接口
File Structure
文件结构
project/
├── database.py # ALL SQL lives here
├── app.py # Uses database functions (no SQL!)
└── tests/
└── test_database.pyproject/
├── database.py # ALL SQL lives here
├── app.py # Uses database functions (no SQL!)
└── tests/
└── test_database.pyStandard Interface Pattern
标准接口模式
python
undefinedpython
undefineddatabase.py - All database code lives here
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
undefinedimport 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
undefinedDomain-Specific Functions
领域专属函数
python
undefinedpython
undefinedAdd to database.py - Clean API for application code
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
undefineddef 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
undefinedApplication Usage
应用层使用示例
python
undefinedpython
undefinedapp.py - NO SQL HERE!
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']}")undefinedfrom 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']}")undefinedAnti-Patterns to Avoid
需避免的反模式
❌ WRONG: SQL in application code
❌ 错误示例:在应用代码中编写SQL
python
def process_user(user_id):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))python
def process_user(user_id):
conn = sqlite3.connect('app.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE id = ?", (user_id,))✅ CORRECT: Use database functions
✅ 正确示例:使用数据库函数
python
def process_user(user_id):
user = get_user_by_id(user_id)python
def process_user(user_id):
user = get_user_by_id(user_id)Security: Always Use Parameters
安全提示:始终使用参数化查询
python
undefinedpython
undefined❌ WRONG: SQL injection vulnerability!
❌ WRONG: SQL injection vulnerability!
query = f"SELECT * FROM users WHERE email = '{email}'"
query = f"SELECT * FROM users WHERE email = '{email}'"
✅ CORRECT: Parameterized query
✅ CORRECT: Parameterized query
query = "SELECT * FROM users WHERE email = ?"
results = db_query(query, (email,))
undefinedquery = "SELECT * FROM users WHERE email = ?"
results = db_query(query, (email,))
undefinedCommon Patterns
常见模式
Pagination
分页查询
python
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)
)python
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)
)Transactions
事务处理
python
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()python
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()Golden Rules
黄金准则
- ✅ All SQL in database.py - nowhere else
- ✅ Parameterized queries - prevent SQL injection
- ✅ Meaningful return types - Optional, List, bool, int
- ✅ Transaction support - for multi-operation consistency
- ✅ *Add .db to .gitignore - don't commit databases
- ✅ 所有SQL都放在database.py中 - 禁止在其他文件编写
- ✅ 使用参数化查询 - 防止SQL注入
- ✅ 返回有意义的类型 - 比如Optional、List、bool、int
- ✅ 支持事务处理 - 保证多操作的一致性
- ✅ 将.db加入.gitignore* - 不要提交数据库文件到版本库
Related Resources
相关资源
See for complete documentation including:
AgentUsage/db_usage.md- Full database.py template
- Migration patterns
- Testing database functions
- Performance optimization
请查看获取完整文档,包括:
AgentUsage/db_usage.md- 完整的database.py模板
- 数据库迁移模式
- 数据库函数测试
- 性能优化