جهش های Data Connect را پیاده سازی کنید

Firebase Data Connect به شما امکان می‌دهد برای نمونه‌های PostgreSQL خود که با Google Cloud SQL مدیریت می‌شوند، کانکتور ایجاد کنید. این کانکتورها ترکیبی از کوئری‌ها و جهش‌ها برای استفاده از داده‌های شما از طرحواره‌تان هستند.

راهنمای شروع به کار، یک طرحواره برنامه نقد فیلم برای PostgreSQL معرفی کرد.

آن راهنما همچنین عملیات مدیریتی قابل استقرار و موقت، از جمله جهش‌ها، را معرفی کرد.

  • جهش‌های قابل استقرار، جهش‌هایی هستند که شما پیاده‌سازی می‌کنید تا از برنامه‌های کلاینت در یک کانکتور فراخوانی شوند، و نقاط پایانی API را که شما تعریف می‌کنید، در آن قرار دهید. Data Connect احراز هویت و مجوز را در این جهش‌ها ادغام می‌کند و SDKهای کلاینت را بر اساس API شما تولید می‌کند.
  • جهش‌های مدیریتی موقت (ad hoc administrative mutations) از محیط‌های دارای امتیاز بالا برای پر کردن و مدیریت جداول اجرا می‌شوند. می‌توانید آن‌ها را در کنسول Firebase ، از محیط‌های دارای امتیاز بالا با استفاده از Firebase Admin SDK و در محیط‌های توسعه محلی با استفاده از افزونه Data Connect VS Code ما ایجاد و اجرا کنید.

این راهنما نگاه عمیق‌تری به جهش‌های قابل استقرار (deployable mutations) می‌اندازد.

ویژگی‌های جهش‌های Data Connect

Data Connect به شما امکان می‌دهد جهش‌های اولیه را به تمام روش‌هایی که از یک پایگاه داده PostgreSQL انتظار دارید، انجام دهید:

  • انجام عملیات CRUD
  • مدیریت عملیات چند مرحله‌ای با تراکنش‌ها

اما با افزونه‌های Data Connect برای GraphQL، می‌توانید جهش‌های پیشرفته‌ای را برای برنامه‌های سریع‌تر و کارآمدتر پیاده‌سازی کنید:

  • از کلیدهای اسکالر برگردانده شده توسط بسیاری از عملیات برای ساده‌سازی عملیات تکراری روی رکوردها استفاده کنید
  • از مقادیر سرور برای پر کردن داده‌ها با عملیات ارائه شده توسط سرور استفاده کنید
  • در جریان عملیات جهش چند مرحله‌ای برای جستجوی داده‌ها، کوئری‌هایی را انجام دهید و خطوط کد و رفت و برگشت به سرور را ذخیره کنید.

استفاده از فیلدهای تولید شده برای پیاده‌سازی جهش‌ها

عملیات Data Connect شما مجموعه‌ای از فیلدها را که به طور خودکار توسط Data Connect بر اساس انواع و روابط نوع در طرحواره شما ایجاد می‌شوند، گسترش می‌دهد. این فیلدها هر زمان که طرحواره خود را ویرایش می‌کنید، توسط ابزارهای محلی ایجاد می‌شوند.

شما می‌توانید از فیلدهای تولید شده برای پیاده‌سازی جهش‌ها، از ایجاد، به‌روزرسانی و حذف رکوردهای تکی در جداول تکی گرفته تا به‌روزرسانی‌های پیچیده‌تر چند جدولی، استفاده کنید.

فرض کنید طرحواره شما شامل یک نوع Movie و یک نوع Actor مرتبط است. Data Connect فیلدهای movie_insert ، movie_update ، movie_delete و موارد دیگر را تولید می‌کند.

جهش با
فیلد movie_insert

فیلد movie_insert نشان دهنده یک جهش برای ایجاد یک رکورد واحد در جدول Movie است.

از این فیلد برای ایجاد یک فیلم واحد استفاده کنید.

