[GRASS-user] SQL in GRASS

Moritz Lennert mlennert at club.worldonline.be
Tue Jun 2 06:06:32 PDT 2020


On 2/06/20 14:42, Uwe Fischer wrote:
> Hello list,
> 
> I tried the following expression in a Python script, but it does not 
> work

Please be more specific than just saying "it does not work". Do you see 
an error message ? Wrong results in the table ?

> (I need to subtract the lowest value for column „srtmh“ from all 
> other values for that item and write the result to column „strmh2“):
> 
> grass.run_command('v.db.update', map='dgnpt', column='srtmh2', 
> qcolumn="('srtmh' - (select min('srtmh') from 'dgnpt'))")

I think your quoting is off.

For me such a command works. E.g. in the NC demo dataset:

g.copy vect=censusblk_swwake,test
v.db.addcolumn test col="test double precision"

and then in python:

import grass.script as g
g.run_command('v.db.update', map='test', column='test', 
value="'HH_SIZE'-(SELECT avg('HH_SIZE') FROM test)")
g.run_command('v.db.update', map='test', column='test', 
value="HH_SIZE-(SELECT avg(HH_SIZE) FROM test)")

However, if I quote like you do:

g.run_command('v.db.update', map='test', column='test', 
value="'HH_SIZE'-(SELECT avg('HH_SIZE') FROM 'test')")

the result is all zeroes.

This tells the database that all words in single quotes are strings, not 
db entity names.


> The SQL expression itself seems to be ok, because it works in SpatiaLite 
> in the following form:
> 
> update dgnpt set srtmh2 = srtmh-(select min(srtmh) from srtmp);

Try running

update dgnpt set srtmh2 = 'srtmh'-(select min('srtmh') from 'srtmp')

You probably won't get what you expect, either.


> 
>   And by the way, when I try scripts I often get a message „Process
>   ended with non-zero return code 1. See errors in the (error) output.“
> 
> But what is that error output? Where can I read the error message in 
> detail? Sorry for that question, but I found no hints in the manual 
> pages.  :-(

Generally, you have to look further up for the actual error, at the 
beginning of the error message. E.g. when I run the above command but 
using an incorrect table name:

g.run_command('v.db.update', map='test', column='test', 
value="HH_SIZE-(SELECT avg(HH_SIZE) FROM test2)")

I get:

*****************************
DBMI-SQLite erreur de pilote :
Error in sqlite3_prepare():
no such table: test2

DBMI-SQLite erreur de pilote :
Error in sqlite3_prepare():
no such table: test2

ERREUR : Error while executing: 'UPDATE test SET test=HH_SIZE-(SELECT
          avg(HH_SIZE) FROM test2)'
Traceback (most recent call last):
   File "/usr/lib/grass78/scripts/v.db.update", line 129, in <module>
     sys.exit(main())
   File "/usr/lib/grass78/scripts/v.db.update", line 120, in main
     grass.write_command('db.execute', input='-', database=database, 
driver=driver, stdin=cmd)
   File "/usr/lib/grass78/etc/python/grass/script/core.py", line 588, in 
write_command
     return handle_errors(returncode, returncode, args, kwargs)
   File "/usr/lib/grass78/etc/python/grass/script/core.py", line 342, in 
handle_errors
     raise CalledModuleError(module=None, code=code,
grass.exceptions.CalledModuleError: Module run None db.execute input=- 
database=/home/mlennert/GRASSDATA/nc_spm_08_grass7/user1/sqlite/sqlite.db 
driver=sqlite ended with error
Process ended with non-zero return code 1. See errors in the (error) output.
*****************************

I see the 'Process ended with non-zero return code 1" and going further 
up I see:

ERREUR : Error while executing: 'UPDATE test SET test=HH_SIZE-(SELECT
          avg(HH_SIZE) FROM test2)'

and even further up:

DBMI-SQLite erreur de pilote :
Error in sqlite3_prepare():
no such table: test2

Moritz


More information about the grass-user mailing list