الكتابة مباشرة إلى قاعدة البيانات

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

البيانات التي أريد إدخالها بسيطة للغاية: (عنوان الموضوع، المؤلف، الفئة، نص الجسم) وللمنشورات (المؤلف، نص الجسم).

ومع ذلك، أشك في أنه يجب إكمال حقول إضافية مختلفة وربما إجراء عمليات بحث في قاعدة بيانات المستخدم.

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

نسيت أيضًا أنني بحاجة إلى إضافة التاريخ/الوقت إلى كل منها (لا يمكنني تعديل مشاركتي الأصلية للتحديث).

هل يمكنك مشاركة المشكلات التي واجهتها؟

إعجابَين (2)

يمكنك الاطلاع على منشوراتي الأخرى. كانت تتعلق بـ:

  • مشكلات حد المعدل
  • مشكلات التحقق
  • تجاوز التحقق لا يعمل باستمرار للمواضيع مقابل الموضوعات
  • في النهاية، اعتقدت أنه سيكون من الأسهل الذهاب مباشرة إلى قاعدة البيانات.

بدلاً من ساعات من الإحباط في محاولة التعامل مع تقلبات واجهة برمجة التطبيقات، في غضون دقائق تمكنت من الحصول على شيء يعمل وربما يكون أكثر كفاءة:

بالنسبة لأولئك الذين يرغبون في فعل الشيء نفسه، ملاحظات من استكشافي حتى الآن:

أولاً، أدخل الحاوية:

sudo ./launcher enter app

ثم اتصل بقاعدة البيانات:

sudo -u postgres psql discourse

لإدراج موضوع:
insert into topics (title, user_id, archetype, fancy_title, category_id, created_at, updated_at, last_post_user_id, bumped_at) values ('psql test', 1, 'regular', 'psql test',8, NOW(), NOW(), 1, NOW());

احصل على المعرف الجديد، في حالتي 886.

ثم أدخل المشاركات:

insert into posts (user_id, topic_id, post_number, raw, cooked, created_at, updated_at, last_version_at) values (1,886,1,'this is the raw text','this is the cooked test',NOW(),NOW(),NOW());

ثم قم بتحديث posts_count (إذا لم يتم ذلك بالفعل عند إدراج الموضوع). لاحظ أنه يبدو أن نص الموضوع يحتاج إلى مشاركة أولية. التغييرات التالية لعدد المشاركات في الموضوع إلى 1:

update topics set posts_count=2 where id=886;

من المحتمل لأنك تستخدم حسابًا مختلفًا؟

3 إعجابات

أوصي بأن تكتشف كيفية استخدام واجهة برمجة التطبيقات (API). يتم التعامل مع الكثير من السحر بواسطة Rails. من المرجح أن تفعل شيئًا يجعل قاعدة بياناتك غير قابلة للاستخدام.

5 إعجابات

ولكن هل ترى أي شيء يمكن أن يحدث بشكل خاطئ إذا كنت تضيف فقط إلى جداول المواضيع والمنشورات وكانت مُشكّلة بشكل صحيح؟

هذه فكرة سيئة للغاية.

لماذا تعتقد أن هذا أسهل من استخدام واجهة برمجة التطبيقات (API) أو تشغيل أوامر Rails لإنشاء مشاركات؟

5 إعجابات

لم أكن على علم بأوامر rails لإنشاء مشاركات. هل لديك مزيد من التفاصيل حول هذا؟

نعم، التفاصيل هي: Discourse هو تطبيق Rails!

إعجاب واحد (1)

أنا على علم بأن Discourse هو تطبيق Rails. لكنك قلت:

لذا، فإنك تلمح إلى وجود طريقة أخرى لإنشاء سلاسل رسائل عن طريق إصدار “أوامر rails” ما لم تكن تقصد بأوامر rails إنشاء حسابات يدويًا وكتابتها في الواجهة الأمامية لـ Discourse؟

من الممارسات الجيدة استخدام واجهة برمجة التطبيقات (API) خاصةً إذا كنت تجري استدعاءً من خارج التطبيق، لأنها تتولى جميع عمليات المصادقة والترخيص بالإضافة إلى الكثير من منطق الأعمال الذي لا يمكنك افتراضه دائمًا.

إعجابَين (2)

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

سيكون من الجيد لو كان هناك استدعاء API “للمستخدم الخارق” يتجاوز كل هذه الفحوصات وينشئ المنشور أو الموضوع ببساطة.

على سبيل المثال، إذا كنت ترغب في استخدام واجهة برمجة التطبيقات لإنشاء موضوع لمستخدم لا يمتلك حاليًا الإذن بالنشر في فئة معينة، يمكنك استخدام المعلمة bypass_validations للقيام بذلك. ولكن عندما تستدعي واجهة برمجة التطبيقات لإنشاء رد من نفس المستخدم، لا يتم تخطي فحوصات التحقق ويفشل إنشاء الموضوع. (هذه مشكلة تم الإبلاغ عنها قبل 6 سنوات مع طلب سحب للإصلاح لم يتم تضمينه في قاعدة التعليمات البرمجية مطلقًا).

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

في الوقت الحالي، يبدو أن إدراج المشاركات/المواضيع يعمل بشكل جيد. كنت قلقًا بعض الشيء بشأن عمود ‘cooked’ لأنه لم يكن من الممكن تركه فارغًا، لكنني أقوم حاليًا بملئه بنفس النص الموجود في ‘raw’ مع ترك ‘baked_at’ و ‘baked_version’ فارغين.

عند العرض، يبدو أن عملية الخبز يتم تشغيلها بسرعة كبيرة عند عرض المنشور.

حسنًا. لقد وجدت طريقة لتشغيل إعادة الخبز:

rake posts:rebake

استخدم المواصفات واستورد البرامج النصية كدليل لمعالجة هياكل بيانات الخطاب عبر أوامر روبي.

استخدم وحدة تحكم Rails للتجارب.

3 إعجابات

تجدر الإشارة إلى أنه إذا كان عميلك مكتوبًا بلغة Ruby، فيمكنك استخدام جوهرة واجهة برمجة تطبيقات Ruby:

إعجاب واحد (1)

إذا قمت بإنشاء السجل باستخدام Rails، فسيقوم بإعادة الخبز تلقائيًا عند حفظ المنشور بالإضافة إلى إرسال الإشعارات ومجموعة من الأشياء الأخرى.

عند إنشاء المنشور باستخدام وصول مباشر إلى قاعدة البيانات، يبدو أن Discourse يقوم أيضًا بإعادة خبزه فورًا.

إعجاب واحد (1)