mutation CreateMovie($data: Movie_Data!) {
  movie_insert(data: $data) { key }
}

جهش با
فیلد movie_update

فیلد movie_update نشان دهنده یک جهش برای به‌روزرسانی یک رکورد واحد در جدول Movie است.

از این فیلد برای به‌روزرسانی یک فیلم واحد با استفاده از کلید آن استفاده کنید.

mutation UpdateMovie($myKey: Movie_Key!, $data: Movie_Data!) {
  movie_update(key: $myKey, data: $data) { key }
}

جهش با
فیلد movie_delete

فیلد movie_delete نشان دهنده یک جهش برای حذف یک رکورد واحد در جدول Movie است.

از این فیلد برای حذف یک فیلم با استفاده از کلید آن استفاده کنید.

  mutation DeleteMovie($myKey: Movie_Key!) {
    movie_delete(key: $myKey) { key }
  }

عناصر ضروری یک جهش

جهش‌های Data Connect، جهش‌های GraphQL با افزونه‌های Data Connect هستند. درست مانند یک جهش GraphQL معمولی، می‌توانید یک نام عملیات و لیستی از متغیرهای GraphQL تعریف کنید.

Data Connect کوئری‌های GraphQL را با دستورالعمل‌های سفارشی مانند @auth و @transaction گسترش می‌دهد.

بنابراین جهش زیر دارای:

  • تعریف نوع mutation
  • نام عملیات SignUp (جهش)
  • یک آرگومان عملیاتی تک متغیره $username
  • یک دستورالعمل واحد، @auth
  • یک فیلد تکی به user_insert .
mutation SignUp($username: String!) @auth(level: USER) {
  user_insert(data: {
    id_expr: "auth.uid"
    username: $username
  })
}

هر آرگومان جهش نیاز به یک اعلان نوع، یک نوع داخلی مانند String یا یک نوع سفارشی تعریف‌شده توسط طرحواره مانند Movie دارد.

جهش‌های اساسی را بنویسید

شما می‌توانید شروع به نوشتن جهش‌هایی برای ایجاد، به‌روزرسانی و حذف رکوردهای منفرد از پایگاه داده خود کنید.

ایجاد کردن

بیایید کارهای اولیه را انجام دهیم.

# Create a movie based on user input
mutation CreateMovie($title: String!, $releaseYear: Int!, $genre: String!, $rating: Int!) {
  movie_insert(data: {
    title: $title
    releaseYear: $releaseYear
    genre: $genre
    rating: $rating
  })
}

# Create a movie with default values
mutation CreateMovie2 {
  movie_insert(data: {
    title: "Sherlock Holmes"
    releaseYear: 2009
    genre: "Mystery"
    rating: 5
  })
}

یا یک جمله تاکیدی.

# Movie upsert using combination of variables and literals
mutation UpsertMovie($title: String!) {
  movie_upsert(data: {
    title: $title
    releaseYear: 2009
    genre: "Mystery"
    rating: 5
    genre: "Mystery/Thriller"
  })
}

انجام به‌روزرسانی‌ها

در اینجا به‌روزرسانی‌هایی ارائه شده است. تهیه‌کنندگان و کارگردانان مطمئناً امیدوارند که این رتبه‌بندی‌های متوسط ​​​​رو به رشد باشند.

فیلد movie_update شامل یک آرگومان id مورد انتظار برای شناسایی یک رکورد و یک فیلد data است که می‌توانید برای تنظیم مقادیر در این به‌روزرسانی از آن استفاده کنید.

mutation UpdateMovie(
  $id: UUID!,
  $genre: String!,
  $rating: Int!,
  $description: String!
) {
  movie_update(id: $id,
    data: {
      genre: $genre
      rating: $rating
      description: $description
    })
}

برای انجام چندین به‌روزرسانی، از فیلد movie_updateMany استفاده کنید.

# Multiple updates (increase all ratings of a genre)
mutation IncreaseRatingForGenre($genre: String!, $rating: Int!) {
  movie_updateMany(
    where: { genre: { eq: $genre } },
    data:
      {
        rating: $rating
      })
}

