123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/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())
|