🚀 快速安装
复制以下命令并运行,立即安装此 Skill:
npx @anthropic-ai/skills install github/awesome-copilot/postgresql-code-review
💡 提示:需要 Node.js 和 NPM
PostgreSQL 代码审查助手
针对 ${selection}(如果未选择,则为整个项目)的专家级 PostgreSQL 代码审查。重点关注 PostgreSQL 特定的最佳实践、反模式以及 PostgreSQL 独有的质量标准。
🎯 PostgreSQL 特定审查领域
JSONB 最佳实践
-- ❌ 错误:低效的 JSONB 用法
SELECT * FROM orders WHERE data->>'status' = 'shipped'; -- 无法使用索引
-- ✅ 正确:可索引的 JSONB 查询
CREATE INDEX idx_orders_status ON orders USING gin((data->'status'));
SELECT * FROM orders WHERE data @> '{"status": "shipped"}';
-- ❌ 错误:深度嵌套而不考虑后果
UPDATE orders SET data = data || '{"shipping":{"tracking":{"number":"123"}}}';
-- ✅ 正确:带有验证的结构化 JSONB
ALTER TABLE orders ADD CONSTRAINT valid_status
CHECK (data->>'status' IN ('pending', 'shipped', 'delivered'));
数组操作审查
-- ❌ 错误:低效的数组操作
SELECT * FROM products WHERE 'electronics' = ANY(categories); -- 无法使用索引
-- ✅ 正确:GIN 索引数组查询
CREATE INDEX idx_products_categories ON products USING gin(categories);
SELECT * FROM products WHERE categories @> ARRAY['electronics'];
-- ❌ 错误:在循环中进行数组拼接
-- 在函数/过程中这样做效率低下
-- ✅ 正确:批量数组操作
UPDATE products SET categories = categories || ARRAY['new_category']
WHERE id IN (SELECT id FROM products WHERE condition);
PostgreSQL 模式设计审查
-- ❌ 错误:未使用 PostgreSQL 特性
CREATE TABLE users (
id INTEGER,
email VARCHAR(255),
created_at TIMESTAMP
);
-- ✅ 正确:PostgreSQL 优化模式
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email CITEXT UNIQUE NOT NULL, -- 大小写不敏感的电子邮件
created_at TIMESTAMPTZ DEFAULT NOW(),
metadata JSONB DEFAULT '{}',
CONSTRAINT valid_email CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);
-- 为 metadata 添加 JSONB GIN 索引
CREATE INDEX idx_users_metadata ON users USING gin(metadata);
自定义类型和域
-- ❌ 错误:对特定数据使用通用类型
CREATE TABLE transactions (
amount DECIMAL(10,2),
currency VARCHAR(3),
status VARCHAR(20)
);
-- ✅ 正确:PostgreSQL 自定义类型
CREATE TYPE currency_code AS ENUM ('USD', 'EUR', 'GBP', 'JPY');
CREATE TYPE transaction_status AS ENUM ('pending', 'completed', 'failed', 'cancelled');
CREATE DOMAIN positive_amount AS DECIMAL(10,2) CHECK (VALUE > 0);
CREATE TABLE transactions (
amount positive_amount NOT NULL,
currency currency_code NOT NULL,
status transaction_status DEFAULT 'pending'
);
🔍 PostgreSQL 特定反模式
性能反模式
- 避免使用 PostgreSQL 特定索引:未对适当的数据类型使用 GIN/GiST 索引
- 误用 JSONB:将 JSONB 当作简单的字符串字段处理
- 忽略数组操作符:使用低效的数组操作
- 分区键选择不当:未有效利用 PostgreSQL 分区功能
模式设计问题
- 未使用 ENUM 类型:对有限的值集使用 VARCHAR
- 忽略约束:缺少用于数据验证的 CHECK 约束
- 错误的数据类型:使用 VARCHAR 而不是 TEXT 或 CITEXT
- 缺少 JSONB 结构:无验证的非结构化 JSONB
函数和触发器问题
-- ❌ 错误:低效的触发器函数
CREATE OR REPLACE FUNCTION update_modified_time()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = NOW(); -- 应使用 TIMESTAMPTZ
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- ✅ 正确:优化的触发器函数
CREATE OR REPLACE FUNCTION update_modified_time()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 仅在需要时触发
CREATE TRIGGER update_modified_time_trigger
BEFORE UPDATE ON table_name
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE FUNCTION update_modified_time();
📊 PostgreSQL 扩展使用审查
扩展最佳实践
-- ✅ 创建前检查扩展是否存在
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- ✅ 适当使用扩展
-- UUID 生成
SELECT uuid_generate_v4();
-- 密码哈希
SELECT crypt('password', gen_salt('bf'));
-- 模糊文本匹配
SELECT word_similarity('postgres', 'postgre');
🛡️ PostgreSQL 安全审查
行级安全 (RLS)
-- ✅ 正确:实施 RLS
ALTER TABLE sensitive_data ENABLE ROW LEVEL SECURITY;
CREATE POLICY user_data_policy ON sensitive_data
FOR ALL TO application_role
USING (user_id = current_setting('app.current_user_id')::INTEGER);
权限管理
-- ❌ 错误:权限过于宽泛
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_user;
-- ✅ 正确:细粒度权限
GRANT SELECT, INSERT, UPDATE ON specific_table TO app_user;
GRANT USAGE ON SEQUENCE specific_table_id_seq TO app_user;
🎯 PostgreSQL 代码质量检查清单
模式设计
- 使用适当的 PostgreSQL 数据类型(CITEXT、JSONB、数组)
- 对受约束的值利用 ENUM 类型
- 实施适当的 CHECK 约束
- 使用 TIMESTAMPTZ 而不是 TIMESTAMP
- 为可重用的约束定义自定义域
性能考量
- 适当的索引类型(JSONB/数组使用 GIN,范围类型使用 GiST)
- JSONB 查询使用包含操作符(@>, ?)
- 数组操作使用 PostgreSQL 特定操作符
- 正确使用窗口函数和 CTE
- 高效使用 PostgreSQL 特定函数
PostgreSQL 特性利用
- 在适当的情况下使用扩展
- 在有益的情况下用 PL/pgSQL 实现存储过程
- 利用 PostgreSQL 的高级 SQL 特性
- 使用 PostgreSQL 特定的优化技术
- 在函数中实现适当的错误处理
安全与合规
- 在需要的地方实施行级安全 (RLS)
- 适当的角色和权限管理
- 使用 PostgreSQL 内置的加密函数
- 利用 PostgreSQL 特性实现审计跟踪
📝 PostgreSQL 特定审查指南
- 数据类型优化:确保适当使用了 PostgreSQL 特定类型
- 索引策略:审查索引类型,确保利用了 PostgreSQL 特定索引
- JSONB 结构:验证 JSONB 模式设计和查询模式
- 函数质量:审查 PL/pgSQL 函数的效率和最佳实践
- 扩展使用:验证 PostgreSQL 扩展的适当使用
- 性能特性:检查 PostgreSQL 高级特性的利用情况
- 安全实施:审查 PostgreSQL 特定安全特性
重点关注 PostgreSQL 的独特能力,确保代码充分利用了 PostgreSQL 的特性,而不是将其视为一个通用的 SQL 数据库。
📄 原始文档
完整文档(英文):
https://skills.sh/github/awesome-copilot/postgresql-code-review
💡 提示:点击上方链接查看 skills.sh 原始英文文档,方便对照翻译。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

评论(0)