استفاده از عملیات افزایش، کاهش، افزودن و اضافه کردن به ابتدای متغیر با _update

در حالی که در جهش‌های _update و _updateMany می‌توانید صریحاً مقادیر را در data: تنظیم کنید، اغلب اعمال عملگری مانند increment برای به‌روزرسانی مقادیر منطقی‌تر است.

برای اصلاح مثال به‌روزرسانی قبلی، فرض کنید می‌خواهید امتیاز یک فیلم خاص را افزایش دهید. می‌توانید از سینتکس rating_update به همراه عملگر inc استفاده کنید.

mutation UpdateMovie(
  $id: UUID!,
  $ratingIncrement: Int!
) {
  movie_update(id: $id, data: {
    rating_update: {
      inc: $ratingIncrement
    }
  })
}

Data Connect از عملگرهای زیر برای به‌روزرسانی فیلدها پشتیبانی می‌کند:

  • inc برای افزایش انواع داده Int ، Int64 ، Float ، Date و Timestamp
  • dec برای کاهش اعداد از نوع داده Int ، Int64 ، Float ، Date و Timestamp

برای لیست‌ها، می‌توانید با استفاده از موارد زیر، مقادیر تکی یا لیستی از مقادیر را به‌روزرسانی کنید:

  • اگر آیتم(ها) از قبل در انواع لیست وجود ندارند، به جز لیست‌های برداری، آنها را اضافه یا اضافه add
  • remove برای حذف همه موارد، در صورت وجود، از انواع لیست، به جز لیست‌های برداری
  • برای اضافه کردن آیتم(ها) به انواع لیست، به جز لیست‌های برداری، append .
  • برای اضافه کردن آیتم(ها) به انواع لیست، به جز لیست‌های برداری، prepend .

انجام حذف‌ها

البته می‌توانید داده‌های فیلم را حذف کنید. متخصصان حفاظت از فیلم قطعاً می‌خواهند که فیلم‌های فیزیکی تا حد امکان حفظ شوند.

# Delete by key
mutation DeleteMovie($id: UUID!) {
  movie_delete(id: $id)
}

در اینجا می‌توانید از _deleteMany استفاده کنید.

# Multiple deletes
mutation DeleteUnpopularMovies($minRating: Int!) {
  movie_deleteMany(where: { rating: { le: $minRating } })
}

جهش‌ها را روی روابط بنویسید

نحوه استفاده از جهش ضمنی _upsert در یک رابطه مشاهده کنید.

# Create or update a one to one relation
mutation MovieMetadataUpsert($movieId: UUID!, $director: String!) {
  movieMetadata_upsert(
    data: { movie: { id: $movieId }, director: $director }
  )
}

طرحواره‌های طراحی برای جهش‌های کارآمد

Data Connect دو ویژگی مهم ارائه می‌دهد که به شما امکان می‌دهد جهش‌های کارآمدتری بنویسید و عملیات رفت و برگشت را ذخیره کنید.

اسکالرهای کلیدی، شناسه‌های شیء مختصری هستند که Data Connect به طور خودکار از فیلدهای کلیدی در طرحواره‌های شما جمع‌آوری می‌کند. اسکالرهای کلیدی در مورد کارایی هستند و به شما امکان می‌دهند در یک فراخوانی واحد، اطلاعاتی در مورد هویت و ساختار داده‌های خود پیدا کنید. آن‌ها به ویژه زمانی مفید هستند که می‌خواهید اقدامات متوالی را روی رکوردهای جدید انجام دهید و به یک شناسه منحصر به فرد برای انتقال به عملیات‌های بعدی نیاز دارید، و همچنین زمانی که می‌خواهید به کلیدهای رابطه‌ای برای انجام عملیات پیچیده‌تر دسترسی داشته باشید.

