Firebase DataConnectディレクティブまとめ
Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。
Firebase DataConnectディレクティブまとめ
Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。
ディレクティブ概要テーブル
ディレクティブ | 目的 | 主な使用方法 |
---|---|---|
@auth | 認証ポリシーの定義 | アクセスレベルや条件式を指定 |
@col | テーブル列のカスタマイズ | 列名、データ型、サイズなどを指定 |
@default | デフォルト値の指定 | 定数値、式、SQLを使用 |
@index | インデックスの定義 | 単一/複合フィールドにインデックスを作成 |
@ref | 外部キー参照の定義 | リレーションシップと参照先を指定 |
@table | テーブルの定義 | テーブル名、主キー、名前形式を指定 |
@transaction | トランザクション実行の要求 | ミューテーションに適用 |
@unique | 一意制約の定義 | 単一/複数列に一意制約を設定 |
@view | SQLビューの定義 | SELECT文を指定してビューを作成 |
1. @auth
目的: クエリやミューテーションの認証ポリシーを定義する
使用方法: アクセスレベルや条件式を指定して、操作の実行権限を制御する
注意点: 適切な認証レベルの設定が重要で、セキュリティに直結する
2. @col
目的: SQLデータベーステーブルの列を表すフィールドをカスタマイズする
使用方法: 列名、データ型、サイズなどを指定して、フィールドと列のマッピングをカスタマイズする
注意点: Vector型には必ずsizeパラメータを指定する必要がある
3. @default
目的: 列フィールドのデフォルト値を指定する
使用方法: 定数値、式、SQLなどを使ってデフォルト値を設定する
注意点: フィールドの型に応じて適切なデフォルト値を設定する
4. @index
目的: データベースインデックスを定義してクエリのパフォーマンスを最適化する
使用方法: 単一フィールドまたは複合フィールドにインデックスを作成し、順序や種類を指定する
注意点: 過剰なインデックス作成は書き込みパフォーマンスに影響を与える可能性がある
5. @ref
目的: 他のテーブルへの外部キー参照を定義する
使用方法: リレーションシップを定義し、参照先のテーブルと列を指定する
注意点: カスケード削除や任意の関連付けなど、適切な参照オプションを選択する
6. @table
目的: リレーショナルデータベーステーブルを定義する
使用方法: テーブル名、主キー、単数形・複数形の名前などを指定してテーブルを定義する
注意点: 適切な主キーの選択が重要で、通常はidフィールドが自動的に追加される
7. @transaction
目的: ミューテーションがDBトランザクション内で実行されることを要求する
使用方法: ミューテーションに適用し、全ての操作が成功するか全て失敗するかを保証する
注意点: 現在のところ、クエリには適用できない
8. @unique
目的: @tableに一意制約を定義する
使用方法: 単一列または複数列に対して一意制約を設定し、重複を防ぐ
注意点: @refフィールドに適用すると、一対一の関係を定義できる
9. @view
目的: リレーショナルデータベースのRaw SQLビューを定義する
使用方法: SQLのSELECT文を指定して、ビューを作成し、GraphQLフィールドとマッピングする
注意点: ビューは読み取り専用で、直接変更することはできない
Firebase DataConnectディレクティブまとめ
Firebase DataConnectで使用される主要なディレクティブの概要と使用方法をまとめています。
使用例
1. @auth
# ユーザーレベルの認証が必要なクエリ
query GetUserProfile @auth(level: USER) {
user(id: "123") {
name
email
}
}
# カスタム条件式を使用した認証
query GetAdminData @auth(expr: "auth.token.admin == true") {
adminReports {
id
content
}
}
2. @col
type User @table {
id: ID! @col(name: "user_id")
name: String @col(name: "full_name", dataType: "varchar(100)")
age: Int @col(dataType: "smallint")
profile: Vector @col(size: 768) # Vector型にはsizeが必須
}
3. @default
type Post @table {
id: ID! @default(expr: "uuidV4()")
title: String
content: String
createdAt: Timestamp! @default(expr: "request.time")
status: String! @default(value: "draft")
}
4. @index
type Product @table {
id: ID!
name: String @index # 単一フィールドのインデックス
price: Float
category: String
}
type Order @table @index(fields: ["userId", "createdAt"]) { # 複合インデックス
id: ID!
userId: ID!
createdAt: Timestamp!
total: Float
}
5. @ref
type Comment @table {
id: ID!
content: String
post: Post! @ref # Post テーブルへの参照
author: User! @ref # User テーブルへの参照
}
6. @table
type Book @table(name: "books", singular: "book", plural: "books") {
id: ID!
title: String!
author: String
publishedYear: Int
}
7. @transaction
mutation TransferFunds @transaction {
debitAccount(id: "123", amount: 100) {
newBalance
}
creditAccount(id: "456", amount: 100) {
newBalance
}
}
8. @unique
type User @table {
id: ID!
email: String! @unique # メールアドレスに一意制約
username: String! @unique # ユーザー名に一意制約
}
9. @view
type PopularPosts @view(sql: """
SELECT p.id, p.title, COUNT(c.id) as comment_count
FROM posts p
LEFT JOIN comments c ON p.id = c.post_id
GROUP BY p.id, p.title
HAVING COUNT(c.id) > 10
ORDER BY comment_count DESC
""") {
id: ID!
title: String!
commentCount: Int!
}