Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-10-12

SQL queries using ArcSDE

Просто поразительно, сколько неприятных открытий может принести создание скрипта на 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

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)