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í")
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.