يتعارض إخراج Ruby MySQL على خوادم مختلفة
-
21-12-2019 - |
سؤال
لقد قمت بترميز روبوت Ruby IRC الموجود على github (/ninjex/rubot) والذي به بعض المخرجات المتعارضة مع MySQL على خادم مخصص اشتريته للتو.
أولاً، لدينا الاتصال بقاعدة البيانات في مجلد MySQL (بتنسيق .gitignore) والذي يشبه كتلة التعليمات البرمجية التالية.
@con = Mysql.new('localhost', 'root', 'pword', 'db_name')
ثم لدينا وظيفة فعلية للاستعلام عن قاعدة البيانات
def db_query
que = get_message # Grabs query from user i.e,./db_query SELECT * FROM words
results = @con.query(que) # Send query through the connection i.e, @con.query("SELECT * FROM WORDS")
results.each {|x| chan_send(x)} # For each row returned, send it to the channel via
end
على جهازي المحلي، عند تشغيل الأمر:
./db_query SELECT amount, user from words WHERE user = 'Bob' and word = 'hello'
أتلقى الإخراج في IRC بطريقة تشبه المصفوفة: ["17", "Bob"]
حيث 17 هو المبلغ وبوب هو المستخدم.
ومع ذلك، فإن استخدام هذه الوظيفة نفسها على الخادم المخصص الخاص بي يؤدي إلى نتائج مثل: 17Bob
لقد حاولت إجراء العديد من التغييرات في الكود، بالإضافة إلى محاولة تحليل البيانات إلى متغير خاص بها، ولكن يبدو أن 17Bob
يظهر كمتغير واحد، مما يجعل من المستحيل تحليله إلى شيء مثل المصفوفة، والذي يمكنني بعد ذلك استخدامه لإرسال البيانات بشكل صحيح.
يبدو هذا غريبًا بالنسبة لي على كل من جهازي المحلي والخادم المخصص، حيث كنت أتوقع أن يرسل الإخراج أولاً 17 إلى IRC ثم بوب مثل:
17
Bob
بالنسبة لجميع الوظائف والمصدر، يمكنك التحقق من github /Ninjex/rubot الخاص بي، ولكن قد تحتاج إلى تثبيت بعض الأحجار الكريمة.
المحلول
بعض الملاحظات:
- تأكد من تعقيم الاستعلام عبر
get_message
.أو أنك تفتح نفسك لبعض الجدية مشاكل أمنية. - تأكد من أنك تستخدم نفس الإصدارات من MySQL Gem وRuby وMySql.قد تؤدي الاختلافات في أي منها إلى تغيير الناتج المتوقع.
- إذا كنت في قمة ذكائك وغير قادر على حل المشكلة الأساسية، فيمكنك دائمًا إرسال محدد مخصص واستخدامه للتقسيم.لسوء الحظ، سيؤدي ذلك إلى إفساد الحالة التي تعمل بالفعل وسيتعين إزالتها.
إليك كيفية التعامل مع تصحيح المشكلة على الجهاز المخصص:
def db_query
que = get_sanitized_message
results = @con.query(que)
require 'pry'
binding.pry
results.each {|x| chan_send(x)}
end
- أضف ال جوهرة نقب إلى Gemfile الخاص بك، أو
gem install pry
. - قم بتحديث الكود الخاص بك للاستخدام
pry
:أنظر فوق - سيؤدي هذا إلى فتح وحدة تحكم نقب عندما
binding.pry
يتم الضغط على الخط ويمكنك استجواب كل شيء تقريبًا في تطبيقك قيد التشغيل. - أود أن ألقي نظرة على
results
ومعرفة ما إذا كانت مصفوفة.فقط اكتبresults
في وحدة التحكم وسيتم طباعة القيمة.اكتب أيضًاresults.class
.من الممكن أن يقوم الاستعلام بإرجاع بعض كائنات مجموعة النتائج الخاصة التي ليست مصفوفة، ولكن لديها طريقة للوصول إلى مصفوفة النتائج. - لو
results
عبارة عن مصفوفة، فالمشكلة على الأرجح موجودةchan_send
.ربما يحتاج إلى استخدام شيء من هذا القبيلputs
ضدprint
للتأكد من وجود سطر جديد بعد كل رسالة.هل من الممكن أن يكون لديك إصدارات مختلفة من قاعدة التعليمات البرمجية الخاصة بك منشورة؟وأود أيضا أن أضيف أsleep 1
داخل كل كتلة للتأكد من أن هذا لا يرتبط بتعاملك مع الرسائل التي تصل في نفس الوقت.