ডেটা কানেক্ট মিউটেশন বাস্তবায়ন করুন

Firebase Data Connect আপনাকে Google Cloud SQL এর মাধ্যমে পরিচালিত আপনার PostgreSQL দৃষ্টান্তগুলির জন্য সংযোগকারী তৈরি করতে দেয়৷ এই সংযোগকারীগুলি আপনার স্কিমা থেকে আপনার ডেটা ব্যবহার করার জন্য একটি প্রশ্ন এবং মিউটেশনের সংমিশ্রণ।

শুরু করুন গাইড PostgreSQL-এর জন্য একটি মুভি পর্যালোচনা অ্যাপ স্কিমা প্রবর্তন করেছে।

সেই নির্দেশিকা মিউটেশন সহ নিয়োজিত এবং অ্যাডহক উভয় প্রশাসনিক ক্রিয়াকলাপও চালু করেছিল।

  • ডিপ্লোয়েবল মিউটেশনগুলি হল যেগুলিকে আপনি একটি সংযোগকারীতে ক্লায়েন্ট অ্যাপ থেকে কল করার জন্য প্রয়োগ করেন, আপনার সংজ্ঞায়িত API এন্ডপয়েন্ট সহ। Data Connect এই মিউটেশনগুলিতে প্রমাণীকরণ এবং অনুমোদনকে একীভূত করে এবং আপনার API-এর উপর ভিত্তি করে ক্লায়েন্ট SDK তৈরি করে।
  • অ্যাডহক অ্যাডমিনিস্ট্রেটিভ মিউটেশনগুলি বিশেষ সুবিধাপ্রাপ্ত পরিবেশ থেকে সঞ্চালিত হয় টেবিলগুলি জনসংখ্যা এবং পরিচালনা করার জন্য। আপনি Firebase Admin SDK ব্যবহার করে বিশেষ সুবিধাপ্রাপ্ত পরিবেশ থেকে এবং আমাদের ডেটা কানেক্ট VS কোড এক্সটেনশন ব্যবহার করে স্থানীয় উন্নয়ন পরিবেশে Firebase কনসোলে এগুলি তৈরি এবং চালাতে পারেন।

এই নির্দেশিকাটি স্থাপনযোগ্য মিউটেশনগুলিকে গভীরভাবে বিবেচনা করে।

Data Connect মিউটেশনের বৈশিষ্ট্য

Data Connect আপনাকে একটি PostgreSQL ডাটাবেস দেওয়া সমস্ত উপায়ে মৌলিক মিউটেশনগুলি সম্পাদন করতে দেয়:

  • CRUD অপারেশন সঞ্চালন
  • লেনদেনের সাথে মাল্টি-স্টেপ অপারেশন পরিচালনা করুন

কিন্তু GraphQL-তে Data Connect এক্সটেনশনের সাথে, আপনি দ্রুত, আরও দক্ষ অ্যাপের জন্য উন্নত মিউটেশন প্রয়োগ করতে পারেন:

  • রেকর্ডে পুনরাবৃত্ত ক্রিয়াকলাপগুলিকে সহজ করার জন্য অনেকগুলি অপারেশন দ্বারা ফিরে আসা কী স্কেলারগুলি ব্যবহার করুন৷
  • সার্ভার দ্বারা প্রদত্ত ক্রিয়াকলাপগুলির সাথে ডেটা তৈরি করতে সার্ভার মান ব্যবহার করুন
  • ডেটা খুঁজতে, কোডের লাইন সংরক্ষণ এবং সার্ভারে রাউন্ড ট্রিপ করার জন্য মাল্টি-স্টেপ মিউটেশন অপারেশনের কোর্সে প্রশ্নগুলি সম্পাদন করুন।

মিউটেশন বাস্তবায়ন করতে উত্পন্ন ক্ষেত্র ব্যবহার করুন

আপনার 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 মিউটেশন। ঠিক যেমন একটি নিয়মিত গ্রাফকিউএল মিউটেশনের সাথে, আপনি একটি অপারেশনের নাম এবং গ্রাফকিউএল ভেরিয়েবলের একটি তালিকা নির্ধারণ করতে পারেন।

ডেটা কানেক্ট @auth এবং @transaction মতো কাস্টমাইজ করা নির্দেশাবলী সহ GraphQL প্রশ্নগুলিকে প্রসারিত করে।

সুতরাং নিম্নলিখিত মিউটেশন আছে:

  • একটি 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: , এটি প্রায়শই মান আপডেট করার জন্য বৃদ্ধির মত একটি অপারেটর প্রয়োগ করা আরও বোধগম্য হয়।

আগের আপডেটের উদাহরণটি পরিবর্তন করতে, ধরে নিন আপনি একটি নির্দিষ্ট সিনেমার রেটিং বাড়াতে চান। আপনি inc অপারেটরের সাথে rating_update সিনট্যাক্স ব্যবহার করতে পারেন।

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 স্বয়ংক্রিয়ভাবে আপনার স্কিমাগুলির মূল ক্ষেত্রগুলি থেকে একত্রিত হয়৷ মূল স্কেলারগুলি দক্ষতা সম্পর্কে, যা আপনাকে আপনার ডেটার পরিচয় এবং গঠন সম্পর্কে একটি একক কলের তথ্য খুঁজে পেতে দেয়৷ এগুলি বিশেষভাবে উপযোগী হয় যখন আপনি নতুন রেকর্ডে ক্রমিক ক্রিয়া সম্পাদন করতে চান এবং আসন্ন ক্রিয়াকলাপগুলিতে পাস করার জন্য একটি অনন্য শনাক্তকারীর প্রয়োজন হয় এবং এছাড়াও আপনি অতিরিক্ত জটিল ক্রিয়াকলাপগুলি সম্পাদন করার জন্য রিলেশনাল কীগুলি অ্যাক্সেস করতে চান৷

সার্ভার মান ব্যবহার করে, আপনি expr আর্গুমেন্টে নির্দিষ্ট সার্ভার-সাইড CEL এক্সপ্রেশন অনুযায়ী সঞ্চিত বা সহজে-গণনাযোগ্য মান ব্যবহার করে সার্ভারটিকে আপনার টেবিলে গতিশীলভাবে ক্ষেত্রগুলিকে পপুলেট করতে দিতে পারেন। উদাহরণস্বরূপ, আপনি একটি ক্ষেত্র সংজ্ঞায়িত করতে পারেন একটি টাইমস্ট্যাম্প প্রয়োগ করে যখন ফিল্ডটি একটি অপারেশন অনুরোধে সংরক্ষিত সময় ব্যবহার করে অ্যাক্সেস করা হয়, updatedAt: Timestamp! @default(expr: "request.time")

উন্নত মিউটেশন লিখুন: field_expr সিনট্যাক্স ব্যবহার করে Data Connect মান সরবরাহ করতে দিন

মূল স্কেলার এবং সার্ভারের মানগুলিতে যেমন আলোচনা করা হয়েছে, আপনি আপনার স্কিমা ডিজাইন করতে পারেন যাতে সার্ভারটি ক্লায়েন্টের অনুরোধের প্রতিক্রিয়া হিসাবে id এবং তারিখের মতো সাধারণ ক্ষেত্রের মানগুলি পূরণ করে।

এছাড়াও, আপনি ক্লায়েন্ট অ্যাপ থেকে Data Connect request অবজেক্টে পাঠানো ইউজার আইডির মতো ডেটা ব্যবহার করতে পারেন।

আপনি যখন মিউটেশনগুলি প্রয়োগ করেন, তখন সার্ভার-জেনারেটেড আপডেট ট্রিগার করতে বা অনুরোধ থেকে ডেটা অ্যাক্সেস করতে field_expr সিনট্যাক্স ব্যবহার করুন। উদাহরণস্বরূপ, একটি _upsert অপারেশনের অনুরোধে সংরক্ষিত অনুমোদন uid পাস করতে, userId_expr ক্ষেত্রে "auth.uid" পাস করুন।

# 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 })
}

অথবা, একটি পরিচিত করণীয় তালিকা অ্যাপে, একটি নতুন করণীয় তালিকা তৈরি করার সময়, আপনি তালিকার জন্য একটি UUID স্বয়ংক্রিয়ভাবে তৈরি করতে সার্ভারকে নির্দেশ দিতে id_expr পাস করতে পারেন।

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 নির্দেশিকা , যা আপনাকে ওয়্যার প্রোটোকল ফলাফল থেকে কোয়েরি ক্ষেত্রের ফলাফল বাদ দিতে দেয়।

  • CEL response বাইন্ডিং, যা একটি জটিল, বহু-পদক্ষেপ অপারেশনে সম্পাদিত সমস্ত মিউটেশন এবং প্রশ্নের সঞ্চিত ফলাফল সংরক্ষণ করে। আপনি response বাইন্ডিং অ্যাক্সেস করতে পারেন:

    • @check নির্দেশাবলীতে, expr: আর্গুমেন্টের মাধ্যমে
    • সার্ভার মান সহ, field_expr সিনট্যাক্স ব্যবহার করে

@transaction নির্দেশিকা

মাল্টি-স্টেপ মিউটেশনের সমর্থনে লেনদেন ব্যবহার করে ত্রুটি পরিচালনা করা অন্তর্ভুক্ত।

@transaction নির্দেশিকা প্রয়োগ করে যে একটি মিউটেশন - হয় একটি একক লেখার ক্ষেত্র সহ (উদাহরণস্বরূপ, _insert বা _update ) অথবা একাধিক লেখার ক্ষেত্র সহ - সর্বদা একটি ডাটাবেস লেনদেনে চলে।

  • @transaction ছাড়া মিউটেশন প্রতিটি রুট ফিল্ডকে একের পর এক ক্রমানুসারে কার্যকর করে। অপারেশনটি আংশিক ক্ষেত্রের ত্রুটি হিসাবে যেকোন ত্রুটিকে প্রকাশ করে, তবে পরবর্তী মৃত্যুদন্ডের প্রভাব নয়।

  • @transaction সাথে মিউটেশনগুলি সম্পূর্ণরূপে সফল বা সম্পূর্ণরূপে ব্যর্থ হওয়ার গ্যারান্টিযুক্ত। লেনদেনের মধ্যে যেকোনও ক্ষেত্র ব্যর্থ হলে, পুরো লেনদেন ফিরিয়ে দেওয়া হয়।

@check এবং @redact নির্দেশিকা

@check নির্দেশিকা যাচাই করে যে নির্দিষ্ট ক্ষেত্রগুলি প্রশ্নের ফলাফলগুলিতে উপস্থিত রয়েছে৷ একটি কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (সিইএল) এক্সপ্রেশন ফিল্ডের মান পরীক্ষা করতে ব্যবহৃত হয়। নির্দেশের ডিফল্ট আচরণ হল নোডের জন্য চেক করা এবং প্রত্যাখ্যান করা যার মান 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 , একটি নির্দিষ্ট কী সহ একটি রেকর্ড বিদ্যমান না থাকলে নো-অপ হতে পারে। একইভাবে, লুকআপ শূন্য বা খালি তালিকা দিতে পারে। এগুলিকে ত্রুটি হিসাবে বিবেচনা করা হয় না এবং তাই রোলব্যাকগুলিকে ট্রিগার করবে না৷

এই ফলাফল থেকে রক্ষা পেতে, @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. Movie জন্য একটি _insert মিউটেশন কল করুন
  2. তৈরি সিনেমার ফেরত চাবি সংরক্ষণ করুন
  3. তারপর, MovieMetadata রেকর্ড তৈরি করতে একটি দ্বিতীয় _insert মিউটেশনে কল করুন।

কিন্তু Data Connect সাহায্যে, আপনি দ্বিতীয় _insert এ প্রথম _insert এর ফলাফলগুলি অ্যাক্সেস করে একটি একক বহু-পদক্ষেপ অপারেশনে এই সাধারণ কেসটি পরিচালনা করতে পারেন।

একটি সফল মুভি রিভিউ অ্যাপ তৈরি করা অনেক কাজ। একটি নতুন উদাহরণ সহ আমাদের করণীয় তালিকা ট্র্যাক করা যাক।

সার্ভার মান সহ ক্ষেত্র সেট করতে response ব্যবহার করুন

নিম্নলিখিত করণীয় তালিকার মিউটেশনে:

  • response বাইন্ডিং এখন পর্যন্ত আংশিক রেসপন্স অবজেক্টের প্রতিনিধিত্ব করে, যার মধ্যে বর্তমানের আগে সব টপ-লেভেল মিউটেশন ফিল্ড রয়েছে।
  • প্রাথমিক todoList_insert অপারেশনের ফলাফল, যা id (কী) ক্ষেত্রটি প্রদান করে, পরে response.todoList_insert.id 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,
  })
}

@check ব্যবহার করে ক্ষেত্রগুলি যাচাই করতে response ব্যবহার করুন

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 মাধ্যমে বিঘ্নিত ক্রিয়াকলাপগুলি বুঝুন

বহু-পদক্ষেপ মিউটেশন ত্রুটির সম্মুখীন হতে পারে:

  • ডাটাবেস অপারেশন ব্যর্থ হতে পারে.
  • কোয়েরি @check লজিক অপারেশন বন্ধ করতে পারে।

Data Connect সুপারিশ করে যে আপনি আপনার মাল্টি-স্টেপ মিউটেশনের সাথে @transaction নির্দেশিকা ব্যবহার করুন। এর ফলে আরও সামঞ্জস্যপূর্ণ ডাটাবেস এবং মিউটেশনের ফলাফল পাওয়া যায় যা ক্লায়েন্ট কোডে পরিচালনা করা সহজ:

  • প্রথম ত্রুটি বা ব্যর্থ @check এ, অপারেশনটি বন্ধ হয়ে যাবে, তাই পরবর্তী ক্ষেত্রগুলির সম্পাদন বা CEL-এর মূল্যায়ন পরিচালনা করার প্রয়োজন নেই৷
  • রোলব্যাকগুলি ডাটাবেস ত্রুটির প্রতিক্রিয়া হিসাবে সঞ্চালিত হয় বা @check লজিক, একটি সামঞ্জস্যপূর্ণ ডাটাবেস অবস্থা প্রদান করে।
  • একটি রোলব্যাক ত্রুটি সর্বদা ক্লায়েন্ট কোডে ফিরে আসে।

এমন কিছু ব্যবহারের ক্ষেত্রে হতে পারে যেখানে আপনি @transaction ব্যবহার না করা বেছে নেন: আপনি যদি চূড়ান্ত সঙ্গতি বেছে নিতে পারেন, উদাহরণস্বরূপ, আপনার উচ্চতর থ্রুপুট, স্কেলেবিলিটি বা প্রাপ্যতা প্রয়োজন। যাইহোক, ফলাফলের জন্য আপনাকে আপনার ডাটাবেস এবং আপনার ক্লায়েন্ট কোড পরিচালনা করতে হবে:

  • ডাটাবেস ক্রিয়াকলাপের কারণে একটি ক্ষেত্র ব্যর্থ হলে, পরবর্তী ক্ষেত্রগুলি চালানো অব্যাহত থাকবে। যাইহোক, ব্যর্থ @check চেক এখনও পুরো অপারেশনটি বন্ধ করে দেয়।
  • রোলব্যাক সঞ্চালিত হয় না, মানে কিছু সফল আপডেট এবং কিছু ব্যর্থ আপডেট সহ একটি মিশ্র ডাটাবেস অবস্থা।
  • আপনার @check লজিক পূর্ববর্তী ধাপে পঠিত এবং/অথবা লেখার ফলাফল ব্যবহার করলে @check এর সাথে আপনার অপারেশনগুলি আরও অসঙ্গত ফলাফল দিতে পারে।
  • ক্লায়েন্ট কোডে ফিরে আসা ফলাফলে সফলতা এবং ব্যর্থতার প্রতিক্রিয়াগুলির আরও জটিল মিশ্রণ থাকবে যা পরিচালনা করা হবে।

Data Connect মিউটেশনের জন্য নির্দেশাবলী

ধরন এবং সারণী নির্ধারণে আপনি যে নির্দেশাবলী ব্যবহার করেন তার পাশাপাশি, Data Connect অপারেশনের আচরণ বাড়ানোর জন্য @auth , @check , @redact এবং @transaction নির্দেশাবলী প্রদান করে।

নির্দেশিকা এর জন্য প্রযোজ্য বর্ণনা
@auth প্রশ্ন এবং মিউটেশন একটি প্রশ্ন বা মিউটেশনের জন্য অনুমোদন নীতি সংজ্ঞায়িত করে। অনুমোদন এবং প্রত্যয়ন নির্দেশিকা দেখুন।
@check মাল্টি-স্টেপ অপারেশনে query ক্ষেত্র ক্যোয়ারী ফলাফলে নির্দিষ্ট ক্ষেত্র উপস্থিত আছে কিনা তা যাচাই করে। একটি কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (সিইএল) এক্সপ্রেশন ফিল্ডের মান পরীক্ষা করতে ব্যবহৃত হয়। মাল্টি-স্টেপ অপারেশন দেখুন।
@redact প্রশ্ন ক্লায়েন্ট থেকে প্রতিক্রিয়া একটি অংশ reacts. মাল্টি-স্টেপ অপারেশন দেখুন।
@transaction মিউটেশন একটি মিউটেশন সর্বদা একটি ডাটাবেস লেনদেনে চলে তা প্রয়োগ করে। মাল্টি-স্টেপ অপারেশন দেখুন।

পরবর্তী পদক্ষেপ

আপনি আগ্রহী হতে পারে: