أكثر

ابحث عن التكرارات في حقل ثم قم بتحديث حقل آخر باستخدام Y أو N باستخدام Python (ArcGIS)

ابحث عن التكرارات في حقل ثم قم بتحديث حقل آخر باستخدام Y أو N باستخدام Python (ArcGIS)


أحاول إنشاء نص بيثون (ArcGIS 10.1) يحدد السجلات المكررة داخل ملف شكل النقاط مع Y أو N (إمكانية وجود أكثر من 5000 سجل). مشابهة لهذه:

xyCombine | dplicate

E836814.148873 N814378.125749 |

E836814.148873 N814378.125749 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836815.033548 N814377.614688 |

E836818.016542 N814371.411850 |

أرغب في معالجة الحقل xyCombine للتكرارات وتحديث حقل آخر (dplicate) باستخدام Y أو N إذا كان مكررًا أم لا. مع النتيجة المرجوة (لا يلزم فرزها):

xyCombine | dplicate

E836814.148873 N814378.125749 | ص

E836814.148873 N814378.125749 | ص

E836815.033548 N814377.614688 | ص

E836815.033548 N814377.614688 | ص

E836815.033548 N814377.614688 | ص

E836818.016542 N814371.411850 | ن

أدناه محاولتي:

# العملية: البحث في حقل xyCombine عن أي تكرار مكرر = 0 inShapefile = PointsShapefile fieldName = "xyCombine" shpFRows = arcpy.UpdateCursor (inShapefile) shpFRow = shpFRows.next () fieldList = [if shpFullName) = False and len (str (shpFRow.getValue (fieldName)). strip ())> 1: fieldList.append (shpFRow.getValue (fieldName)) shpFRow = shpFRows.next () replicateList = [x لـ x ، y في المجموعات .Counter (fieldList) .items () if y> 1] print reprateList selectFile = PointsShapefile selectFields = ('xyCombine'، 'dupCHK') shpFRows = arcpy.UpdateCursor (selectFile، selectFields) shpFRow1 = showFRows.next () إذا كان shpFRow1.isNull (fieldName) == False and len (str (shpFRow1.getValue (fieldName)). strip ())> 1: للصف في replicateList: if shpFRow1.getValue (fieldName) == row: تكرار + = 1 row [1] = "Y" else: row [1] = "N" cursor.updateRow (row) shpFRow1 = shpFRows.next () if replicateCount> 0: print "" print "***" + str (مكرر) + "نقاط مكررة. ***" مطبعة ""

إذا لم أقم بتضمين:

row [1] = "Y" else: row [1] = "N" cursor.updateRow (صف)

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

ومع ذلك ، عندما أقوم بتضمينها ، أتلقى رسالة الخطأ التالية:

Python 2.7.2 (افتراضي ، 12 حزيران (يونيو) 2011 ، 15:08:59) [MSC v.1500 32 بت (Intel)] على win32

[u'E836814.148873 N814378.125749 '، u'E836815.033548 N814377.614688'، u'E836818.016542 N814371.41185 ']

Traceback (آخر مكالمة أخيرة): ملف "C: Duplicate Points Check Python Scripts DuplicatePointsCheck_TEST1.py" ، السطر 458 ، في DuplicatePointsCheck () ملف "C: Duplicate Points Check Python Scripts DuplicatePointsCheck_TEST1.py" ، سطر 94 ، في صف DuplicatePointsCheck [1] = خطأ في النوع "N": كائن 'unicode' لا يدعم تعيين العنصر >>>

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


بعد محاولات عديدة (باقتراحMichael Miles-Stimson) ، حاولت ببساطة تجريد الكود قدر المستطاع وتوصلت إلى هذا:

inShapefile = PointsShapefile inShapefileFields = ('xyCombine'، 'dplicate') valueList = list () replicatePointsCount = 0 مع arcpy.da.UpdateCursor (inShapefile، inShapefileFields) كمؤشر: للصف (في الصف) ])> 1): row [1] = "Y" replicatePointsCount + = 1 else: row [1] = "N" cursor.updateRow (row) print "" print "***" + str (replicatePointsCount) + " نقاط مكررة ".

ومع ذلك ، لسبب ما ، لم أتمكن من تشغيل الجزء أدناه ، واستمر في كتابة "N" في حقل dplicate لجميع السجلات.

إذا (valueList.count (row [0])> 1): row [1] = "Y" replicatePointsCount + = 1

ثم حاولت بعد ذلك رمز Emil Brundage. وقد نجحت في علاج!


