123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- #!/usr/bin/env python3
- #
- ############################################################################
- #
- # MODULE: v.db.addcolumnumn
- # AUTHOR(S): Moritz Lennert
- # Converted to Python by Glynn Clements
- # PURPOSE: interface to db.execute to add a column to the attribute table
- # connected to a given vector map
- # COPYRIGHT: (C) 2005 by the GRASS Development Team
- #
- # This program is free software under the GNU General Public
- # License (>=v2). Read the file COPYING that comes with GRASS
- # for details.
- #
- #############################################################################
- # %module
- # % description: Adds one or more columns to the attribute table connected to a given vector map.
- # % keyword: vector
- # % keyword: attribute table
- # % keyword: database
- # %end
- # %option G_OPT_V_MAP
- # %end
- # %option G_OPT_V_FIELD
- # % label: Layer number where to add column(s)
- # %end
- # %option
- # % key: columns
- # % type: string
- # % label: Name and type of the new column(s) ('name type [,name type, ...]')
- # % description: Types depend on database backend, but all support VARCHAR(), INT, DOUBLE PRECISION and DATE. Example: 'label varchar(250), value integer'
- # % required: yes
- # % multiple: yes
- # % key_desc: name type
- # %end
- import grass.script as grass
- from grass.script.utils import encode
- def main():
- map = options["map"]
- layer = options["layer"]
- columns = options["columns"]
- columns = [col.strip() for col in columns.split(",")]
- # does map exist in CURRENT mapset?
- mapset = grass.gisenv()["MAPSET"]
- exists = bool(grass.find_file(map, element="vector", mapset=mapset)["file"])
- if not exists:
- grass.fatal(_("Vector map <%s> not found in current mapset") % map)
- try:
- f = grass.vector_db(map)[int(layer)]
- except KeyError:
- grass.fatal(
- _(
- "There is no table connected to this map. Run v.db.connect or v.db.addtable first."
- )
- )
- table = f["table"]
- database = f["database"]
- driver = f["driver"]
- column_existing = grass.vector_columns(map, int(layer)).keys()
- for col in columns:
- if not col:
- grass.fatal(_("There is an empty column. Did you leave a trailing comma?"))
- col_name = col.split(" ")[0].strip()
- if col_name in column_existing:
- grass.error(_("Column <%s> is already in the table. Skipping.") % col_name)
- continue
- grass.verbose(_("Adding column <%s> to the table") % col_name)
- p = grass.feed_command(
- "db.execute", input="-", database=database, driver=driver
- )
- res = "ALTER TABLE {} ADD COLUMN {}".format(table, col)
- p.stdin.write(encode(res))
- grass.debug(res)
- p.stdin.close()
- if p.wait() != 0:
- grass.fatal(_("Unable to add column <%s>.") % col)
- # write cmd history:
- grass.vector_history(map)
- if __name__ == "__main__":
- options, flags = grass.parser()
- main()
|