Ich habe eine Postgres-Datenbank mit Millionen von Zeilen darin es hat eine Spalte namens Geom, die die Grenze einer Eigenschaft enthält.Postgis - Wie überprüfe ich den Geometrietyp, bevor ich eine Einfügung mache
Mit einem Python-Skript entziehe ich die Informationen aus dieser Tabelle und setze sie erneut in eine neue Tabelle ein.
wenn ich stecke in der neuen Tabelle, die die Skript Fehler aus mit dem folgenden:
Traceback (most recent call last):
File "build_parcels.py", line 258, in <module>
main()
File "build_parcels.py", line 166, in main
update_cursor.executemany("insert into parcels (par_id, street_add, title_no, proprietors, au_name, ua_name, geom) VALUES (%s, %s, %s, %s, %s, %s, %s)", inserts)
psycopg2.IntegrityError: new row for relation "parcels" violates check constraint "enforce_geotype_geom"
Die neue Tabelle hat eine Check-Bedingung enforce_geotype_geom = ((GeometryType (geom) = 'POLYGON' :: Text) OR (Geom IS NULL)) während die alte Tabelle nicht, so its rates ther Daten oder Nicht-Polygon (vielleicht multipolygon Daten?) in der alten Tabelle. Ich möchte die neuen Daten als Polygon beibehalten, damit nichts anderes eingefügt werden kann.
Zuerst habe ich versucht, die Abfrage mit Standard-Python-Fehlerbehandlung mit der Hoffnung, dass die Blind Geom Zeilen würden fehlschlagen, aber das Skript würde weiter laufen, aber das Skript wurde geschrieben, um am Ende nicht jede Zeile zu committen, so dass es nicht funktioniert .
Ich denke, was ich tun muss, ist durch die alten Tabelle Geom Zeilen durchlaufen und überprüfen, welche Art von Geometrie sie sind, so kann ich feststellen, ob ich es behalten oder wegwerfen will, bevor ich in die neue Tabelle einfügen
Was ist der beste Weg, um darüber zu gehen?
danke, hätte sich für eine Hybrid-Python/Postgres-Antwort entschieden, aber das ist erstaunlich, um alles in Postgres zu tun. Danke für deine Antwort – ADAM