تبدو شفرتك معقدة بعض الشيء بالنسبة لي لفك شفرتها ، لكن اسمح لي بتقديم نص مبسط من شأنه أن يحقق هدفك. يستخدم الحرف الأوليالبحثلتحديد التكرارات. يقوم بذلك عن طريق ملء القوائم. يقوم بتعبئة قائمة واحدة لجميع القيم التي تحدث مرة واحدة ، وقائمة ثانية من القيم التي تحدث أكثر من مرة. ثم يبدأ ملفUpdateCursorلتعبئة حقل Y / N الخاص بك.

من استيراد arcpy * inShapefile = PointsShapefile checkField = "xyCombine" updateField = "dplicate" # قائمة القيم التي تم العثور عليها مرة واحدة تحدث مرة واحدة = [] حدث # قائمة القيم التي تم العثور عليها مرتين Twice = [] cursor = da.SearchCursor (inShapefile، [checkField]) صف في المؤشر: #Check value ليست فارغة إذا كان الصف [0]: # إذا لم يتم العثور بالفعل مرتين ، تابع إذا لم يحدث الصف [0] في مرتين: #If لم يحدث مرة واحدة حتى الآن إذا لم يحدث الصف [0] في يحدث مرة واحدة: # الإضافة تحدث بمجرد ظهور القائمة مرة واحدة (صف [0]) # إذا تم العثور على القيمة بالفعل مرة أخرى: تحدث # إضافة إلى القائمة مرتين (تكرارات) تحدثتتويز.انابند (الصف [0]) مؤشر المؤشر = دا .UpdateCursor (inShapefile، [checkField، updateField]) للصف في المؤشر: #Check القيمة ليست فارغة إذا كان الصف [0]: # تحقق مما إذا كانت القيمة في قائمة مرتين (أي مكررة) إذا حدث الصف [0] مرتين: صف [ 1] = "Y" else: row [1] = "N" cursor.updateRow (row) del cursor

آمل أن يساعد هذا!


أنت لا تذكر إصدار arcmap الذي تستخدمه. إذا كان لديك إصدار متقدم ، يمكنك محاولة استخدام أداة البحث عن المتطابقة.

http://resources.arcgis.com/ar/help/main/10.1/index.html#//001700000054000000

يمكن أن يستغرق الأمر عدة حقول ، لذلك لا داعي لسلسلة النص.


كيف يمكنني دمج مجموعتين أو أكثر من مجموعات البحث في طريقة عرض Django؟

أحاول بناء البحث عن موقع Django الذي أقوم ببنائه ، وفي هذا البحث ، أبحث في ثلاثة نماذج مختلفة. وللحصول على ترقيم صفحات في قائمة نتائج البحث ، أود استخدام طريقة عرض قائمة_العناصر العامة لعرض النتائج. ولكن للقيام بذلك ، يتعين عليّ دمج ثلاث مجموعات استعلام في مجموعة واحدة.

كيف أقوم بذلك؟ لقد حاولت هذا:

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

كيف يمكنني دمج القوائم الثلاث ، page_list ، article_list و post_list؟


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

يمكنك تحويل القوائم في السلاسل إلى إملاء مرتبط بالاسم ، ثم تحديث:

ثم ، إذا كنت ترغب في استعادة القائمة فهي فقط

ذكرت الترتيب في العنوان الخاص بك. إذا كنت تريد فرز تلك القائمة حسب الاسم:

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

سأفترض أن قواميسين لهما نفس النوع ومفاتيح الاسم متطابقة ، وأنك تريد دمج قيم الصلة في قائمة. ثم بعد ذلك يمكنك متوسطهم ، أو أيا كان


اشياء اخرى

المقروئية والممارسات القياسية

يبدو الرمز بيثونيًا ولطيفًا في Models.py و view.py ، وهو أقل جودة قليلاً في ملف (الإدخال) "الواجهة الأمامية". كنت أرغب أيضًا في رؤية بعض الاختبارات.

أعتقد أنك تفرط في التوثيق قليلاً ، ومن الأمثلة الجيدة على ذلك:

أعتقد أنه يمكنك افتراض أن معظم القراء سيعرفون ما هو التكاثر وما يفعله.

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

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

مدير السياق

تعجبني فكرة مدير سياق جلساتك ، ولكن كن حذرًا للتعامل مع الأخطاء المحتملة في وظيفة __exit__ الخاصة بك.

سلوك مفاجئ / موجه

