v.db.renamecolumn.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #!/usr/bin/env python
  2. ############################################################################
  3. #
  4. # MODULE: v.db.renamecolumn
  5. # AUTHOR(S): Markus Neteler
  6. # Converted to Python by Glynn Clements
  7. # PURPOSE: interface to db.execute to drop a column from the
  8. # attribute table connected to a given vector map
  9. # - Based on v.db.dropcolumn
  10. # - with special trick for SQLite and DBF (here the new col is
  11. # added/values copied/old col deleted)
  12. # COPYRIGHT: (C) 2007 by the GRASS Development Team
  13. #
  14. # This program is free software under the GNU General Public
  15. # License (>=v2). Read the file COPYING that comes with GRASS
  16. # for details.
  17. #
  18. # TODO: MySQL untested
  19. #############################################################################
  20. #%module
  21. #% description: Renames a column in the attribute table connected to a given vector map.
  22. #% keyword: vector
  23. #% keyword: attribute table
  24. #% keyword: database
  25. #% keyword: rename
  26. #%end
  27. #%option G_OPT_V_MAP
  28. #%end
  29. #%option G_OPT_V_FIELD
  30. #%end
  31. #%option
  32. #% key: column
  33. #% type: string
  34. #% description: Old and new name of the column (old,new)
  35. #% required: yes
  36. #% multiple: no
  37. #% key_desc: oldcol,newcol
  38. #%end
  39. import sys
  40. import os
  41. import grass.script as grass
  42. # i18N
  43. import gettext
  44. gettext.install('grassmods', os.path.join(os.getenv("GISBASE"), 'locale'))
  45. def main():
  46. map = options['map']
  47. layer = options['layer']
  48. column = options['column']
  49. mapset = grass.gisenv()['MAPSET']
  50. if not grass.find_file(map, element='vector', mapset=mapset):
  51. grass.fatal(_("Vector map <%s> not found in current mapset") % map)
  52. f = grass.vector_layer_db(map, layer)
  53. table = f['table']
  54. keycol = f['key']
  55. database = f['database']
  56. driver = f['driver']
  57. if not table:
  58. grass.fatal(_("There is no table connected to the input vector map. Cannot rename any column"))
  59. cols = column.split(',')
  60. oldcol = cols[0]
  61. newcol = cols[1]
  62. if driver == "dbf":
  63. if len(newcol) > 10:
  64. grass.fatal(
  65. _("Column name <%s> too long. The DBF driver supports column names not longer than 10 characters") %
  66. newcol)
  67. if oldcol == keycol:
  68. grass.fatal(
  69. _("Cannot rename column <%s> as it is needed to keep table <%s> connected to the input vector map") %
  70. (oldcol, table))
  71. # describe old col
  72. oldcoltype = None
  73. for f in grass.db_describe(table)['cols']:
  74. if f[0] != oldcol:
  75. continue
  76. oldcoltype = f[1]
  77. oldcollength = f[2]
  78. # old col there?
  79. if not oldcoltype:
  80. grass.fatal(_("Column <%s> not found in table <%s>") % (oldcol, table))
  81. # some tricks
  82. if driver in ['sqlite', 'dbf']:
  83. if oldcoltype.upper() == "CHARACTER":
  84. colspec = "%s varchar(%s)" % (newcol, oldcollength)
  85. else:
  86. colspec = "%s %s" % (newcol, oldcoltype)
  87. grass.run_command('v.db.addcolumn', map=map, layer=layer, column=colspec)
  88. sql = "UPDATE %s SET %s=%s" % (table, newcol, oldcol)
  89. grass.write_command('db.execute', input='-', database=database, driver=driver, stdin=sql)
  90. grass.run_command('v.db.dropcolumn', map=map, layer=layer, column=oldcol)
  91. elif driver == 'mysql':
  92. if oldcoltype.upper() == "CHARACTER":
  93. newcoltype = "varchar(%s)" % (oldcollength)
  94. else:
  95. newcoltype = oldcoltype
  96. sql = "ALTER TABLE %s CHANGE %s %s %s" % (table, oldcol, newcol, newcoltype)
  97. grass.write_command('db.execute', input='-', database=database, driver=driver, stdin=sql)
  98. else:
  99. sql = "ALTER TABLE %s RENAME %s TO %s" % (table, oldcol, newcol)
  100. grass.write_command('db.execute', input='-', database=database, driver=driver, stdin=sql)
  101. # write cmd history:
  102. grass.vector_history(map)
  103. if __name__ == "__main__":
  104. options, flags = grass.parser()
  105. main()