Hơn

Tìm các bản sao trong một trường rồi cập nhật trường khác bằng Y hoặc N bằng Python (ArcGIS)

Tìm các bản sao trong một trường rồi cập nhật trường khác bằng Y hoặc N bằng Python (ArcGIS)


Tôi đang cố gắng tạo một tập lệnh python (ArcGIS 10.1) sẽ xác định các bản ghi trùng lặp trong một tệp hình dạng điểm có Y hoặc N (khả năng có hơn 5000 bản ghi). Tương tự như thế này:

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 |

Tôi muốn xử lý trường xyCombine để tìm các bản sao và cập nhật một trường khác (dplicate) bằng Y hoặc N nếu nó có trùng lặp hay không. Với kết quả mong muốn là (nó không cần phải được sắp xếp):

xyCombine | dplicate

E836814.148873 N814378.125749 | Y

E836814.148873 N814378.125749 | Y

E836815.033548 N814377.614688 | Y

E836815.033548 N814377.614688 | Y

E836815.033548 N814377.614688 | Y

E836818.016542 N814371.411850 | N

Dưới đây là nỗ lực của tôi:

# Process: Tìm kiếm trường xyCombine để tìm bất kỳ bản sao nào trùng lặp DuplicateCount = 0 inShapefile = pointsShapefile fieldName = "xyCombine" shpFRows = arcpy.UpdateCursor (inShapefile) shpFRow = shpFRows.next () fieldList = [] while shpFRow: if = False và len (str (shpFRow.getValue (fieldName)). Strip ())> 1: fieldList.append (shpFRow.getValue (fieldName)) shpFRow = shpFRows.next () DupateList = [x for x, y in collection .Counter (fieldList) .items () if y> 1] print repeatateList selectFile = pointsShapefile selectFields = ('xyCombine', 'replicCHK') shpFRows = arcpy.UpdateCursor (selectFile, selectFields) shpFRow1 = shpFRows.next () while shpFRows.next () while: if shpFRow1.isNull (fieldName) == False và len (str (shpFRow1.getValue (fieldName)). strip ())> 1: cho hàng trong DupateList: if shpFRow1.getValue (fieldName) == row: trùng lặp + = 1 row [1] = "Y" else: row [1] = "N" cursor.updateRow (row) shpFRow1 = shpFRows.next () if DupateCount> 0: print "" print "***" + str (trùng lặp) + "điểm nhân đôi. ***" in ""

Nếu tôi không bao gồm:

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

Tập lệnh thực thi in đúng tổng số lượng bản sao, tuy nhiên, không cập nhật trường trùng lặp với giá trị Y hoặc N, điều này quan trọng vì nó sẽ cung cấp báo cáo lỗi csv sau này trong tập lệnh.

Tuy nhiên, khi tôi bao gồm nó, tôi nhận được thông báo lỗi sau:

Python 2.7.2 (mặc định, ngày 12 tháng 6 năm 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] trên win32

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

Lần theo dấu vết (lần gọi gần đây nhất): Tệp "C: Kiểm tra điểm trùng lặp Python Scripts DuplicatePointsCheck_TEST1.py", dòng 458, trong tệp DuplicatePointsCheck () "C: Kiểm tra điểm trùng lặp Python Scripts DuplicatePointsCheck_TEST1.py", dòng 94, trong hàng DuplicatePointsCheck [1] = "N" TypeError: đối tượng 'unicode' không hỗ trợ gán mục >>>

Tôi hiểu rằng có những công cụ trong ArcGIS sẽ cung cấp các giải pháp khả thi thông qua máy tính thực địa. Tuy nhiên, tôi muốn củng cố sự hiểu biết của mình về Python vì tôi còn khá mới đối với Python. Tôi xin lỗi nếu câu hỏi này đã được đặt ra trước đây, nhưng tôi đã tìm kiếm trên internet và kết quả tìm kiếm duy nhất của tôi bao gồm định vị và xóa các bản ghi trùng lặp.


Sau nhiều lần thử (với gợi ý của @Michael Miles-Stimson), tôi đã cố gắng đơn giản và rút mã xuống nhiều nhất có thể và nghĩ ra điều này:

inShapefile = pointsShapefile inShapefileFields = ('xyCombine', 'dplicate') valueList = list () DupatePointsCount = 0 với arcpy.da.UpdateCursor (inShapefile, inShapefileFields) as con trỏ: cho hàng trong con trỏ: if (valueList.count ])> 1): row [1] = "Y" DupatePointsCount + = 1 else: row [1] = "N" cursor.updateRow (row) print "" print "***" + str (DupatePointsCount) + " điểm trùng lặp. "

Tuy nhiên, vì một số lý do, tôi không thể làm cho phần bên dưới hoạt động và nó tiếp tục viết "N" trong trường dplicate cho tất cả các bản ghi.

if (valueList.count (row [0])> 1): row [1] = "Y" DupatePointsCount + = 1

Sau đó, tôi đã thử mã của @Emil Brundage. Và nó đã thành công!


Mã của bạn trông hơi phức tạp để tôi giải mã, nhưng hãy cho phép tôi trình bày một tập lệnh đơn giản sẽ đạt được mục tiêu của bạn. Nó sử dụng một chữ cái đầuCon trỏ tìm kiếmđể xác định các bản sao. Nó làm như vậy bằng cách điền danh sách. Nó điền một danh sách tất cả các giá trị xuất hiện một lần và danh sách thứ hai các giá trị xuất hiện nhiều lần. Sau đó, nó bắt đầu mộtUpdateCursorđể điền vào trường Y / N của bạn.

from arcpy import * inShapefile = pointsShapefile checkField = "xyCombine" updateField = "dplicate" # Danh sách các giá trị được tìm thấy một lần xảy raOnce = [] # danh sách các giá trị được tìm thấy hai lần xảy raTwice = [] cursor = da.SearchCursor (inShapefile, [checkField]) cho hàng trong con trỏ: # Giá trị kiểm tra không phải là null nếu hàng [0]: # Nếu chưa tìm thấy hàng [0] xảy ra, hãy tiếp tục nếu không xảy ra hàng [0] trong xảy ra: # Thêm để xảy ra khi danh sách xuất hiệnOnce.append (hàng [0]) # Nếu giá trị đã được tìm thấy một lần khác: # Thêm vào danh sách xảy ra hai lần (trùng lặp) xảy raTwice.append (hàng [0]) del con trỏ trỏ chuột = da .UpdateCursor (inShapefile, [checkField, updateField]) cho hàng trong con trỏ: # Giá trị kiểm tra không null nếu hàng [0]: # kiểm tra nếu giá trị trong danh sách Công thức (tức là trùng lặp) nếu hàng [0] trong Công thức xảy ra: hàng [ 1] = "Y" else: row [1] = "N" cursor.updateRow (row) del con trỏ

Tôi hi vọng cái này giúp được!


Bạn không cho biết bạn đang sử dụng phiên bản arcmap nào. Nếu bạn có phiên bản nâng cao, bạn có thể thử sử dụng công cụ Tìm giống hệt.

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

Nó có thể có nhiều trường nên không cần nối văn bản.


Làm cách nào để kết hợp hai hoặc nhiều bộ truy vấn trong chế độ xem Django?

Tôi đang cố gắng xây dựng tìm kiếm cho trang Django mà tôi đang xây dựng và trong tìm kiếm đó, tôi đang tìm kiếm trong ba mô hình khác nhau. Và để phân trang trên danh sách kết quả tìm kiếm, tôi muốn sử dụng chế độ xem object_list chung để hiển thị kết quả. Nhưng để làm điều đó, tôi phải hợp nhất ba bộ truy vấn thành một.

Làm thế nào tôi có thể làm điều đó? Tôi đã thử cái này:

Nhưng điều này không hiệu quả. Tôi gặp lỗi khi cố gắng sử dụng danh sách đó trong chế độ xem chung. Danh sách bị thiếu thuộc tính nhân bản.

Làm cách nào để hợp nhất ba danh sách, page_list, article_list và post_list?


Nếu bạn muốn tạo một danh sách từ điển mới và muốn hợp nhất chúng bằng cách loại bỏ các từ điển trùng lặp, thì việc này sẽ đơn giản.

Bạn có thể chuyển đổi danh sách trong chuỗi thành dict được khóa theo tên, sau đó cập nhật:

Sau đó, nếu bạn muốn một danh sách trở lại, nó chỉ

Bạn đề cập đến việc sắp xếp trong tiêu đề của bạn. Nếu bạn muốn sắp xếp danh sách đó theo tên:

Điều đầu tiên cần lưu ý là bạn không có hai từ điển khác nhau. Bạn có hai khác nhau danh sách của từ điển. Thứ hai là bạn không giải thích chính xác những gì được coi là trùng lặp. Thứ ba là bạn không nói phải làm gì với khóa liên quan.

