5.8 KiB
5.8 KiB
Analytics RPC 函数部署脚本
问题诊断
错误信息 "Searched for the function public.get_teacher_analytics ... but no matches were found in the schema cache" 表明:
- RPC 函数尚未在 Supabase 数据库中创建
- 或函数签名与调用方式不匹配
- 或函数权限未正确设置
解决方案
步骤 1: 确认数据库连接
首先确保你能够连接到 Supabase 数据库:
-- 在 Supabase SQL Editor 中运行,检查连接
SELECT current_user, current_database(), now();
步骤 2: 检查现有函数
-- 检查是否已存在相关函数
SELECT
routine_name,
routine_type,
routine_definition
FROM information_schema.routines
WHERE routine_schema = 'public'
AND (
routine_name LIKE '%teacher_analytics%' OR
routine_name LIKE '%top_performers%' OR
routine_name LIKE '%chart_data%'
)
ORDER BY routine_name;
步骤 3: 创建简化版本的函数(用于测试)
如果完整的函数创建有问题,先创建一个简化版本:
-- 简化版 get_teacher_analytics 函数
CREATE OR REPLACE FUNCTION public.get_teacher_analytics(
teacher_id uuid DEFAULT NULL,
start_date text DEFAULT NULL,
end_date text DEFAULT NULL
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
-- 返回简单的测试数据
RETURN jsonb_build_object(
'total_students', 25,
'total_assignments', 8,
'completion_rate', 85.5,
'average_score', 78.2,
'active_classes', 3,
'total_submissions', 180,
'pending_reviews', 12,
'graded_submissions', 168
);
END;
$$;
-- 简化版 get_top_performers 函数
CREATE OR REPLACE FUNCTION public.get_top_performers(
teacher_id uuid DEFAULT NULL,
start_date text DEFAULT NULL,
end_date text DEFAULT NULL,
"limit" integer DEFAULT 10
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
-- 返回简单的测试数据
RETURN jsonb_build_array(
jsonb_build_object(
'student_id', gen_random_uuid(),
'name', '张三',
'username', 'zhangsan',
'avatar_url', null,
'score', 95.5,
'submission_count', 8,
'completion_rate', 100,
'class_name', '三年级一班',
'rank_position', 1
),
jsonb_build_object(
'student_id', gen_random_uuid(),
'name', '李四',
'username', 'lisi',
'avatar_url', null,
'score', 92.3,
'submission_count', 7,
'completion_rate', 87.5,
'class_name', '三年级一班',
'rank_position', 2
)
);
END;
$$;
-- 简化版 get_chart_data 函数
CREATE OR REPLACE FUNCTION public.get_chart_data(
teacher_id uuid DEFAULT NULL,
start_date text DEFAULT NULL,
end_date text DEFAULT NULL,
"type" text DEFAULT 'completion_rate'
)
RETURNS jsonb
LANGUAGE plpgsql
SECURITY DEFINER
AS $$
BEGIN
-- 返回简单的测试数据
RETURN jsonb_build_array(
jsonb_build_object(
'date_key', '2024-06-01',
'value', 75.5,
'label', '完成率',
'count', 15
),
jsonb_build_object(
'date_key', '2024-06-02',
'value', 82.3,
'label', '完成率',
'count', 18
),
jsonb_build_object(
'date_key', '2024-06-03',
'value', 90.1,
'label', '完成率',
'count', 22
)
);
END;
$$;
-- 授权函数
GRANT EXECUTE ON FUNCTION public.get_teacher_analytics TO authenticated;
GRANT EXECUTE ON FUNCTION public.get_top_performers TO authenticated;
GRANT EXECUTE ON FUNCTION public.get_chart_data TO authenticated;
步骤 4: 测试函数调用
-- 测试函数调用
SELECT public.get_teacher_analytics();
SELECT public.get_top_performers();
SELECT public.get_chart_data();
步骤 5: 验证 Supabase RPC 调用
在 Supabase 中测试 RPC 调用:
// 在 Supabase 控制台的 API 文档中测试
const { data, error } = await supabase
.rpc('get_teacher_analytics', {
teacher_id: null,
start_date: '2024-06-01',
end_date: '2024-06-12'
});
常见问题解决
问题 1: 函数参数类型不匹配
如果遇到参数类型问题,确保:
- 日期参数使用
text类型而不是date limit参数加引号"limit"(因为是 PostgreSQL 保留字)- UUID 参数允许 NULL 值
问题 2: 权限问题
-- 检查函数权限
SELECT
routine_name,
routine_schema,
security_type
FROM information_schema.routines
WHERE routine_name LIKE '%teacher_analytics%';
-- 重新授权
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO authenticated;
问题 3: RLS 策略冲突
-- 临时禁用 RLS(仅用于调试)
ALTER TABLE public.ak_users DISABLE ROW LEVEL SECURITY;
-- 记住调试完成后重新启用
-- ALTER TABLE public.ak_users ENABLE ROW LEVEL SECURITY;
部署步骤(按顺序执行)
- 创建简化函数:在 Supabase SQL Editor 中执行上面的简化版函数
- 测试调用:确认 RPC 调用能够工作
- 逐步升级:如果简化版本工作正常,再部署完整版本
- 验证数据:确保返回的数据结构符合前端期望
前端调试技巧
在 analytics.uvue 中添加调试信息:
const handleError = (errorData: any) => {
console.error('Analytics error详细信息:', errorData)
console.error('错误类型:', typeof errorData)
console.error('错误内容:', JSON.stringify(errorData, null, 2))
error.value = '数据加载失败:' + (errorData.message || '未知错误')
loading.value = false
}
执行这些步骤后,Analytics 页面应该能够正常加载数据。