سؤال

أنا أكتب إطارا لاختبار أحتاج إليه التقاط حالة قاعدة بيانات MySQL (بنية الجدول ومحتويات وما إلى ذلك).

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

يجب أن يكون تفريغه أنه في شكل قابل للقراءة بشري (يفضل أن يكون رمز SQL، مثل MySqldump يفعل).

أود أن الحد من إطار الاختبار الخاص بي لاستخدام اتصال MySQL فقط. لالتقاط الدولة ليس استدعاء MySQLDump أو Access FileSystem (مثل نسخ الملفات * .frm أو حدد في ملف، الأنابيب بخير رغم ذلك).

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

ما هي أفضل طريقة لتنفيذ الوظيفة التي أحتاجها؟

أعتقد أنني يجب أن أساعد التعليمات البرمجية الخاصة بي على بعض أدوات النسخ الاحتياطي مفتوح المصدر الموجودة ... وهو الأفضل للنظر في؟

تحديث: أنا لا تحدد اللغة التي أكتبها هذا في (لا، هذا ليس php)، كما لا أعتقد أنني سأكون قادرا على إعادة استخدام التعليمات البرمجية كما - حالتي الخاصة نوعا خاصا (للأغراض العملية، يتيح لك افتراض MySQL C API ). سيتم تشغيل الرمز على لينكس.

هل كانت مفيدة؟

المحلول

بالنظر إلى الاحتياجات الخاصة بك، أعتقد أنك تركت مع (كود الزائفة + SQL)

tables = mysql_fetch "SHOW TABLES"
foreach table in tables
    create = mysql_fetch "SHOW CREATE TABLE table"
    print create
    rows = mysql_fetch "SELECT * FROM table"
    foreach row in rows
        // or could use VALUES (v1, v2, ...), (v1, v2, ...), .... syntax (maybe preferable for smaller tables)
        insert = "INSERT (fiedl1, field2, field2, etc) VALUES (value1, value2, value3, etc)"
        print insert

في الأساس، جلب قائمة جميع الطاولات، ثم تمشي كل طاولة وتوليد INSERT البيانات الخاصة بكل صف باليد (معظم برامج برمجة التطبيقات لها طريقة بسيطة لجلب قائمة أسماء الأعمدة، وإلا يمكنك العودة إلى الاتصال DESC TABLE).

SHOW CREATE TABLE يتم ذلك بالنسبة لك، لكنني من المؤكد أنه لا يوجد شيء مماثل للقيام به SHOW INSERT ROWS.

وبالطبع، بدلا من طباعة تفريغ يمكنك القيام بكل ما تريده.

نصائح أخرى

إذا كنت لا ترغب في استخدام أدوات سطر الأوامر، وبعبارة أخرى تريد القيام بذلك بالكامل في حد ما، فقل PHP أو أي لغة تستخدمها، فلماذا لا تتكرر فوق الجداول باستخدام SQL نفسها. على سبيل المثال للتحقق من هيكل الجدول، ستكون التقنية البسيطة هي التقاط Snappoot من بنية الجدول مع عرض Table_Name، قم بتخزين النتيجة ثم قم بإجراء المكالمة لاحقا مرة أخرى ومقارنة النتائج.

هل نظرت إلى التعليمات البرمجية المصدر ل mysqldump؟ أنا متأكد من أن معظم ما تريده سيتم احتواءه في ذلك.

العاصمة

ما لم تبني تصدير نفسك، لا أعتقد أن هناك حلا بسيطا للتصدير والتحقق من البيانات. إذا قمت بذلك الجدول في الجدول، تحميل البيانات infile. و حدد ... في Outfile قد يكون مفيدا.

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

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top