اذهب إلى المحتوى
  • 0

هل أستطيع عمل أكثر من أمر باستعلام واحد في postgresql

مضحي Modhy

السؤال

السلام عليكم 

اعمل على postgresql من خلال nodejs

احتاج في بعض المرات عمل الاتي :

١- التأكد من بيانات المستخدم

٢- التأكد من عدم تكرار الاسم المراد اضافته في جدول A

٣- تحديث بيانات الجدول B بعد عمل الاضافة في جدول A

…الخ

هل يوجد طريقة بحيث لا يتم الذهاب والرجوع من والى قاعدة البيانات بثلاثة استعلامات ، بحيث يكون الذهاب واحد والرجوع واحد ومحمل بالنتيجة المطلوبة سواء تم المطلوب او فشل؟

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1
بتاريخ 13 ساعات قال مضحي Modhy:

١- ألا يمكن عمل استعلام واحد لاختصار عمليتين او اكثر بقاعدة البيانات ؟

٢- خاصية اليونيك لا يمكنني معرفة الخطأ بهذه الحالة ؟ إلا من خلال فلترة نوع الخطأ فكيف اعرف ان الخطأ هو من هذا النوع ؟

ثم النقطة الاخيرة عرفت الفكرة ولكن كيف يمكن تطبيقها ؟

  1. نعم هذا في حال عملية الاستعلام لا يوجد بها منطق مثل الخطوة رقم 2، عمليات المنطق (التحقق من البيانات) نقوم بها في لغة البرمجة حصرا
  2. يمكنك معرفة الخطأ من رسالة الخطأ أو تحديده من المعرف الخاص به (23505 لخاصية ال unique_violation)
  3. لتنفيذ عدة عمليات معا
    • اذا كنت تستخدم مكتبة pg مباشرة كالتالي
      const { Pool } = require("pg");
      const pool = new Pool();
      
      pool.connect((err, client, done) => {
        const shouldAbort = (err) => {
          if (err) {
            console.error("Error in transaction", err.stack);
      
          // التراجع عن تنفيذ العمليات
            client.query("ROLLBACK", (err) => {
              if (err) {
                console.error("Error rolling back client", err.stack);
              }
              // release the client back to the pool
              done();
            });
          }
          return !!err;
        };
      
        client.query("BEGIN", (err) => {
          if (shouldAbort(err)) return;
          // بداية العمليات
      
          // INERT..., UPDATE...
      
          // نهاية العمليات
          client.query("COMMIT", (err) => {
            if (err) console.error("Error committing transaction", err.stack);
            done();
          });
        });
      });

       

    • اذا كنت تستخدم sequelize فالأمر أبسط

      try {
      
        const result = await sequelize.transaction(async (t) => {
          // نقوم بالعمليات هنا
          // مع تمرير الخاصية transaction
          
          // مثال
          const user = await User.create({
            name: 'Modhy',
          }, { transaction: t });
      
          //...
        });
      
        // الوصول إلى هنا يعني اتمام العمليات بنجاح
      
      } catch (error) {
        // أي خطأ يحدث خلال العمليات يتم التراجع عنه آليا والحصول على الخطأ
      }

       

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 1
  1. التأكد من البيانات يحتاج إما جلب البيانات و التأكد منها محليًا، أو التأكد منها مباشرة داخل قاعدة البيانات عبر الاستعلام (خطوة ضرورية)
  2. للتأكد من عدم تكرار الأسم يمكن الاعتماد على قاعدة البيانات نفسها لضمان ذلك عبر تعيين الخاصية UNIQUE لحقل الإسم داخل الجدول عند إنشاءه (لا حاجة للإستعلام يمكن اختصاره)
  3. الإضافة في A وتحديث البيانات في B هما عمليتا كتابة لا يمكن اختصارهما (خطوة ضرورية) لكن:
    • يمكن لهذه العملية أن تفشل بسبب تكرار الاسم (الخطوة 2) هنا نعلم بأن الإسم مكرر
    • عند فشل هذه العملية يجب الرجوع عن البيانات المضافة في كلا الجدولين نستفيد من مبدأ بداية وتأكيد العمليات Transaction في PostgreSQL حيث يقوم بالرجوع عن أي بيانات تمت اضافتها أو تعديلها خلال هذه العمليات
      BEGIN;
      -- بداية العمليات
      INSERT INTO A ... ;
      UPDATE B ... ;
      -- نهاية العمليات
      COMMIT;
       
تم التعديل في بواسطة Hassan Hedr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

١- ألا يمكن عمل استعلام واحد لاختصار عمليتين او اكثر بقاعدة البيانات ؟

٢- خاصية اليونيك لا يمكنني معرفة الخطأ بهذه الحالة ؟ إلا من خلال فلترة نوع الخطأ فكيف اعرف ان الخطأ هو من هذا النوع ؟

ثم النقطة الاخيرة عرفت الفكرة ولكن كيف يمكن تطبيقها ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...