File size: 4,454 Bytes
4469050
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
from dotenv import load_dotenv # 导入 load_dotenv

# 加载 .env 文件中的环境变量
load_dotenv()

from supabase import create_client, Client
import os

# 从环境变量获取 Supabase URL 和 Key
# 在实际应用中,请确保这些变量已设置
supabase_url = os.getenv("SUPABASE_URL")
supabase_key = os.getenv("SUPABASE_KEY")


# !!! 请替换为你的 Supabase 项目 URL 和 anon key !!!
# SUPABASE_URL = "SUPABASE_URL"
# SUPABASE_KEY = "SUPABASE_KEY"

# 创建 Supabase 客户端
supabase: Client = create_client(supabase_url, supabase_key)

def create_test_table():
    """
    创建 Supabase 中的 'test_table_1' 表。
    如果表已存在,则不会重复创建。
    """
    table_name = "test_table_1"
    print(f"正在尝试通过 RPC 创建表 '{table_name}'...")
    
    # Supabase Python SDK 不直接支持执行任意 DDL SQL。
    # 最推荐的方式是在 Supabase 控制台手动创建表,或者通过迁移工具。
    # 如果必须通过代码执行 DDL,通常需要:
    # 1. 在 Supabase 数据库中创建一个 PostgreSQL 函数来封装 DDL 逻辑。
    # 2. 然后通过 supabase.rpc() 调用这个函数。
    
    # 以下是需要在 Supabase SQL 编辑器中执行的 PostgreSQL 函数定义:
    print("\n--- 请在 Supabase SQL 编辑器中执行以下 SQL 来创建函数 'create_table_if_not_exists_func' ---")
    print(f"""
CREATE OR REPLACE FUNCTION create_table_if_not_exists_func(table_name TEXT)
RETURNS VOID AS $$
BEGIN
    EXECUTE format('
        CREATE TABLE IF NOT EXISTS %I (
            id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
            name TEXT,
            age INT
        );
    ', table_name);
END;
$$ LANGUAGE plpgsql;
    """)
    print("----------------------------------------------------------------------------------\n")

    # 尝试通过 RPC 调用上述 PostgreSQL 函数
    try:
        response = supabase.rpc('create_table_if_not_exists_func', {'table_name': table_name}).execute()
        
        if response.error:
            print(f"通过 RPC 调用函数创建表失败: {response.error}")
            # 如果错误是由于函数不存在,提示用户先创建函数
            if "function create_table_if_not_exists_func(text) does not exist" in str(response.error):
                print("错误提示:PostgreSQL 函数 'create_table_if_not_exists_func' 不存在。请先在 Supabase 控制台创建该函数。")
        else:
            print(f"通过 RPC 调用函数创建表成功: {response.data}")
            
    except Exception as e:
        print(f"调用 RPC 函数时发生意外错误: {e}")


def test_insert_and_query_data():
    """
    测试向 Supabase 插入数据并查询。
    请确保你的 Supabase 数据库中存在一个名为 'test_table_1' 的表,
    并且该表包含 'name' (text) 和 'age' (integer) 字段。
    """
    table_name = "test_table_1" # 替换为你的表名

    print(f"正在向表 '{table_name}' 插入数据...")
    # 插入数据
    data_to_insert = {"name": "Test User", "age": 30}
    response = supabase.table(table_name).insert(data_to_insert).execute()

    if response.data:
        print(f"数据插入成功: {response.data}")
    else:
        print(f"数据插入失败: {response.error}")
        assert False, f"插入失败: {response.error}"

    print(f"正在从表 '{table_name}' 查询数据...")
    # 查询数据
    response = supabase.table(table_name).select("*").eq("name", "Test User").execute()

    if response.data:
        print(f"数据查询成功: {response.data}")
        assert len(response.data) > 0, "未查询到数据"
        assert response.data[0]["name"] == "Test User"
    else:
        print(f"数据查询失败: {response.error}")
        assert False, f"查询失败: {response.error}"

    # 清理数据 (可选,根据测试需求决定是否保留)
    print(f"正在从表 '{table_name}' 删除数据...")
    response = supabase.table(table_name).delete().eq("name", "Test User").execute()
    if response.data:
        print(f"数据删除成功: {response.data}")
    else:
        print(f"数据删除失败: {response.error}")

if __name__ == "__main__":
    print("开始运行 Supabase 测试...")
    create_test_table() # 在运行测试之前尝试创建表
    test_insert_and_query_data() # 取消注释,以便在创建表后运行数据操作测试
    print("Supabase 测试完成。")