W Arcpy, jak wykryć klasy relacji w pliku GDB (lub nie mogę)?

10

Chciałbym móc wykryć klasy relacji w pliku GDB. Ponieważ użytkownicy mojego skryptu mogą mieć tylko licencję na poziomie ArcView, nie byliby w stanie manipulować schematem klasy obiektów (w szczególności w celu dodania pola) znajdującego się w obszarze roboczym zawierającym klasy relacji. Jak wykryć obecność klas relacji, aby móc je dokumentować, programowo ich unikać i pozwolić na kontynuowanie skryptu?

flet celtycki
źródło

Odpowiedzi:

6

relationshipClassNamesNieruchomość miała to zrobić, ale nie wydaje się do pracy dla mnie (testowane w geobazie plików, utworzonego klasy relacji między dwoma klasami fabularnych, sprawdzone nieruchomości, lista jest pusta zwrócone do obu). Może to zadziała dla ciebie.

blah238
źródło
Dzięki. Brakowało mi przede wszystkim sposobu na dostanie się na lekcje relacji, ale dałeś mi wskazówkę. Sprawdzę właściwość relacjiClassNames i dam znać, jak to działa (lub nie działa).
celticflute,
3

Zgodnie z sugestią @ blah238, ten kod python wyświetla wszystkie klasy relacji w Geobazie i umieszcza je na unikalnej liście (relClasses):

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
źródło
1

Walczyłem z tym, dopóki nie zdałem sobie sprawy, że arcpy widzi klasy relacji w tabelach, z którymi są one powiązane. Oto mały fragment kodu, aby sprawdzić nazwy klas relacji większe niż 30:

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
źródło
0

Jestem w 10.5.1 i wygląda jak relationshipClassNames daje mi listę nazw klas relacja jak to miało

layer = "C:\\Geodatabases\\somegeodatabase.gdb\\my_layer"
desc = arcpy.Describe(layer)
print desc.relationshipClassNames
Aamir Suleman
źródło