با استفاده از مقادیر سرور ، می‌توانید به طور مؤثر به سرور اجازه دهید تا فیلدهای جداول شما را با استفاده از مقادیر ذخیره شده یا به راحتی قابل محاسبه، مطابق با عبارات CEL سمت سرور خاص در آرگومان expr ، به صورت پویا پر کند. به عنوان مثال، می‌توانید فیلدی را با یک مهر زمانی تعریف کنید که هنگام دسترسی به فیلد با استفاده از زمان ذخیره شده در یک درخواست عملیات، updatedAt: Timestamp! @default(expr: "request.time") اعمال می‌شود.

جهش‌های پیشرفته بنویسید: اجازه دهید Data Connect با استفاده از سینتکس field_expr مقادیر را ارائه دهد

همانطور که در بخش اسکالرهای کلیدی و مقادیر سرور بحث شد، می‌توانید طرح خود را طوری طراحی کنید که سرور در پاسخ به درخواست‌های کلاینت، مقادیر مربوط به فیلدهای رایج مانند id ها و تاریخ‌ها را پر کند.

علاوه بر این، می‌توانید از داده‌هایی مانند شناسه‌های کاربری که در اشیاء request Data Connect از برنامه‌های کلاینت ارسال می‌شوند، استفاده کنید.

هنگام پیاده‌سازی جهش‌ها، از سینتکس field_expr برای راه‌اندازی به‌روزرسانی‌های تولید شده توسط سرور یا دسترسی به داده‌های درخواست‌ها استفاده کنید. برای مثال، برای ارسال شناسه کاربری uid ذخیره شده در یک درخواست به عملیات _upsert ، "auth.uid" را در فیلد userId_expr وارد کنید.

# Add a movie to the user's favorites list
mutation AddFavoritedMovie($movieId: UUID!) @auth(level: USER) {
  favorite_movie_upsert(data: { userId_expr: "auth.uid", movieId: $movieId })
}

# Remove a movie from the user's favorites list
mutation DeleteFavoritedMovie($movieId: UUID!) @auth(level: USER) {
  favorite_movie_delete(key: { userId_expr: "auth.uid", movieId: $movieId })
}

یا در یک برنامه‌ی آشنای فهرست کارها، هنگام ایجاد یک فهرست کارهای جدید، می‌توانید id_expr ارسال کنید تا به سرور دستور دهید که به طور خودکار یک UUID برای فهرست تولید کند.

mutation CreateTodoListWithFirstItem(
  $listName: String!
) @transaction {
  # Step 1
  todoList_insert(data: {
    id_expr: "uuidV4()", # <-- auto-generated. Or a column-level @default on `type TodoList` will also work
    name: $listName,
  })
}

برای اطلاعات بیشتر، به اسکالر‌های _Expr در مرجع اسکالر‌ها مراجعه کنید.

جهش‌های پیشرفته بنویسید: عملیات چند مرحله‌ای

موقعیت‌های زیادی وجود دارد که ممکن است بخواهید چندین فیلد نوشتن (مانند درج) را در یک جهش بگنجانید. همچنین ممکن است بخواهید در حین اجرای یک جهش، پایگاه داده خود را بخوانید تا قبل از انجام کارهایی مانند درج یا به‌روزرسانی، داده‌های موجود را جستجو و تأیید کنید. این گزینه‌ها باعث صرفه‌جویی در عملیات رفت و برگشت و در نتیجه هزینه‌ها می‌شوند.