على نفس المنوال ، ارفع الأخطاء في النهاية الخلفية الخاصة بك ولكن تعامل معها بنفسك في الواجهة الأمامية ، لا تفعل هذا:

إعادة بناء التعليمات البرمجية

يجب أن تكون بعض فقرات if الخاصة بك elif (أو يمكنك إعادة تشكيلها وفقًا للإملاءات) ، وأنا أفضل رؤية حلقاتك يتم إعادة صياغتها.


الاتصال بخادم MySQL

عند هذه النقطة ، يجب أن يكون لدينا MySQL Community Server مُعدًا على نظامنا. نحتاج الآن إلى كتابة بعض التعليمات البرمجية في Python والتي تتيح لنا إنشاء اتصال بهذا الخادم.

وظيفة للاتصال بخادم MySQL

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

لنستعرض هذا سطرًا بسطر حتى نفهم ما يحدث هنا:

السطر الأول هو تسمية الوظيفة (create_server_connection) وتسمية الوسيطات التي ستتخذها هذه الوظيفة (host_name ، user_name و user_password).

يقوم السطر التالي بإغلاق أي اتصالات موجودة حتى لا يتم الخلط بين الخادم واتصالات مفتوحة متعددة.

بعد ذلك ، نستخدم كتلة محاولة استثناء Python للتعامل مع أي أخطاء محتملة. يحاول الجزء الأول إنشاء اتصال بالخادم باستخدام طريقة mysql.connector.connect () باستخدام التفاصيل المحددة من قبل المستخدم في الوسائط. إذا نجح هذا ، فإن الوظيفة تطبع رسالة نجاح صغيرة سعيدة.

يقوم الجزء باستثناء من الكتلة بطباعة الخطأ الذي يقوم MySQL Server بإرجاعه ، في الظروف المؤسفة التي يوجد فيها خطأ.

أخيرًا ، إذا كان الاتصال ناجحًا ، تقوم الوظيفة بإرجاع كائن اتصال.

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

هنا ، pw هو متغير يحتوي على كلمة مرور الجذر لخادم MySQL كسلسلة.

يجب أن ينتج عن هذا رسالة نجاح:

الصيحة!

إنشاء قاعدة بيانات جديدة

الآن وقد أنشأنا اتصالاً ، فإن خطوتنا التالية هي إنشاء قاعدة بيانات جديدة على الخادم الخاص بنا.

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

تأخذ هذه الوظيفة وسيطين ، الاتصال (كائن الاتصال الخاص بنا) والاستعلام (استعلام SQL الذي سنكتبه في الخطوة التالية). ينفذ الاستعلام في الخادم عبر الاتصال.

نستخدم طريقة المؤشر في كائن الاتصال الخاص بنا لإنشاء كائن مؤشر (يستخدم MySQL Connector نموذج برمجة موجه للكائنات ، لذلك هناك الكثير من الكائنات ترث الخصائص من الكائنات الرئيسية).

يحتوي كائن المؤشر هذا على طرق مثل التنفيذ والتنفيذ (والتي سنستخدمها في هذا البرنامج التعليمي) إلى جانب العديد من الطرق المفيدة الأخرى.

إذا كان ذلك مفيدًا ، فيمكننا التفكير في كائن المؤشر على أنه يتيح لنا الوصول إلى المؤشر الوامض في نافذة طرفية MySQL Server.

تعرف ، هذا.

بعد ذلك نحدد استعلامًا لإنشاء قاعدة البيانات واستدعاء الوظيفة:

تم شرح جميع استعلامات SQL المستخدمة في هذا البرنامج التعليمي في "مقدمة إلى سلسلة دروس SQL" ، ويمكن العثور على الكود الكامل في دفتر Jupyter Notebook المرتبط في مستودع GitHub هذا ، لذلك لن أقدم توضيحات لما يفعله رمز SQL في هذا درس تعليمي.

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

يؤدي تشغيل وظيفة create_database مع الوسيطات المذكورة أعلاه إلى إنشاء قاعدة بيانات تسمى "school" في خادمنا.

لماذا تسمى قاعدة بياناتنا "المدرسة"؟ ربما يكون الوقت مناسبًا الآن للنظر بمزيد من التفصيل في ما سنقوم بتنفيذه بالضبط في هذا البرنامج التعليمي.

قاعدة بياناتنا

مخطط علاقة الكيان لقاعدة البيانات الخاصة بنا.

