2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Firebase Data ConnectのDirective

Posted at

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!
}
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?