استخدام المعلمات في استعلامات Data Explorer

تُعد المعلمات أداة قوية يمكن استخدامها في استعلامات مستكشف البيانات على Discourse. تسمح المعلمات باستعلامات أكثر ديناميكية وقابلية للتخصيص، وبدلاً من ترميز القيم بشكل ثابت في استعلاماتك، يمكنك تعريف متغيرات تطالب بالإدخال عند تشغيل الاستعلام.

تعريف معلمة

لتعريف معلمة، يمكنك استخدام الصيغة التالية:

-- [params]
-- int :parameter_name = 10

سيبدأ قسم المعلمة في الاستعلام دائمًا بـ -- [params]، متبوعًا بنوع كل معلمة في سطر جديد، حيث سيتم استبدال parameter_name بالاسم الخاص بمعلمتك.

سيؤدي هذا إلى إنشاء حقل يمكنك فيه إدخال قيم مختلفة في كل مرة تقوم فيها بتشغيل الاستعلام.

أنواع المعلمات

عند تعريف المعلمات في استعلامات مستكشف البيانات، يمكنك تحديد أنواع مختلفة من المدخلات. فيما يلي أنواع المعلمات المتاحة وأوصافها:

معلمات رقمية

  • int: يعرض إدخال رقم، ويصبح قيمة رقمية. int مقيد بالأرقام ذات 32 بت.
  • bigint: مشابه لـ int، ولكنه يمكن أن يكون أكبر.
  • double: يسمح بالقيم العشرية.

سيتم التحقق من صحة المعلمات الرقمية على الواجهة الأمامية.

معلمات السلسلة النصية

  • string: مربع نص حر، يصبح قيمة نصية.

معلمات القائمة

  • int_list: أدخل أعدادًا صحيحة مفصولة بفواصل، وتصبح أعدادًا صحيحة مفصولة بفواصل في الاستعلام.
  • string_list: مشابه لـ int_list، ولكن للسلاسل النصية.

معلمات معرف محدد

  • post_id: إدخال رقمي؛ يضمن وجود المنشور المحدد في المنتدى قبل تشغيل الاستعلام.
  • topic_id: مشابه لـ post_id، ولكن للمواضيع.
  • badge_id: يضمن وجود الشارة المحددة.

معلمات منطقية

  • boolean: يعرض مربع اختيار.
  • null boolean: يعرض قائمة منسدلة، تسمح بإدخال فارغ.

معلمات الوقت

  • time: يعرض إدخال منتقي الوقت.
  • date: يعرض إدخال منتقي التاريخ.
  • datetime: يعرض مربع إدخال يتضمن التاريخ والوقت.

معلمات الاختيار

  • user_id: يعرض مربع اختيار المستخدم في Discourse، ويصبح معرف المستخدم الرقمي.
  • user_list: مشابه لـ user_id، ولكنه يسمح بعدة مستخدمين، ويصبح قائمة مفصولة بفواصل لمعرفات المستخدمين الرقمية.
  • group_id: مشابه لـ user_id، ولكن للمجموعات.
  • group_list: مشابه لـ user_list، ولكن للمجموعات.
  • category_id: مشابه لـ user_id، ولكن للفئات.

استخدام معلمات القائمة

عند استخدام معلمات القائمة (int_list، string_list، user_list)، يجب اتخاذ عناية خاصة لتجنب أخطاء بناء الجملة. إليك مثال على استخدام معلمة قائمة بشكل صحيح:

-- [params]
-- user_list :the_user_ids
SELECT SUM(length(bio_raw))
FROM user_profiles
WHERE user_id IN (:the_user_ids)

معلمات فارغة

يمكنك أيضًا السماح بإدخال فارغ عن طريق إضافة البادئة null إلى نوع المعلمة. هذا يعني أنه ليس من الضروري تقديم قيمة لتلك المعلمة عند تشغيل الاستعلام.

إليك بعض الأمثلة لكيفية تعريف هذه المعلمات:

-- [params]
-- null int :null_int
-- null boolean :null_boolean
-- null string :null_string

في SQL أعلاه، null_int و null_boolean و null_string هي معلمات يمكن تركها فارغة عند تشغيل الاستعلام.

دعنا نرى كيف يمكن استخدام هذه الأنواع من المعلمات في استعلام:

-- [params]
-- null int :post_id
-- null string :username
SELECT *
FROM users
WHERE (id = :post_id OR :post_id IS NULL)
AND (username = :username OR :username IS NULL)

في هذا الاستعلام، إذا لم يتم تقديم post_id أو username (أي تم تركهما كـ null)، فسيتجاهل الاستعلام هذا الجزء من جملة WHERE. هذا يسمح باستعلامات أكثر مرونة حيث تكون بعض الشروط اختيارية.

التحقق من صحة الواجهة الأمامية

سيتم التحقق من صحة معظم أنواع المعلمات على الواجهة الأمامية. تشمل هذه التحققات المدخلات المطلوبة ولكن غير المكتملة، والمدخلات الرقمية غير الصالحة، والفئات أو المجموعات غير الموجودة، والأوقات المشوهة، وما إلى ذلك. بالنسبة للمدخلات غير الصالحة، سيتم عرض سبب الخطأ في النموذج، وسيتم رفض عملية تشغيل الاستعلام.

أمثلة إضافية

فيما يلي بعض الأمثلة الإضافية لتعريف أنواع مختلفة من المعلمات:

-- [params]
-- int          :int = 3
-- bigint       :bigint = 12345678912345
-- boolean      :boolean
-- null boolean :boolean_three = #null
-- string       :string = little bunny foo foo
-- date         :date = 14 jul 2015
-- time         :time = 5:02 pm
-- datetime     :datetime = 14 jul 2015 5:02 pm
-- double       :double = 3.1415
-- string       :inet = 127.0.0.1/8
-- user_id      :user_id = system
-- post_id      :post_id = http://localhost:3000/t/adsfdsfajadsdafdsds-sf-awerjkldfdwe/21/1?u=system
-- topic_id     :topic_id = /t/-/21
-- int_list     :int_list = 1,2,3
-- string_list  :string_list = a,b,c
-- category_id  :category_id = meta
-- group_id     :group_id = admins
-- user_list    :mul_users = system,discobot

المزيد من المواضيع في هذه السلسلة

15 إعجابًا

هذه أدلة رائعة، شكراً لنشرها @SaraDev :slight_smile: :hugs:

6 إعجابات

@AlexDev
هل يمكن أن يكون اسم حقل في عبارة WHERE معلمة؟ شكرًا
أو هل يمكن أن تكون عبارة SQL بأكملها معلمة لتمريرها من نقطة نهاية REST /admin/plugin/explorer/queries/id/run

تنبيه: لا يمكنك استخدام الأرقام في أسماء المعلمات الخاصة بك، على سبيل المثال “foo123” ستفشل.

-- [params]
-- string       :foo123 = a

SELECT :foo123

يؤدي إلى

PG::SyntaxError: ERROR:  syntax error at or near ":"
LINE 10: SELECT :foo123
                ^
3 إعجابات

لقد حاولت إجراء استدعاء POST لنقطة النهاية run مع معلمات في حمولة JSON كما يلي:

payload = {
    "params": {
        "request_post_id": "45"
    },
    "explain": False
}

لقد قمت بالهندسة العكسية للحمولة من علامة تبويب أدوات المطور في Chrome.
بطريقة ما، ما زلت أتلقى خطأ 500 في الخادم.

هل يمكن لأحد أن يساعدني من فضلك؟