Mercurial > dive4elements > river
view flys-backend/contrib/shpimporter/dgm.py @ 5193:fb9dcc68b9c2
Possible fix for flys/1202. Initial SQL statements can now be issued at connection creation.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 07 Mar 2013 17:39:25 +0100 |
parents | f459911fdbfb |
children | 908848b74d7e |
line wrap: on
line source
# -*- coding: utf-8 -*- import codecs import utils def latin(string): return unicode(string, "latin1") # <dbfield> : (<csvfield>, conversion function) DGM_MAP = { "lower" : ("km_von", lambda x: float(x)), "upper" : ("km_bis", lambda x: float(x)), "year_from" : "Jahr_von", "year_to" : "Jahr_bis", "projection" : "Projektion", "elevation_state" : latin("Höhenstatus"), "format" : "Format", "border_break" : ("Bruchkanten", lambda x: True if x.lower() == "Ja" else False), "resolution" : (latin("Auflösung"), lambda x: x), # "description" : "srid" : "SRID", "path" : ("Pfad_Bestand", lambda x: x), } SQL_INSERT_DGT = "INSERT INTO dem (river_id, name, " + ", ".join(DGM_MAP.keys()) + \ ") VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" SQL_INSERT_DGT_ORA = "INSERT INTO dem (river_id, name, " + ", ".join(DGM_MAP.keys()) + \ ") VALUES (:s, :s, :s, :s, :s, :s, :s, :s, :s, :s, :s, :s, :s)" def insertRiverDgm(dbconn, dgmfile, river_name, dry_run, oracle): with codecs.open(dgmfile, "r", "latin1") as csvfile: firstline = csvfile.readline() names = firstline.split(";") namedict = {} field_nr = 0 for name in names: namedict[name] = field_nr field_nr += 1 river_id = utils.getRiverId(dbconn, river_name, oracle) for line in csvfile: fields = line.split(";") if not fields: continue if fields[namedict[latin("Gewässer")]] != river_name: continue else: values=[] for key, val in DGM_MAP.items(): if isinstance(val, tuple): values.append(val[1](fields[namedict[val[0]]])) else: values.append(unicode.encode( fields[namedict[val]], "UTF-8")) name = "%s KM %s - %s" % (river_name, fields[namedict["km_von"]], fields[namedict["km_bis"]]) cur = dbconn.cursor() if oracle: stmt = SQL_INSERT_DGT_ORA else: stmt = SQL_INSERT_DGT cur.execute(stmt, [river_id, name] + values) if not dry_run: dbconn.commit()