Tôi sẽ giả định rằng hai từ điển có khóa tên và loại tương đương giống hệt nhau và bạn muốn các giá trị liên quan được hợp nhất thành một danh sách. Sau đó, bạn có thể tính trung bình chúng, hoặc bất cứ điều gì.


Những thứ khác

Khả năng đọc, thực hành tiêu chuẩn

Mã trông giống hệt và đẹp trong models.py và view.py, kém tốt hơn một chút trong tệp "front-end" (entry). Tôi cũng muốn xem một số bài kiểm tra.

Tôi nghĩ rằng bạn đã ghi quá nhiều tài liệu một chút, một ví dụ điển hình là:

Tôi nghĩ bạn có thể cho rằng hầu hết người đọc sẽ biết repr là gì và làm gì.

Tôi cũng thấy rằng bạn chỉ có ba cam kết trên repo của mình. Bạn có thể muốn làm việc trên quy trình kiểm soát phiên bản của mình.

Tôi không nghĩ rằng bạn nên cho phép bất kỳ loại mật khẩu nào và tôi nghĩ bạn không nên chỉ thông báo cho người dùng rằng họ đã chọn một mật khẩu không an toàn. Nếu bạn không muốn bắt buộc các mật khẩu nghiêm ngặt, bạn có thể yêu cầu họ nhập lại một mật khẩu không an toàn để xác nhận.

Trình quản lý ngữ cảnh

Tôi thích ý tưởng về trình quản lý ngữ cảnh các phiên của bạn, nhưng hãy cẩn thận để xử lý các lỗi tiềm ẩn trong hàm __exit__ của bạn.

Hành vi / lời nhắc nhở đáng ngạc nhiên

Tương tự như vậy, hãy nêu ra các lỗi trong back-end của bạn nhưng hãy tự xử lý chúng ở front-end đừng làm điều này:

Tái cấu trúc

Một số if -clauses của bạn phải là elif (hoặc bạn có thể cấu trúc lại thành các đoạn), và tôi muốn thấy các vòng lặp của bạn được làm lại.


Kết nối với MySQL Server

Đến thời điểm này, chúng ta nên thiết lập MySQL Community Server trên hệ thống của mình. Bây giờ chúng ta cần viết một số mã bằng Python cho phép chúng ta thiết lập kết nối với máy chủ đó.

Một chức năng để kết nối với Máy chủ MySQL của chúng tôi

Cách tốt nhất là tạo một hàm có thể sử dụng lại cho mã như thế này, để chúng ta có thể sử dụng nó nhiều lần với nỗ lực tối thiểu. Khi điều này được viết ra, bạn có thể sử dụng lại nó trong tất cả các dự án của mình trong tương lai, vì vậy trong tương lai-bạn sẽ rất biết ơn!

Hãy xem qua từng dòng một để chúng tôi hiểu điều gì đang xảy ra ở đây:

Dòng đầu tiên là chúng ta đặt tên cho hàm (create_server_connection) và đặt tên cho các đối số mà hàm đó sẽ nhận (host_name, user_name và user_password).

Dòng tiếp theo đóng mọi kết nối hiện có để máy chủ không bị nhầm lẫn với nhiều kết nối đang mở.

Tiếp theo, chúng tôi sử dụng khối try-exception trong Python để xử lý bất kỳ lỗi tiềm ẩn nào. Phần đầu tiên cố gắng tạo kết nối đến máy chủ bằng phương thức mysql.connector.connect () bằng cách sử dụng các chi tiết được chỉ định bởi người dùng trong các đối số. Nếu điều này hoạt động, hàm sẽ in một thông báo thành công nhỏ.

Phần ngoại trừ của khối in ra lỗi mà Máy chủ MySQL trả về, trong trường hợp không may là có lỗi.

Cuối cùng, nếu kết nối thành công, hàm trả về một đối tượng kết nối.

Chúng tôi sử dụng điều này trong thực tế bằng cách gán đầu ra của hàm cho một biến, sau đó trở thành đối tượng kết nối của chúng tôi. Sau đó, chúng ta có thể áp dụng các phương thức khác (chẳng hạn như con trỏ) cho nó và tạo các đối tượng hữu ích khác.

Ở đây, pw là một biến chứa mật khẩu gốc cho Máy chủ MySQL của chúng tôi dưới dạng một chuỗi.

Điều này sẽ tạo ra một thông báo thành công:

Hoan hô!

Tạo cơ sở dữ liệu mới

Bây giờ chúng ta đã thiết lập kết nối, bước tiếp theo của chúng ta là tạo một cơ sở dữ liệu mới trên máy chủ của chúng ta.

Trong hướng dẫn này, chúng ta sẽ thực hiện điều này chỉ một lần, nhưng một lần nữa chúng ta sẽ viết nó dưới dạng một hàm có thể sử dụng lại để chúng ta có một hàm hữu ích tuyệt vời mà chúng ta có thể sử dụng lại cho các dự án sau này.

Hàm này nhận hai đối số, kết nối (đối tượng kết nối của chúng ta) và truy vấn (truy vấn SQL mà chúng ta sẽ viết trong bước tiếp theo). Nó thực hiện truy vấn trong máy chủ thông qua kết nối.

Chúng tôi sử dụng phương thức con trỏ trên đối tượng kết nối của mình để tạo đối tượng con trỏ (MySQL Connector sử dụng mô hình lập trình hướng đối tượng, vì vậy có rất nhiều đối tượng kế thừa thuộc tính từ các đối tượng mẹ).

Đối tượng con trỏ này có các phương thức như thi hành, thi hành (mà chúng ta sẽ sử dụng trong hướng dẫn này) cùng với một số phương thức hữu ích khác.

Nếu nó hữu ích, chúng ta có thể nghĩ đối tượng con trỏ cung cấp cho chúng ta quyền truy cập vào con trỏ nhấp nháy trong cửa sổ đầu cuối Máy chủ MySQL.

Bạn biết đấy, cái này.

Tiếp theo, chúng tôi xác định một truy vấn để tạo cơ sở dữ liệu và gọi hàm:

Tất cả các truy vấn SQL được sử dụng trong hướng dẫn này được giải thích trong loạt bài Hướng dẫn Giới thiệu về SQL của tôi và mã đầy đủ có thể được tìm thấy trong Sổ tay Jupyter được liên kết trong kho lưu trữ GitHub này, vì vậy tôi sẽ không cung cấp giải thích về những gì mã SQL trong này hướng dẫn.

Tuy nhiên, đây có lẽ là truy vấn SQL đơn giản nhất có thể. Nếu bạn có thể đọc tiếng Anh, bạn có thể tìm ra nó làm gì!

Chạy hàm create_database với các đối số như trên dẫn đến một cơ sở dữ liệu có tên là 'school' được tạo trong máy chủ của chúng tôi.

Tại sao cơ sở dữ liệu của chúng tôi được gọi là 'trường học'? Có lẽ bây giờ sẽ là thời điểm tốt để xem xét chi tiết hơn về chính xác những gì chúng ta sẽ triển khai trong hướng dẫn này.

Cơ sở dữ liệu của chúng tôi

Sơ đồ mối quan hệ thực thể cho cơ sở dữ liệu của chúng tôi.

Theo ví dụ trong loạt bài trước của tôi, chúng tôi sẽ triển khai cơ sở dữ liệu cho Trường Ngôn ngữ Quốc tế - một trường đào tạo ngôn ngữ hư cấu cung cấp các bài học ngôn ngữ chuyên nghiệp cho khách hàng doanh nghiệp.

Sơ đồ mối quan hệ thực thể (ERD) này đưa ra các thực thể của chúng tôi (Giáo viên, Khách hàng, Khóa học và Người tham gia) và xác định mối quan hệ giữa chúng.

Tất cả thông tin liên quan đến ERD là gì và những điều cần cân nhắc khi tạo và thiết kế cơ sở dữ liệu có thể được tìm thấy trong bài viết này.

Mã SQL thô, các yêu cầu cơ sở dữ liệu và dữ liệu để đi vào cơ sở dữ liệu đều có trong kho lưu trữ GitHub này, nhưng bạn sẽ thấy tất cả khi chúng ta xem qua hướng dẫn này.

Kết nối với Cơ sở dữ liệu

Bây giờ chúng ta đã tạo cơ sở dữ liệu trong MySQL Server, chúng ta có thể sửa đổi hàm create_server_connection của mình để kết nối trực tiếp với cơ sở dữ liệu này.

Lưu ý rằng thực tế có thể - phổ biến - có nhiều cơ sở dữ liệu trên một Máy chủ MySQL, vì vậy chúng tôi muốn kết nối luôn và tự động với cơ sở dữ liệu mà chúng tôi quan tâm.

Đây là một hàm chính xác, nhưng bây giờ chúng ta lấy thêm một đối số - tên cơ sở dữ liệu - và chuyển nó làm đối số cho phương thức connect ().

Tạo một hàm thực thi truy vấn

