#!/usr/bin/env python3 ############################################################################ # # MODULE: db.dropcolumn # AUTHOR(S): Markus Neteler # Converted to Python by Glynn Clements # PURPOSE: Interface to db.execute to drop a column from an # attribute table # - with special trick for SQLite # COPYRIGHT: (C) 2007, 2012 by Markus Neteler and 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: Drops a column from selected attribute table. #% keyword: database #% keyword: attribute table #%End #%flag #% key: f #% description: Force removal (required for actual deletion of files) #%end #%option G_OPT_DB_TABLE #% required : yes #%end #%option G_OPT_DB_COLUMN #% required : yes #%end import sys import string from grass.exceptions import CalledModuleError import grass.script as gscript def main(): table = options['table'] column = options['column'] force = flags['f'] # check if DB parameters are set, and if not set them. gscript.run_command('db.connect', flags='c') kv = gscript.db_connection() database = kv['database'] driver = kv['driver'] # schema needed for PG? if force: gscript.message(_("Forcing ...")) if column == "cat": gscript.warning(_("Deleting <%s> column which may be needed to keep " "table connected to a vector map") % column) cols = [f[0] for f in gscript.db_describe(table)['cols']] if column not in cols: gscript.fatal(_("Column <%s> not found in table") % column) if not force: gscript.message(_("Column <%s> would be deleted.") % column) gscript.message("") gscript.message(_("You must use the force flag (-f) to actually " "remove it. Exiting.")) return 0 if driver == "sqlite": # echo "Using special trick for SQLite" # http://www.sqlite.org/faq.html#q13 colnames = [] coltypes = [] for f in gscript.db_describe(table)['cols']: if f[0] != column: colnames.append(f[0]) coltypes.append("%s %s" % (f[0], f[1])) colnames = ", ".join(colnames) coltypes = ", ".join(coltypes) cmds = [ "BEGIN TRANSACTION", "CREATE TEMPORARY TABLE ${table}_backup(${coldef})", "INSERT INTO ${table}_backup SELECT ${colnames} FROM ${table}", "DROP TABLE ${table}", "CREATE TABLE ${table}(${coldef})", "INSERT INTO ${table} SELECT ${colnames} FROM ${table}_backup", "DROP TABLE ${table}_backup", "COMMIT" ] tmpl = string.Template(';\n'.join(cmds)) sql = tmpl.substitute(table=table, coldef=coltypes, colnames=colnames) else: sql = "ALTER TABLE %s DROP COLUMN %s" % (table, column) try: gscript.write_command('db.execute', input='-', database=database, driver=driver, stdin=sql) except CalledModuleError: gscript.fatal(_("Cannot continue (problem deleting column)")) return 0 if __name__ == "__main__": options, flags = gscript.parser() sys.exit(main())