Просто
поразительно, сколько неприятных
открытий может принести создание скрипта
на 200 строк, если этот скрипт для ArcGIS.
Про предыдущие две неприятности можно
почитать тут
и тут
(даже три).
А здесь я напишу про третью
четвертую и, надеюсь, последнюю. И вообще,
почему вот сразу - «неприятности»? Надо
включить позитивный настрой, что нас
не убивает то делает нас сильнее.
Как немногим
известно, создав соединение с ArcSDE можно
через этот коннект запузырить в БД почти
любой SQL запрос. В моем случае это сильно
облегчает задачу, ибо SDE у меня и так
есть а необходимость в модулях типа
cx_Oracle отпадает.
Итак, читаю
документацию:
The ArcSDESQLExecute
object supports the execution of most SQL statements and will return
to the user the results of those statements. The object will return a
list of lists in the case where the statement returns rows from a
table; for statements that do not return rows, it will return an
indication of the success or failure of the statement (True for
success, None for failure).
Прекрасно,
результат вернется в виде None, True или
списка. Поскольку у меня запрос на
выборку, я буду ждать список. В документации
и пример кода есть:
import arcpy sdeConn = arcpy.ArcSDESQLExecute("data\Connection to GPSERVER3.sde") sdeReturn = sdeConn.execute(sql) if isinstance(sdeReturn, list): for row in sdeReturn: print row else: if sdeReturn == True: print "SQL statement: " + sql + " ran sucessfully." else: print "SQL statement: " + sql + " FAILED." |
Да простят
меня авторы доки, я выкинул из цитаты
несущественное.
Пишу скрипт,
тестирую — на выходе все время «FAILED».
Ну ёрш твою медь.
Закралось
подозрение, что что-то не так с моим
запросом. Проверил — все в порядке.
Помучался, проверяя разные гипотезы и,
наконец, догадался тупо распечатать
сразу весь результат. Этот результат
(sdeReturn) был прекрасен! В виде строки. Не
список, нет. И не булево значение. И не
None. Строка в юникоде.
Ну что тут
сказать, «не
всякому слову верь» - старая добрая
истина.
Кто предупрежден,
тот вооружен. Правильный код разбора
результата теперь такой:
sdeReturn = sdeConn.execute(sql) log.info("arcpyStuff, ora result '%s', resType '%s'" % (sdeReturn, type(sdeReturn).__name__)) if isinstance(sdeReturn, str) or type(sdeReturn) == unicode: log.info("arcpyStuff, ora return string '%s'" % (sdeReturn.strip())) elif isinstance(sdeReturn, list): log.info("arcpyStuff, ora return %s rows" % (len(sdeReturn))) for row in sdeReturn: log.info("arcpyStuff, row '%s'" % (row)) else: if sdeReturn == True: # DDL? log.info("arcpyStuff, sql statement ran successfully") else: log.info("arcpyStuff, error, sql statement FAILED or resType is unknown") |
И он останется
правильным до следующего открытия,
которое может произойти только в
результате эксперимента над черным
ящиком, именуемым ArcGIS. Закрытые исходники
— это безусловное зло.
Оффтоп.
Кому надо
звонить по заграницам, обратите внимание
на программу Колбаскер (Callbacker)
Она организует
соединение абонентов так, что у обоих
звонок получается входящий. Выходит
очень недорого, главное не пользоваться
роумингом а брать местные симки.
original post http://vasnake.blogspot.com/2012/10/sql-queries-using-arcsde.html
original post http://vasnake.blogspot.com/2012/10/sql-queries-using-arcsde.html
Комментариев нет:
Отправить комментарий