Data Connect به شما امکان می‌دهد منطق چند مرحله‌ای را در جهش‌های خود با پشتیبانی از موارد زیر انجام دهید:

  • چندین فیلد نوشتن

  • چندین فیلد خواندنی در جهش‌های شما (با استفاده از کلمه کلیدی فیلد query ).

  • دستورالعمل @transaction که پشتیبانی از تراکنش‌ها را که در پایگاه‌های داده رابطه‌ای آشنا هستند، فراهم می‌کند.

  • دستورالعمل @check که به شما امکان می‌دهد محتوای خوانده‌ها را با استفاده از عبارات CEL و بر اساس نتایج چنین ارزیابی ارزیابی کنید:

    • با ایجاد، به‌روزرسانی و حذف‌های تعریف‌شده توسط یک جهش ادامه دهید
    • ادامه دهید تا نتایج یک فیلد پرس و جو را برگردانید
    • از پیام‌های برگشتی برای انجام منطق مناسب در کد کلاینت خود استفاده کنید
  • دستورالعمل @redact که به شما امکان می‌دهد نتایج فیلد پرس‌وجو را از نتایج پروتکل سیم حذف کنید.

  • اتصال response CEL، که نتایج انباشته شده از تمام جهش‌ها و پرس‌وجوهای انجام شده در یک عملیات پیچیده و چند مرحله‌ای را ذخیره می‌کند. می‌توانید به اتصال response دسترسی داشته باشید:

    • در دستورالعمل‌های @check ، از طریق آرگومان expr:
    • با مقادیر سرور، با استفاده از سینتکس field_expr

دستورالعمل @transaction

پشتیبانی از جهش‌های چند مرحله‌ای شامل مدیریت خطا با استفاده از تراکنش‌ها می‌شود.

دستورالعمل @transaction الزام می‌کند که یک جهش - چه با یک فیلد نوشتن (مثلاً _insert یا _update ) و چه با چندین فیلد نوشتن - همیشه در یک تراکنش پایگاه داده اجرا شود.

  • جهش‌های بدون @transaction هر فیلد ریشه را یکی پس از دیگری و به ترتیب اجرا می‌کنند. این عملیات هرگونه خطا را به عنوان خطاهای جزئی فیلد نشان می‌دهد، اما اثرات اجراهای بعدی را نشان نمی‌دهد.

  • جهش‌هایی که با @transaction انجام می‌شوند، یا کاملاً موفق می‌شوند یا کاملاً شکست می‌خورند. اگر هر یک از فیلدهای درون تراکنش با شکست مواجه شود، کل تراکنش به حالت اولیه خود برمی‌گردد.

دستورالعمل‌های @check و @redact

دستور @check تأیید می‌کند که فیلدهای مشخص شده در نتایج پرس‌وجو وجود دارند. یک عبارت زبان عبارات مشترک (CEL) برای آزمایش مقادیر فیلدها استفاده می‌شود. رفتار پیش‌فرض این دستور، بررسی و رد گره‌هایی است که مقدار آنها null یا [] (لیست‌های خالی) باشد.

دستور @redact بخشی از پاسخ دریافتی از کلاینت را حذف می‌کند. فیلدهای حذف‌شده همچنان برای بررسی عوارض جانبی (از جمله تغییرات داده‌ها و @check ) ارزیابی می‌شوند و نتایج همچنان برای مراحل بعدی در عبارات CEL در دسترس هستند.

از @check ، @check(message:) و @redact استفاده کنید

یکی از کاربردهای اصلی @check و @redact جستجوی داده‌های مرتبط برای تصمیم‌گیری در مورد مجاز بودن یا نبودن عملیات خاص است که با استفاده از جستجو در منطق اما پنهان کردن آن از دید کلاینت‌ها انجام می‌شود. کوئری شما می‌تواند پیام‌های مفیدی را برای مدیریت صحیح در کد کلاینت برگرداند.

برای مثال، فیلد پرس‌وجوی زیر بررسی می‌کند که آیا درخواست‌کننده نقش "مدیر" مناسبی برای مشاهده کاربرانی که می‌توانند یک فیلم را ویرایش کنند، دارد یا خیر.

query GetMovieEditors($movieId: UUID!) @auth(level: USER) {
  moviePermission(key: { movieId: $movieId, userId_expr: "auth.uid" }) @redact {
    role @check(expr: "this == 'admin'", message: "You must be an admin to view all editors of a movie.")
  }
  moviePermissions(where: { movieId: { eq: $movieId }, role: { eq: "editor" } }) {
    user {
      id
      username
    }
  }
}

برای کسب اطلاعات بیشتر در مورد دستورالعمل‌های @check و @redact در بررسی‌های مجوز، به بحث جستجوی داده‌های مجوز مراجعه کنید.

