生成类型
SubaseAPI是从数据库生成的,这意味着我们可以使用数据库来生成类型安全的API定义。
使用Suabase CLI生成类型#
Suabase CLI是一个二进制Go应用程序,它提供了设置本地开发环境所需的一切。
你可以通过npm或其他支持的软件包管理器安装CLI。CLI的最低要求版本是v1.8.1。
npm i supabase@">=1.8.1" --save-dev
用你的个人访问令牌登录:
npx supabase login
为你的项目生成类型,产生types/supabase.ts
文件:
npx supabase gen types typescript --project-id "$PROJECT_ID" --schema public > types/supabase.ts
在你生成了你的类型后,你可以在src/index.ts
中使用它们.
1import { NextApiRequest, NextApiResponse } from 'next'
2import { createClient } from '@supabase/supabase-js'
3import { Database } from '../types/supabase'
4
5const supabase = createClient<Database>(
6 process.env.NEXT_PUBLIC_SUPABASE_URL,
7 process.env.SUPABASE_SECRET_KEY
8)
9
10export default async (req: NextApiRequest, res: NextApiResponse) => {
11 const allOnlineUsers = await supabase.from('users').select('*').eq('status', 'ONLINE')
12 res.status(200).json(allOnlineUsers)
13}
用GitHub动作自动更新类型#
让你的类型定义与数据库保持同步的一个方法是设置一个GitHub动作,按计划运行。
将上面的脚本添加到你的package.json
中,使用npm run update-types
运行它。
1"update-types": "npx supabase gen types typescript --project-id \"$PROJECT_ID\" > types/supabase.ts"
创建一个文件 .github/workflows/update-types.yml
,用下面的片段来定义动作和环境变量。这个脚本将每天晚上提交新的类型变化到你的 repo。
1name: Update database types
2
3on:
4 schedule:
5 # sets the action to run daily. You can modify this to run the action more or less frequently
6 - cron: '0 0 * * *'
7
8jobs:
9 update:
10 runs-on: ubuntu-latest
11 env:
12 SUPABASE_ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }}
13 PROJECT_ID: <your-project-id>
14 steps:
15 - uses: actions/checkout@v2
16 with:
17 persist-credentials: false
18 fetch-depth: 0
19 - uses: actions/setup-node@v2.1.5
20 with:
21 node-version: 16
22 - run: npm run update-types
23 - name: check for file changes
24 id: git_status
25 run: |
26 echo "::set-output name=status::$(git status -s)"
27 - name: Commit files
28 if: ${{contains(steps.git_status.outputs.status, ' ')}}
29 run: |
30 git add types/database/index.ts
31 git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
32 git config --local user.name "github-actions[bot]"
33 git commit -m "Update database types" -a
34 - name: Push changes
35 if: ${{contains(steps.git_status.outputs.status, ' ')}}
36 uses: ad-m/github-push-action@master
37 with:
38 github_token: ${{ secrets.GITHUB_TOKEN }}
39 branch: ${{ github.ref }}
或者,你也可以使用社区支持的GitHub行动:generate-supabase-db-types-github-action