You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

注册时向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")
  • 确认依赖导入:确保项目已正确导入Supabase SDK,部分旧版本可能需要额外导入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:53:12