Select to view content in your preferred language

Kontrola nesouladu datových typů domén a sloupců v geodatabázi

71
0
Wednesday
Labels (1)
MartinKrál
Esri Contributor
1 0 71

I v pečlivě udržované starší geodatabázi je občas možné nalézt nesoulad datových typů mezi doménou a sloupcem, ke kterému je ona doména přiřazena.

Byť by k tomu teoreticky správně docházet nemělo, protože při přiřazení domény sloupci jsou datové typy funkcemi ArcGIS kontrolovány a při změně datového typu sloupce taktéž, stát se to přeci jen tu a tam může, například při importu XML schémat vytvořených nebo upravených mimo ArcGIS, nebo při nepodporovaných úpravách schématu přímo v databázi (mimo nástroje ArcGIS).

Tato nekonzistence může v geodatabázi zůstávat dlouhou dobu bez povšimnutí a nezpůsobovat žádný zjevný problém, dokud se neobjeví nějaký vzácně pouštěný nástroj, který si s tímto nesouladem typů neporadí. I z toho důvodu je lepší se těmto nekonzistencím vyvarovat a opravit je, nebo o nich alespoň vědět. Jak ale tyto ojedinělé nekonzistence v košatém schématu s mnoha třídami v různých datasetech a tabulkami s mnoha sloupci nalézt?

Jedno z řešení nabízí funkce arcpy pro vypsání rozličných objektů geodatabáze, primárně tedy domén arcpy.da.ListDomains() a sloupců arcpy.ListFields(table). V cyklech tak můžeme ve workspace projít datasety, v těchto datasetech i mimo ně nalézt všechny třídy a tabulky a tyto v dalším cyklu projít a pro každý sloupec s doménou provést kontrolu.

Drobnou komplikací jsou různé názvy sobě odpovídajících datových typů u výpisu domén a sloupců (například u domén Short a u sloupců odpovídající SmallInteger), ale protože těchto moc není, není problém je ve skriptu na odpovídající typ přemapovat.

 

# -*- coding: utf-8 -*-
import arcpy

arcpy.env.workspace = "C:\\TEMP\\PG_GISDATA_SDE.sde"

#načtení informace o doménach
domains = arcpy.da.ListDomains()

#namapování odpovídajících si jinak pojmenovaných datových typů u sloupců a domén
print("načítání domén")
domain_types=['Short','Long','Text','Float']
field_types=['SmallInteger','Integer','String','Single']
domaininfo=[]
for d in domains:
    if any(e== d.type for e in domain_types):
        domaininfo.append([d.name,field_types[domain_types.index(d.type)]])
    else:
        domaininfo.append([d.name,d.type])

#načtení jmen všech datasetů s přidáním prázdného řetězce pro vypsání i tříd mimo datasety
print("načítání tříd a tabulek")
datasets = arcpy.ListDatasets("*", "Feature")
datasets.append("")

#načtení do seznamu všch jmen tříd prvků 
table_list=[]
for dataset in datasets:
    dataset_featureclasses = arcpy.ListFeatureClasses("*","",dataset)
    for featureclass in dataset_featureclasses:
        table_list.append(featureclass)

#přidání do seznamu všech tabulek
tables = arcpy.ListTables()
for table in tables:
    table_list.append(table)

#pro všechny objekty v seznamu projde jejich sloupce a zkontroluje  
# zda si odpovídají datové typy sloupce a odpovídající domény
print("kontrola typů u sloupců a domén")
counter=0
for table_name in table_list:
    fields=arcpy.ListFields(table_name)
    for field in fields:
        for domain in domaininfo:
            #výpis nesrovnalostí tam kde doména má jiný typ než sloupec
            if domain[0]==field.domain and domain[1]!=field.type:
                counter += 1
                print(table_name+";"+field.name+";"+field.type+";"+field.domain+";"+domain[1])
print("nalezeno "+ str(counter)+" nekonzistencí")