برای اعتبارسنجی کلیدها از @check استفاده کنید

برخی از فیلدهای جهش، مانند _update ، ممکن است در صورت عدم وجود رکوردی با کلید مشخص، no-op شوند. به طور مشابه، جستجوها ممکن است null یا یک لیست خالی را برگردانند. این موارد خطا محسوب نمی‌شوند و بنابراین باعث rollback نمی‌شوند.

برای جلوگیری از این نتیجه، با استفاده از دستور @check بررسی کنید که آیا کلیدها یافت می‌شوند یا خیر.

# Delete by key, error if not found
mutation MustDeleteMovie($id: UUID!) @transaction {
  movie_delete(id: $id) @check(expr: "this != null", message: "Movie not found, therefore nothing is deleted")
}

از اتصال response برای زنجیره‌ای کردن جهش‌های چند مرحله‌ای استفاده کنید

رویکرد اساسی برای ایجاد رکوردهای مرتبط، برای مثال یک Movie جدید و یک ورودی MovieMetadata مرتبط، به شرح زیر است:

  1. یک جهش _insert برای Movie فراخوانی کنید
  2. کلید برگردانده شده از فیلم ایجاد شده را ذخیره کنید
  3. سپس، یک جهش _insert دوم را برای ایجاد رکورد MovieMetadata فراخوانی کنید.

اما با Data Connect ، می‌توانید این مورد رایج را در یک عملیات چند مرحله‌ای با دسترسی به نتایج اولین _insert در دومین _insert مدیریت کنید.

ساختن یک اپلیکیشن نقد فیلم موفق کار زیادی می‌برد. بیایید لیست کارهایمان را با یک مثال جدید بررسی کنیم.

استفاده از response برای تنظیم فیلدها با مقادیر سرور

در جهش لیست کارهای زیر:

  • اتصال response ، شیء پاسخ جزئی تا کنون را نشان می‌دهد، که شامل تمام فیلدهای جهش سطح بالا قبل از فیلد فعلی است.
  • نتایج عملیات اولیه todoList_insert ، که فیلد id (کلید) را برمی‌گرداند، بعداً در response.todoList_insert.id قابل دسترسی هستند تا بتوانیم بلافاصله یک آیتم جدید برای انجام کار وارد کنیم.
mutation CreateTodoListWithFirstItem(
  $listName: String!,
  $itemContent: String!
) @transaction {
  # Sub-step 1:
  todoList_insert(data: {
    id_expr: "uuidV4()", # <-- auto-generated. Or a column-level @default on `type TodoList` will also work
    name: $listName,
  })
  # Sub-step 2:
  todo_insert(data: {
    listId_expr: "response.todoList_insert.id" # <-- Grab the newly generated ID from the partial response so far.
    content: $itemContent,
  })
}

استفاده از response برای اعتبارسنجی فیلدها با استفاده از @check

response در @check(expr: "...") ‎ نیز موجود است، بنابراین می‌توانید از آن برای ساخت منطق سمت سرور پیچیده‌تر استفاده کنید. با ترکیب مراحل query { … } در جهش‌ها، می‌توانید بدون هیچ رفت و برگشت اضافی بین کلاینت و سرور، به موارد بسیار بیشتری دست یابید.

در مثال زیر، توجه داشته باشید: @check از قبل به response.query دسترسی دارد زیرا @check همیشه بعد از مرحله‌ای که به آن متصل است اجرا می‌شود.

mutation CreateTodoInNamedList(
  $listName: String!,
  $itemContent: String!
) @transaction {
  # Sub-step 1: Look up List.id by its name
  query
  @check(expr: "response.query.todoLists.size() > 0", message: "No such TodoList with the name!")
  @check(expr: "response.query.todoLists.size() < 2", message: "Ambiguous listName!") {
    todoLists(where: { name: $listName }) {
      id
    }
  }
  # Sub-step 2:
  todo_insert(data: {
    listId_expr: "response.todoLists[0].id" # <-- Now we have the parent list ID to insert to
    content: $itemContent,
  })
}

