Con arcpy, ¿cómo detecto clases de relación en un archivo GDB (o no puedo)?

10

Me gustaría poder detectar clases de relación en un archivo GDB. Debido a que los usuarios de mi script pueden tener solo una licencia de nivel ArcView, no podrán manipular el esquema de una clase de entidad (específicamente para agregar un campo) que se encuentre en un espacio de trabajo que tenga clases de relación. ¿Cómo detecto la presencia de clases de relación, para poder documentarlas, evitarlas programáticamente y permitir que el script continúe?

celta
fuente

Respuestas:

6

Se supone que la relationshipClassNamespropiedad debe hacer esto, pero no parece funcionar para mí (probado en una geodatabase de archivos, creó una clase de relación entre dos clases de entidad, verificó la propiedad, la lista devuelta está vacía para ambos). Tal vez funcione para ti.

blah238
fuente
Gracias. Me faltaba cómo llegar a clases de relaciones en primer lugar, pero me diste la pista. Revisaré la propiedad relationshipClassNames y le haré saber cómo funciona (o no).
celticflute el
3

Según la sugerencia de @ blah238, este código de Python enumera todas las clases de relación dentro de una Geodatabase y las coloca en una lista única (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
fuente
1

Luché con esto hasta que me di cuenta de que arcpy ve las clases de relación a través de las tablas con las que están asociadas. Aquí hay un pequeño fragmento de código para verificar los nombres de clase de relación mayores de 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
fuente
0

Estoy en 10.5.1 y parece que la relación ClassCames me está dando la lista de nombres de clase de relación como se supone que debería

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