باتباع المثال في سلسلتي السابقة ، سنقوم بتنفيذ قاعدة البيانات الخاصة بمدرسة اللغة الدولية - مدرسة تدريب لغوية خيالية توفر دروسًا في اللغة الاحترافية لعملاء الشركات.

يحدد مخطط علاقة الكيان (ERD) كياناتنا (المعلم والعميل والدورة التدريبية والمشارك) ويحدد العلاقات فيما بينها.

يمكن العثور على جميع المعلومات المتعلقة بماهية ERD وما يجب مراعاته عند إنشاء واحد وتصميم قاعدة بيانات في هذه المقالة.

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

الاتصال بقاعدة البيانات

الآن بعد أن أنشأنا قاعدة بيانات في MySQL Server ، يمكننا تعديل وظيفة create_server_connection الخاصة بنا للاتصال مباشرة بقاعدة البيانات هذه.

لاحظ أنه من الممكن - في الواقع - أن يكون لديك عدة قواعد بيانات على خادم MySQL واحد ، لذلك نريد دائمًا الاتصال تلقائيًا بقاعدة البيانات التي نهتم بها.

هذه هي الوظيفة نفسها تمامًا ، لكننا الآن نأخذ وسيطة أخرى - اسم قاعدة البيانات - ونمررها كوسيطة إلى طريقة connect ().

إنشاء وظيفة تنفيذ الاستعلام

الوظيفة النهائية التي سنقوم بإنشائها (في الوقت الحالي) هي وظيفة حيوية للغاية - وظيفة تنفيذ الاستعلام. سيأخذ هذا استعلامات SQL الخاصة بنا ، المخزنة في Python كسلاسل ، وتمريرها إلى طريقة cursor.execute () لتنفيذها على الخادم.

هذه الوظيفة هي نفسها تمامًا وظيفة create_database من وقت سابق ، باستثناء أنها تستخدم طريقة connection.commit () للتأكد من تنفيذ الأوامر المفصلة في استعلامات SQL الخاصة بنا.

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

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


كيف يمكنني دمج ملف Excel مع الآلاف من سجلات الرمز البريدي (بدون خطوط عرض / طويلة) مع ملف شكل centroid للرمز البريدي مع خط الطول / الطول؟

أقوم بإجراء اختبار تجريبي لمجموعة بيانات أكبر بكثير. لقد تم تزويدي بجدول بيانات Excel يحتوي على 3000 سجل مع رموز بريدية (وبيانات أخرى) ، ولكن لا يوجد معرف جغرافي مكاني آخر. & # x27m أحاول إنشاء ملف شكل من هذا.

ومع ذلك ، أواجه مشكلة بسبب كثرة الرموز البريدية المكررة. & # x27m أجد صعوبة في & الاقتباس & الاقتباس باستخدام ملف شكل النقطه الوسطى الرمز البريدي (مع خط الطول / الطول) أنشأته & # x27ve.

هل من الممكن ، وإذا كان الأمر كذلك ، فكيف يتم دمج / الانضمام إلى ملف شكل الرمز البريدي centroid والملء التلقائي لجدول بيانات Excel مع خط الطول / العرض المرتبط ، مع الاحتفاظ بالرموز البريدية المكررة؟ ثم تصدير هذه النتيجة إلى ملف الشكل الخاص به؟ على سبيل المثال ، ستُظهر النتيجة المنضمة السجلات 3000 ، مع الرموز البريدية المكررة ، ولكن الآن لها خط العرض / الطول المرتبط بها حتى يمكن تعيينها وتحليلها؟


ملخص

هذا يكمل مدونتنا. في الجزء الأول ، شرحت أربع خطوات من أصل ست خطوات لبناء نموذج الحل الخاص بنا. لقد قمت بمشاركة معلومات قيمة حول Export Subnetwork وكيفية تنزيل إرجاع JSON للأداة وتحليله. في هذا الجزء الثاني ، أكملنا العينة بالخطوتين الأخيرتين وناقشت إخراج JSON لشبكة التصدير الفرعية بالتفصيل ، والعمل مع خدمة الميزات لشبكة المرافق وعناصر البيانات الخاصة بها ، وإنشاء الميزات بما في ذلك الهندسة من JSON وتغيير المجالات المشفرة لأوصاف سهلة الاستخدام ، وكتابة ديناميكية لمخرجات متعددة. بشكل عام ، أوضحت كيفية إنشاء أداة أتمتة الشبكة الفرعية للتصدير باستخدام امتداد إمكانية التشغيل البيني للبيانات في ArcGIS Pro. أخيرًا ، لقد أوضحت لك كيفية تشغيل وتكوين مناضد عمل ذات معلمات وكيفية استخدام مربع أدوات Spatial ETL في Pro. ملف طاولة العمل هذا جاهز الآن لمزيد من التشغيل الآلي لتصدير جميع الشبكات الفرعية لأي شبكة أدوات مساعدة & # 8230 التي ستكون موضوع مدونتي التالية.