برای اطلاعات بیشتر در مورد اتصال response ، به مرجع CEL مراجعه کنید.

درک عملیات‌های متوقف‌شده با @transaction و query @check

جهش‌های چند مرحله‌ای می‌توانند با خطاهایی مواجه شوند:

  • عملیات پایگاه داده ممکن است با شکست مواجه شود.
  • منطق query @check ممکن است عملیات را خاتمه دهد.

Data Connect توصیه می‌کند که از دستورالعمل @transaction با جهش‌های چند مرحله‌ای خود استفاده کنید. این امر منجر به یک پایگاه داده سازگارتر و نتایج جهش می‌شود که مدیریت آنها در کد کلاینت آسان‌تر است:

  • در اولین خطا یا @check ناموفق، عملیات خاتمه می‌یابد، بنابراین نیازی به مدیریت اجرای فیلدهای بعدی یا ارزیابی CEL نیست.
  • رول‌بک‌ها در پاسخ به خطاهای پایگاه داده یا منطق @check انجام می‌شوند و وضعیت پایگاه داده را به طور مداوم پایدار نگه می‌دارند.
  • یک خطای بازگشت به عقب همیشه به کد کلاینت برگردانده می‌شود.

ممکن است در برخی موارد استفاده، شما استفاده @transaction را انتخاب نکنید: اگر به عنوان مثال به توان عملیاتی، مقیاس‌پذیری یا در دسترس بودن بالاتر نیاز دارید، می‌توانید سازگاری نهایی را انتخاب کنید. با این حال، برای دستیابی به نتایج، باید پایگاه داده و کد کلاینت خود را مدیریت کنید:

  • اگر یک فیلد به دلیل عملیات پایگاه داده از کار بیفتد، فیلدهای بعدی به اجرای خود ادامه می‌دهند. با این حال، @check های ناموفق همچنان کل عملیات را خاتمه می‌دهند.
  • رول‌بک‌ها انجام نمی‌شوند، به این معنی که وضعیت پایگاه داده ترکیبی است و برخی به‌روزرسانی‌ها موفق و برخی دیگر ناموفق هستند.
  • اگر منطق @check شما از نتایج خواندن‌ها و/یا نوشتن‌ها در مرحله قبل استفاده کند، عملیات شما با @check ممکن است نتایج متناقض‌تری ارائه دهد.
  • نتیجه‌ای که به کد کلاینت برگردانده می‌شود، شامل ترکیبی پیچیده‌تر از پاسخ‌های موفقیت و شکست خواهد بود که باید مدیریت شوند.

دستورالعمل‌های جهش‌های Data Connect

علاوه بر دستورالعمل‌هایی که در تعریف انواع و جداول استفاده می‌کنید، Data Connect دستورالعمل‌های @auth ، @check ، @redact و @transaction را برای بهبود رفتار عملیات ارائه می‌دهد.

دستورالعمل قابل اجرا برای توضیحات
@auth پرس‌وجوها و جهش‌ها سیاست مجوزدهی برای یک پرس‌وجو یا جهش را تعریف می‌کند. به راهنمای مجوزدهی و گواهی‌دهی مراجعه کنید.
@check فیلدهای query در عملیات چند مرحله‌ای تأیید می‌کند که فیلدهای مشخص شده در نتایج پرس و جو وجود دارند. یک عبارت زبان عبارات مشترک (CEL) برای آزمایش مقادیر فیلد استفاده می‌شود. به عملیات چند مرحله‌ای مراجعه کنید.
@redact پرس‌وجوها بخشی از پاسخ دریافتی از کلاینت را حذف می‌کند. به عملیات چند مرحله‌ای مراجعه کنید.
@transaction جهش‌ها اجرای همیشگی یک جهش در تراکنش پایگاه داده را الزامی می‌کند. به عملیات چند مرحله‌ای مراجعه کنید.

مراحل بعدی

ممکن است به موارد زیر علاقه داشته باشید: