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

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

শুরু করার নির্দেশিকাটি PostgreSQL-এর জন্য একটি মুভি রিভিউ অ্যাপ স্কিমা চালু করেছে।

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

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

এই নির্দেশিকাটি স্থাপনযোগ্য মিউটেশনগুলির উপর আরও গভীর দৃষ্টিপাত করে।

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

ডেটা কানেক্ট @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 থেকে decrement 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 এবং dates এর মতো সাধারণ ক্ষেত্রগুলির জন্য মান পূরণ করে।

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

যখন আপনি মিউটেশন বাস্তবায়ন করেন, তখন সার্ভার-জেনারেটেড আপডেটগুলি ট্রিগার করতে বা অনুরোধ থেকে ডেটা অ্যাক্সেস করতে field_expr সিনট্যাক্স ব্যবহার করুন। উদাহরণস্বরূপ, একটি অনুরোধে সংরক্ষিত অনুমোদন uid একটি _upsert অপারেশনে পাস করতে, 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 })
}

অথবা, একটি পরিচিত করণীয় তালিকা অ্যাপে, একটি নতুন করণীয় তালিকা তৈরি করার সময়, আপনি 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 নির্দেশিকা , যা আপনাকে ওয়্যার প্রোটোকল ফলাফল থেকে কোয়েরি ফিল্ড ফলাফল বাদ দিতে দেয়।

  • CEL response বাইন্ডিং, যা একটি জটিল, বহু-পদক্ষেপের ক্রিয়াকলাপে সম্পাদিত সমস্ত মিউটেশন এবং প্রশ্নের সঞ্চিত ফলাফল সংরক্ষণ করে। আপনি 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 , যদি নির্দিষ্ট কী সহ কোনও রেকর্ড বিদ্যমান না থাকে তবে তা বন্ধ করে দেওয়া হতে পারে। একইভাবে, লুকআপগুলি নাল বা খালি তালিকা ফেরত দিতে পারে। এগুলি ত্রুটি হিসাবে বিবেচিত হয় না এবং তাই রোলব্যাক ট্রিগার করবে না।

এই ফলাফল থেকে রক্ষা পেতে, @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 (key) ক্ষেত্রটি ফেরত দেয়, পরে 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,
  })
}

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

@check(expr: "...") তেও response পাওয়া যায়, তাই আপনি এটি ব্যবহার করে আরও জটিল সার্ভার-সাইড লজিক তৈরি করতে পারেন। মিউটেশনের ক্ষেত্রে 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 ক্ষেত্রগুলি নির্দিষ্ট ক্ষেত্রগুলি কোয়েরির ফলাফলে উপস্থিত আছে কিনা তা যাচাই করে। ক্ষেত্রের মান পরীক্ষা করার জন্য একটি সাধারণ অভিব্যক্তি ভাষা (CEL) অভিব্যক্তি ব্যবহার করা হয়। বহু-পদক্ষেপের ক্রিয়াকলাপ দেখুন।
@redact প্রশ্ন ক্লায়েন্টের প্রতিক্রিয়ার একটি অংশ সম্পাদনা করে। বহু-পদক্ষেপের ক্রিয়াকলাপ দেখুন।
@transaction মিউটেশন একটি ডাটাবেস লেনদেনে সর্বদা একটি মিউটেশন চালানোর বিষয়টি জোরদার করে। মাল্টি-স্টেপ অপারেশন দেখুন।

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

আপনার আগ্রহ থাকতে পারে: