Wie erkenne ich mit arcpy Beziehungsklassen in einer GDB-Datei (oder kann ich nicht)?

10

Ich möchte in der Lage sein, Beziehungsklassen in einer Datei GDB zu erkennen. Da Benutzer meines Skripts möglicherweise nur über eine Lizenz auf ArcView-Ebene verfügen, können sie das Schema einer Feature-Class (insbesondere zum Hinzufügen eines Felds) in einem Arbeitsbereich mit Beziehungsklassen nicht bearbeiten. Wie erkenne ich das Vorhandensein von Beziehungsklassen, damit ich sie dokumentieren, programmgesteuert vermeiden und das Skript fortsetzen kann?

Celticflute
quelle

Antworten:

6

Die relationshipClassNamesEigenschaft soll dies tun, aber es scheint für mich nicht zu funktionieren (in einer Datei-Geodatabase getestet, Beziehungsklasse zwischen zwei Feature-Classes erstellt, die Eigenschaft überprüft, die zurückgegebene Liste ist für beide leer). Vielleicht funktioniert es für Sie.

blah238
quelle
Vielen Dank. Mir fehlte überhaupt, wie ich zu Beziehungsklassen komme, aber du hast mir den Hinweis gegeben. Ich werde die propertyClassNames-Eigenschaft überprüfen und Sie wissen lassen, wie es funktioniert (oder nicht).
Celticflute
3

Gemäß dem Vorschlag von @ blah238 listet dieser Python-Code alle Beziehungsklassen in einer Geodatabase auf und fügt sie in eine eindeutige Liste (relClasses) ein:

inGDB = r"D:\mygeodatabase.gdb"
env.workspace = inGDB
#################Getting all Tables and Feature Classes###########
fcs = []
#root of workspace
for item in arcpy.ListFeatureClasses("*"):    fcs.append(item)
for item in arcpy.ListTables("*"):    fcs.append(item)

fds = arcpy.ListDatasets("*","Feature")
for fd in fds:
    env.workspace = inGDB +'\\'+fd
    for fc in arcpy.ListFeatureClasses("*"):
        fcs.append(fd+'/'+fc)
    for tb in arcpy.ListTables("*"):
        fcs.append(fd+'/'+tb)

env.workspace = inGDB
relClasses = set()
for i,fc in enumerate(fcs): 
    desc = arcpy.Describe(fc)
    for j,rel in enumerate(desc.relationshipClassNames):
        relDesc = arcpy.Describe(rel)
        if relDesc.isAttachmentRelationship:
            continue
        relClasses.add(rel)

print relClasses
Farid Cheraghi
quelle
1

Ich kämpfte damit, bis mir klar wurde, dass arcpy Beziehungsklassen durch die Tabellen sieht, mit denen sie verknüpft sind. Hier ist ein kleiner Code, mit dem Sie nach Beziehungsklassennamen suchen können, die größer als 30 sind:

arcpy.env.workspace = 'C:/workspace'

# Local variables
tables = arcpy.ListTables()

# Iterate through tables in file geodatabase (workspace)
for t in tables:
    # Get relationship class(es) associated with table
    desc = arcpy.Describe(t)
    rcs = desc.relationshipClassNames
# Iterate through any relationship classes associated with current table in loop
    for r in rcs:
        if len(r) > 30:
            print 'Relationship class ' + r + ' has ' + str(len(r)) + ' characters.'
Ian Yau
quelle
0

Ich bin bei 10.5.1 und es sieht so aus, als ob die RelationshipClassNames mir die Liste der Beziehungsklassennamen geben, wie sie sollen

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
Aamir Suleman
quelle