Hàm cuối cùng mà chúng ta sẽ tạo (hiện tại) là một hàm cực kỳ quan trọng - một hàm thực thi truy vấn. Điều này sẽ lấy các truy vấn SQL của chúng tôi, được lưu trữ trong Python dưới dạng chuỗi và chuyển chúng đến phương thức cursor.execute () để thực thi chúng trên máy chủ.

Hàm này hoàn toàn giống với hàm create_database của chúng ta trước đó, ngoại trừ việc nó sử dụng phương thức connect.commit () để đảm bảo rằng các lệnh chi tiết trong truy vấn SQL của chúng ta được triển khai.

Đây sẽ là hàm workhorse của chúng tôi, chúng tôi sẽ sử dụng (cùng với create_db_connection) để tạo bảng, thiết lập mối quan hệ giữa các bảng đó, điền dữ liệu vào bảng, cập nhật và xóa các bản ghi trong cơ sở dữ liệu của chúng tôi.

Nếu bạn là một chuyên gia SQL, chức năng này sẽ cho phép bạn thực thi bất kỳ và tất cả các lệnh và truy vấn phức tạp mà bạn có thể gặp phải, trực tiếp từ một tập lệnh Python. Đây có thể là một công cụ rất mạnh để quản lý dữ liệu của bạn.


Làm cách nào để tôi có thể hợp nhất một excel với hàng nghìn bản ghi mã zip (không có vĩ độ / dài) với tệp hình dạng zipcode centroid có vĩ độ / dài?

Tôi đang chạy thử nghiệm mẫu cho một tập dữ liệu lớn hơn nhiều. Tôi đã được cung cấp một bảng tính excel với 3000 bản ghi có mã zip (và các dữ liệu khác), nhưng không có mã định danh không gian địa lý nào khác. Tôi đang cố tạo một tệp hình dạng từ tệp này.

Tuy nhiên, tôi đang gặp sự cố do có vô số mã zip trùng lặp. Tôi & # x27m cảm thấy khó khăn khi & quot; tham gia & quot với tệp hình dạng zipcode centroid (có vĩ độ / độ dài) mà tôi & # x27đã tạo.

Có thể không và nếu có thì làm cách nào để hợp nhất / tham gia tệp hình dạng mã zip centroid và tự động điền bảng tính excel với vĩ độ / kinh độ liên quan, giữ các mã zip trùng lặp? Sau đó xuất kết quả này thành shapefile của riêng nó? Ví dụ: Kết quả được kết hợp sẽ hiển thị 3000 bản ghi, với các mã zip trùng lặp, nhưng bây giờ có vĩ độ / dài được liên kết với nó để nó có thể được ánh xạ và phân tích?


Tóm lược

Điều này hoàn thành blog của chúng tôi. Trong phần đầu tiên, tôi đã giải thích bốn trong sáu bước để xây dựng giải pháp mẫu của chúng tôi. Tôi đã chia sẻ thông tin có giá trị về Export Subnetwork và cách tải xuống và phân tích cú pháp trả về JSON của công cụ. Trong phần thứ hai này, chúng tôi đã hoàn thành mẫu với hai bước cuối cùng và tôi đã thảo luận chi tiết về đầu ra JSON của mạng con xuất, làm việc với dịch vụ tính năng của mạng tiện ích của bạn và các phần tử dữ liệu của nó, tạo tính năng bao gồm hình học từ JSON và thay đổi các miền được mã hóa sang mô tả thân thiện với người dùng và ghi động vào nhiều đầu ra. Nhìn chung, tôi đã hướng dẫn cách xây dựng một công cụ tự động hóa mạng con xuất bằng phần mở rộng Khả năng tương tác dữ liệu của ArcGIS Pro. Cuối cùng, tôi đã hướng dẫn bạn cách chạy & amp định cấu hình bàn làm việc được tham số hóa và cách sử dụng hộp công cụ Spatial ETL trong Pro. Tệp bàn làm việc này hiện đã sẵn sàng để tự động hóa hơn nữa để xuất tất cả mạng con của bất kỳ mạng tiện ích nào & # 8230tệp sẽ là chủ đề cho blog tiếp theo của tôi.

Tôi hy vọng bạn đã làm được điều đó đến nay và thấy blog có nhiều thông tin và hữu ích. Vui lòng để lại nhận xét bên dưới với bất kỳ câu hỏi nào về mẫu được cung cấp hoặc với Export Subnetwork của chính nó.

Hình ảnh thẻ và biểu ngữ của:


Cách nhanh chóng tìm kiếm thông qua danh sách rất lớn các chuỗi / bản ghi trên cơ sở dữ liệu

Tôi gặp sự cố sau: Tôi có một cơ sở dữ liệu chứa hơn 2 triệu bản ghi. Mỗi bản ghi có một trường chuỗi X và tôi muốn hiển thị danh sách các bản ghi mà trường X chứa một chuỗi nhất định. Mỗi bản ghi có kích thước khoảng 500 byte.

Để làm cho nó cụ thể hơn: trong GUI của ứng dụng của tôi, tôi có một trường văn bản để tôi có thể nhập một chuỗi. Phía trên trường văn bản, tôi có một bảng hiển thị (N đầu tiên, ví dụ: 100) bản ghi khớp với chuỗi trong trường văn bản. Khi tôi nhập hoặc xóa một ký tự trong trường văn bản, nội dung bảng phải được cập nhật nhanh chóng.

Tôi tự hỏi liệu có cách nào hiệu quả để thực hiện việc này bằng cách sử dụng cấu trúc chỉ mục và / hoặc bộ nhớ đệm thích hợp không. Như đã giải thích ở trên, tôi chỉ muốn hiển thị N mục đầu tiên phù hợp với truy vấn. Do đó, đối với N đủ nhỏ, việc tải các mục phù hợp từ cơ sở dữ liệu không phải là một vấn đề lớn. Bên cạnh đó, bộ nhớ đệm các mục trong bộ nhớ chính có thể giúp truy xuất nhanh hơn.

Tôi nghĩ vấn đề chính là làm thế nào để tìm các mục phù hợp một cách nhanh chóng, với chuỗi mẫu. Tôi có thể dựa vào một số cơ sở DBMS hay tôi phải tự xây dựng một số chỉ mục trong bộ nhớ? Có ý kiến ​​gì không?

Tôi đã chạy một thử nghiệm đầu tiên. Tôi đã chia các bản ghi thành các tệp văn bản khác nhau (nhiều nhất là 200 bản ghi cho mỗi tệp) và đặt các tệp trong các thư mục khác nhau (tôi đã sử dụng nội dung của một trường dữ liệu để xác định cây thư mục). Tôi kết thúc với khoảng 50000 tệp trong khoảng 40000 thư mục. Sau đó tôi đã chạy Lucene để lập chỉ mục các tệp. Tìm kiếm một chuỗi bằng chương trình demo Lucene khá nhanh. Việc tách và lập chỉ mục mất vài phút: điều này hoàn toàn có thể chấp nhận được đối với tôi vì đây là tập dữ liệu tĩnh mà tôi muốn truy vấn.

Bước tiếp theo là tích hợp Lucene vào chương trình chính và sử dụng các lần truy cập do Lucene trả về để tải các bản ghi có liên quan vào bộ nhớ chính.


Một cách tốt để thực hiện việc so sánh này là sử dụng find với md5sum, sau đó là một khác biệt.

Sử dụng find để liệt kê tất cả các tệp trong thư mục, sau đó tính toán băm md5 cho mỗi tệp và phân loại nó theo tên tệp thành một tệp:

Thực hiện quy trình tương tự với thư mục khác:

Sau đó, so sánh kết quả hai tệp với khác nhau:

Hoặc dưới dạng một lệnh duy nhất sử dụng thay thế quy trình:

Nếu bạn chỉ muốn xem các thay đổi:

Lệnh cắt chỉ in ra băm (trường đầu tiên) được so sánh bởi khác biệt. Nếu không, diff sẽ in ra mọi dòng vì các đường dẫn thư mục khác nhau ngay cả khi hàm băm giống nhau.

Nhưng bạn sẽ không biết tệp nào đã thay đổi.

Đối với điều đó, bạn có thể thử một cái gì đó như

Chiến lược này rất hữu ích khi hai thư mục được so sánh không nằm trong cùng một máy và bạn cần đảm bảo rằng các tệp bằng nhau trong cả hai thư mục.

Một cách tốt khác để thực hiện công việc là sử dụng lệnh diff của Git (có thể gây ra sự cố khi các tệp có các quyền khác nhau -> mọi tệp được liệt kê trong đầu ra sau đó):


18 câu trả lời 18

Nếu bạn không thể sử dụng một trong nhiều công cụ hiện có do sự cố kết nối và muốn so sánh "ngoại tuyến", bạn có thể sử dụng SSMS để tạo tập lệnh cho tất cả các đối tượng cơ sở dữ liệu bằng cách nhấp chuột phải vào cơ sở dữ liệu và sử dụng "Nhiệm vụ. / Tạo tập lệnh" và đảm bảo bạn chọn tạo một tệp cho mỗi đối tượng.

Khi bạn đã thực hiện điều đó cho cả hai cơ sở dữ liệu, hãy lấy hai bộ tập lệnh vào một máy cục bộ trong hai thư mục riêng biệt và sử dụng WinMerge (hoặc tương tự) để so sánh hai tập lệnh.

Sau khi vật lộn với một cách dễ dàng để thực hiện cùng một tác vụ này - xem có gì thay đổi giữa 2 mô hình, tôi đã viết Tập lệnh SQL sau đây sẽ so sánh hai lược đồ để xác định cột mới và cột đã xóa

Một tùy chọn khác là sử dụng SQL Server Data Tools (SSDT), một phần mở rộng của Visual Studio. Bạn có thể trích xuất giản đồ cơ sở dữ liệu của mình dưới dạng tệp .dacpac và so sánh với một tệp .dacpac khác hoặc cơ sở dữ liệu hiện có. SSDT được bao gồm trong các công cụ máy khách SQL Server 2012, giúp nó dễ tiếp cận. Bạn có thể tìm thấy hướng dẫn đầy đủ về cách chạy so sánh trên trang MSDN.

Thực hiện tìm kiếm "SQL Server Compare" và bạn sẽ tìm thấy rất nhiều công cụ. Cái mà chúng tôi sử dụng trong công việc của tôi là Red Gate SQLCompare. Nó có một thử nghiệm 14 ngày. Nhưng vì bạn đang nói về hai môi trường khác nhau nên tôi không nghĩ điều đó sẽ phù hợp với bạn, trừ khi khách hàng gửi cho bạn bản sao lưu DB của họ. Tùy chọn khác là viết các truy vấn đối với các bảng hệ thống (như sys.indexes, sys.tables, v.v.).

Có thể script miễn phí https://github.com/dlevsha/compalex này có thể giúp bạn. Nó hỗ trợ Microsoft SQL Server.

Compalex là một tập lệnh nhẹ miễn phí để so sánh hai lược đồ cơ sở dữ liệu. Nó hỗ trợ MySQL, MS SQL Server và PostgreSQL.

Nếu bạn cần so sánh nhiều hơn một tệp cơ sở dữ liệu, bạn có thể tập lệnh SQLPackage.exe.

Tôi không có mã làm việc cho bạn nhưng bạn có thể xem tài liệu SQLPackage.exe để tìm cảm hứng.

Bạn sẽ trích xuất cơ sở dữ liệu chính của mình thành tệp dacpac và sau đó so sánh tệp dacpac với phần còn lại của cơ sở dữ liệu của bạn. Kết quả của việc so sánh có thể là báo cáo xml về những thay đổi hoặc tệp .sql mà bạn có thể chạy để đồng bộ hóa cơ sở dữ liệu.

Bạn có thể xem bài viết này hoặc bài viết này để biết mã mẫu.

Tôi đã có câu hỏi chính xác này và tôi tin rằng Microsoft SQL Server Management Studio (SSMS) có một giải pháp dễ dàng / đơn giản hơn nhiều so với bất kỳ điều gì tôi thấy ở đây. Tôi có một trang web sản xuất với MS SQL Server Express và sắp có thêm một số nơi tôi không muốn phải cài đặt VisualStudio hoặc các ứng dụng khác ngoài SSMS.

Vì vậy, trong SSMS, nhấp chuột phải vào cơ sở dữ liệu để lấy lược đồ. Lựa chọn Nhiệm vụ> Tạo tập lệnh. để mở một trình hướng dẫn để viết kịch bản cho lược đồ và cấu hình cho toàn bộ cơ sở dữ liệu (hoặc các đối tượng được chọn nếu bạn muốn). Tôi đã giữ tất cả các tùy chọn mặc định ngoại trừ đường dẫn / tên tệp, nhưng công cụ này có rất nhiều tùy chọn. Trình hướng dẫn đã tạo một SQL mà tôi đã sao chép qua OneDrive trở lại PC của mình. Sau đó, tôi đã sử dụng Notepad ++ để so sánh SQL với một tệp được tạo theo cách tương tự với cơ sở dữ liệu SIT của tôi. Bạn phải lọc ra các lượt truy cập từ ngày / giờ trong các nhận xét, nhưng nếu không thì đó là một so sánh tuyệt vời giữa hai cơ sở dữ liệu.

Mau! Viết ra điều này khó hơn đáng kể so với thực hiện so sánh thực tế.

