注册时向Supabase的user_data表插数据报错:SupabaseClient无from成员
问题:Supabase注册时无法写入user_data表,报错'SupabaseClient' has no member 'from'
问题详情
- 注册流程中已成功将邮箱、密码存入Supabase的
user表,但无法向自定义的user_data表写入附加用户信息 - 编译报错:
Value of type 'SupabaseClient' has no member 'from'
相关代码
import Foundation import SwiftUI import Supabase class SignUpViewModel: ObservableObject { let supabaseURLString = "JohnStamos" // 实际应为你的Supabase URL let supabaseKeyString = "BobSeger" // 实际应为你的Supabase密钥 let client: SupabaseClient init() { client = SupabaseClient(supabaseURL: URL(string: supabaseURLString)!, supabaseKey: supabaseKeyString) } func signUp(email: String, password: String, userData: [String: Any], completion: @escaping (Error?) -> Void) { Task { do { let signUpResponse = try await client.auth.signUp(email: email, password: password) if let newUserId = signUpResponse.user?.id { let insertData: [String: Any] = [ "user_id": newUserId, "display_name": userData["display_name"]!, "date_of_birth": userData["date_of_birth"]!, "gender": userData["gender"]!, "fitness_goal": userData["fitness_goal"]! ] let insertResponse = try await client.from("user_data").insert(insertData).execute() if let error = insertResponse.error { throw error } } completion(nil) } catch { completion(error) } } } }
解决方案
- 修正SDK调用方式:Supabase Swift SDK中,数据库操作需通过
database属性访问,将client.from("user_data")修改为client.database.from("user_data") - 确认依赖导入:确保项目已正确导入
SupabaseSDK,部分旧版本可能需要额外导入PostgREST模块 - 类型安全优化(可选):建议用
Codable结构体替代[String: Any],避免强制解包风险,示例结构体:
struct UserData: Codable { let userId: String let displayName: String let dateOfBirth: String let gender: String let fitnessGoal: String enum CodingKeys: String, CodingKey { case userId = "user_id" case displayName = "display_name" case dateOfBirth = "date_of_birth" case gender case fitnessGoal = "fitness_goal" } }
插入时直接传入结构体实例:
let userData = UserData( userId: newUserId, displayName: userData["display_name"] as! String, dateOfBirth: userData["date_of_birth"] as! String, gender: userData["gender"] as! String, fitnessGoal: userData["fitness_goal"] as! String ) let insertResponse = try await client.database.from("user_data").insert(userData).execute()
修改后的核心代码片段
// 替换原插入代码部分 let insertData: [String: Any] = [ "user_id": newUserId, "display_name": userData["display_name"]!, "date_of_birth": userData["date_of_birth"]!, "gender": userData["gender"]!, "fitness_goal": userData["fitness_goal"]! ] let insertResponse = try await client.database.from("user_data").insert(insertData).execute() if let error = insertResponse.error { throw error }
内容的提问来源于stack exchange,提问作者Your Friend
相关产品推荐
相关产品推荐