أتمنى أن تكون قد وصلت إلى هذا الحد ووجدت المدونة مفيدة ومفيدة. يرجى ترك التعليقات أدناه مع أي أسئلة حول العينة المقدمة أو مع Export Subnetwork نفسها.

صور البطاقة والبانر بواسطة:


كيفية البحث بسرعة في قائمة كبيرة جدًا من السلاسل / السجلات في قاعدة بيانات

لدي المشكلة التالية: لدي قاعدة بيانات تحتوي على أكثر من مليوني سجل. يحتوي كل سجل على حقل سلسلة X وأريد عرض قائمة من السجلات التي يحتوي الحقل X على سلسلة معينة لها. يبلغ حجم كل سجل حوالي 500 بايت.

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

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

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

لقد أجريت أول تجربة. لقد قسمت السجلات إلى ملفات نصية مختلفة (200 سجل على الأكثر لكل ملف) ووضعت الملفات في دلائل مختلفة (استخدمت محتوى حقل بيانات واحد لتحديد شجرة الدليل). انتهى بي الأمر بحوالي 50000 ملف في حوالي 40000 دليل. ثم قمت بتشغيل Lucene لفهرسة الملفات. البحث عن سلسلة باستخدام برنامج Lucene التجريبي سريع جدًا. استغرق التقسيم والفهرسة بضع دقائق: هذا مقبول تمامًا بالنسبة لي لأنه مجموعة بيانات ثابتة أريد الاستعلام عنها.

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


طريقة جيدة لإجراء هذه المقارنة هي استخدام البحث مع md5sum ، ثم فرق.

استخدم find لسرد جميع الملفات الموجودة في الدليل ، ثم احسب تجزئة md5 لكل ملف وقم بتوصيله بالفرز حسب اسم الملف إلى ملف:

قم بنفس الإجراء على دليل آخر:

ثم قارن الملفين الناتج مع فرق:

أو كأمر واحد باستخدام عملية الاستبدال:

إذا كنت تريد رؤية التغييرات فقط:

يقوم الأمر cut بطباعة التجزئة (الحقل الأول) فقط لمقارنتها بالفرق. وإلا فإن الفرق سيطبع كل سطر لأن مسارات الدليل تختلف حتى عندما تكون التجزئة هي نفسها.

لكنك لن تعرف الملف الذي تغير.

لذلك ، يمكنك تجربة شيء مثل

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

هناك طريقة أخرى جيدة للقيام بهذه المهمة وهي استخدام أمر Git’s diff (قد يتسبب في حدوث مشكلات عندما يكون للملفات أذونات مختلفة -> يتم إدراج كل ملف في الإخراج بعد ذلك):


18 إجابات 18

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

عندما تنتهي من ذلك مع قاعدتي البيانات ، احصل على مجموعتي البرامج النصية على جهاز محلي في مجلدين منفصلين واستخدم WinMerge (أو ما شابه) للمقارنة بين الاثنين.

بعد الكفاح مع طريقة سهلة للقيام بهذه المهمة نفسها - شاهد ما تغير بين نموذجين ، كتبت SQL Script التالي الذي سيقارن مخططين لتحديد الأعمدة الجديدة والمحذوفة

خيار آخر هو استخدام SQL Server Data Tools (SSDT) ​​، وهو امتداد لبرنامج Visual Studio. يمكنك استخراج مخطط قاعدة البيانات كملف .dacpac ومقارنته بملف .dacpac آخر أو قاعدة بيانات موجودة. تم تضمين SSDT في أدوات عميل SQL Server 2012 ، مما يجعله سهل الوصول إليه. يمكنك العثور على الإرشادات الكاملة حول كيفية تشغيل المقارنة على موقع MSDN.