Cách dễ nhất là sử dụng một công cụ tự động được xây dựng cho mục đích này, nhưng nếu bạn không có quyền truy cập vào một, bạn có thể nhận được tất cả thông tin cơ bản mà bạn cần từ các chế độ xem INFORMATION_SCHEMA.

Sử dụng siêu dữ liệu trong INFORMATION_SCHEMA có lẽ là một tùy chọn dễ dàng hơn so với việc tạo tập lệnh DDL và thực hiện so sánh nguồn vì bạn có nhiều quyền kiểm soát hơn đối với cách dữ liệu được trình bày. Bạn thực sự không thể kiểm soát thứ tự mà các tập lệnh được tạo sẽ trình bày các đối tượng trong cơ sở dữ liệu. Ngoài ra, các tập lệnh chứa một loạt văn bản có thể phụ thuộc vào việc triển khai theo mặc định và có thể gây ra nhiều "nhiễu" không khớp khi những gì bạn có thể thực sự cần tập trung vào là một bảng, dạng xem hoặc cột bị thiếu hoặc có thể là một kiểu dữ liệu cột hoặc kích thước không phù hợp.

Viết một truy vấn (hoặc các truy vấn) để lấy thông tin quan trọng đối với mã của bạn từ dạng xem INFORMATION_SCHEMA và chạy nó trên từng Máy chủ SQL từ SSMS. Sau đó, bạn có thể kết xuất kết quả vào một tệp và sử dụng công cụ so sánh tệp văn bản (thậm chí MS Word) hoặc bạn có thể kết xuất kết quả vào bảng và chạy truy vấn SQL để tìm sự không khớp.

Tôi bao gồm câu trả lời này vì lợi ích của một câu hỏi mới đã được đánh dấu là trùng lặp.

Tôi đã từng phải so sánh hai cơ sở dữ liệu sản xuất và tìm ra bất kỳ sự khác biệt nào về lược đồ giữa chúng. Các mục duy nhất được quan tâm là các bảng đã được thêm hoặc bớt và các cột đã được thêm, bớt hoặc thay đổi. Tôi không còn có các tập lệnh SQL mà tôi đã phát triển, nhưng những gì tiếp theo là chiến lược chung. Và cơ sở dữ liệu không phải là SQL Server, nhưng tôi nghĩ chiến lược tương tự cũng được áp dụng.

Đầu tiên, tôi đã tạo thứ tốt nhất có thể được mô tả dưới dạng siêu cơ sở dữ liệu. Các bảng người dùng của cơ sở dữ liệu này chứa các mô tả dữ liệu được sao chép từ các bảng hệ thống của cơ sở dữ liệu sản xuất. Những thứ như Tên bảng, Tên cột, Kiểu dữ liệu và Độ chính xác. Có một mục nữa, Tên cơ sở dữ liệu, không tồn tại trong một trong hai cơ sở dữ liệu sản xuất.

Tiếp theo, tôi đã phát triển các tập lệnh kết hợp các lựa chọn từ các bảng hệ thống của cơ sở dữ liệu sản xuất với các phần chèn vào bảng người dùng của siêu cơ sở dữ liệu.

Cuối cùng, tôi đã phát triển các truy vấn để tìm các bảng tồn tại trong một cơ sở dữ liệu nhưng không tồn tại trong cơ sở dữ liệu kia và các cột từ các bảng trong cả hai cơ sở dữ liệu chỉ nằm trong một cơ sở dữ liệu và các cột có định nghĩa không nhất quán giữa hai cơ sở dữ liệu.

Trong số khoảng 100 bảng và 600 cột, tôi tìm thấy một số điểm không nhất quán và một cột được xác định là dấu phẩy động trong một cơ sở dữ liệu và một số nguyên trong cơ sở dữ liệu kia. Lần cuối cùng đó hóa ra là một món quà trời cho, bởi vì nó đã phát hiện ra một vấn đề đã gây khó khăn cho một trong những cơ sở dữ liệu trong nhiều năm.

Mô hình cho siêu cơ sở dữ liệu được đề xuất bởi các bảng hệ thống được đề cập. Các truy vấn không khó để tạo, chủ yếu xoay quanh nhóm theo từng nhóm và có số đếm (tên cơ sở dữ liệu) = 1.

Trong trường hợp của bạn, với 700 cơ sở dữ liệu sản xuất, bạn có thể muốn tự động hóa hai bước đầu tiên nhiều hơn tôi đã làm với chỉ hai cơ sở dữ liệu để so sánh. Nhưng ý tưởng cũng tương tự.


Xem video: Nhập môn Lập trình OOP với Java: Bài 28 - Collections Framework phiên bản 4