ابحث عن "SQL Server Compare" وستجد الكثير من الأدوات. الذي نستخدمه في وظيفتي هو Red Gate SQLCompare. لديها نسخة تجريبية مدتها 14 يوما. ولكن نظرًا لأنك تتحدث عن بيئتين مختلفتين ، فلا أعتقد أن ذلك سيعمل من أجلك ، ما لم يرسل لك العميل نسخة احتياطية من قاعدة البيانات الخاصة به. الخيار الآخر هو كتابة استعلامات مقابل جداول النظام (مثل sys.indexes ، sys.tables ، إلخ).

ربما يمكن أن يساعدك هذا البرنامج النصي المجاني https://github.com/dlevsha/compalex. يدعم Microsoft SQL Server.

Compalex هو برنامج نصي خفيف الوزن مجاني لمقارنة مخططي قاعدة البيانات. وهو يدعم MySQL و MS SQL Server و PostgreSQL.

إذا كنت بحاجة إلى مقارنة أكثر من ملف قاعدة بيانات ، فيمكنك كتابة SQLPackage.exe.

ليس لدي رمز عمل لك ولكن يمكنك إلقاء نظرة على وثائق SQLPackage.exe للحصول على بعض الإلهام.

يمكنك استخراج قاعدة البيانات الرئيسية الخاصة بك إلى ملف dacpac ثم مقارنة ملف dacpac ببقية قواعد البيانات الخاصة بك. يمكن أن تكون نتيجة المقارنة إما تقرير xml بالتغييرات أو ملف .sql يمكنك تشغيله لمزامنة قواعد البيانات.

يمكنك إلقاء نظرة على هذه المقالة أو هذه للحصول على نموذج التعليمات البرمجية.

كان لدي نفس السؤال بالضبط وأعتقد أن Microsoft SQL Server Management Studio (SSMS) لديه حل أسهل / أبسط بكثير من أي شيء رأيته هنا. لدي موقع إنتاج مع MS SQL Server Express وقريبًا سأكون أكثر من ذلك حيث لا أرغب في تثبيت VisualStudio أو تطبيقات أخرى غير SSMS.

لذلك داخل SSMS ، انقر بزر الماوس الأيمن على قاعدة البيانات للحصول على مخطط. يختار المهام> إنشاء البرامج النصية. لفتح معالج لكتابة المخطط والتكوين لقاعدة البيانات بأكملها (أو الكائنات المحددة إذا كنت تريد). احتفظت بجميع الخيارات الافتراضية باستثناء المسار / اسم الملف ، لكن الأداة بها عدد كبير من الخيارات. أنشأ المعالج SQL واحدًا قمت بنسخه عبر OneDrive إلى جهاز الكمبيوتر الخاص بي. ثم استخدمت Notepad ++ لمقارنة SQL بملف تم إنشاؤه بنفس الطريقة مقابل قاعدة بيانات SIT الخاصة بي. يجب عليك تصفية النتائج من التاريخ / الوقت في التعليقات ، ولكن بخلاف ذلك فهي مقارنة رائعة بين قاعدتي البيانات.

المعزوفة! كانت كتابة هذا أصعب بكثير من إجراء المقارنة الفعلية.

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

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

اكتب استعلامًا (أو استعلامات) للحصول على المعلومات التي تهم التعليمات البرمجية الخاصة بك من طرق عرض INFORMATION_SCHEMA وتشغيلها على كل خادم SQL من SSMS. يمكنك بعد ذلك إما تفريغ النتائج إلى ملف واستخدام أداة مقارنة ملف نصي (حتى MS Word) أو يمكنك تفريغ النتائج في الجداول وتشغيل استعلامات SQL للعثور على عدم التطابق.

أقوم بتضمين هذه الإجابة من أجل سؤال جديد تم وضع علامة عليه باعتباره مكررًا.

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

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

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

أخيرًا ، قمت بتطوير استعلامات للعثور على الجداول التي كانت موجودة في قاعدة بيانات واحدة وليس الأخرى ، وأعمدة من جداول في كل من قاعدة البيانات التي كانت موجودة فقط في قاعدة بيانات واحدة ، وأعمدة ذات تعريفات غير متسقة بين قاعدتي البيانات.

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

تم اقتراح نموذج قاعدة البيانات الوصفية بواسطة جداول النظام المعنية. لم يكن من الصعب إنشاء الاستعلامات ، حيث كانت تدور في الغالب حول مجموعة من خلال عدد (اسم قاعدة البيانات) = 1.

في حالتك ، مع 700 قاعدة بيانات إنتاج ، قد ترغب في أتمتة الخطوتين الأوليين أكثر مما فعلت مع قاعدتي بيانات فقط للمقارنة. لكن الفكرة متشابهة.