I want to define a table that has a compound field which concatenates
data from two different field values on form submission. In addition,
I would like to check the database on validation to make sure that the
current record is the only to have that "combinada" field value. The
unique argument restriction grants the redundancy is not allowed, but
when duplicated values are sent, the model does not catch database
integrity errors and therefore an exception is raised, at least that
is what I assume so far. How could I catch the db exception at
validation instead of having to handle an adapter related error (which
in turn will probably work only for the current database adapter)?

The prototype is as follows (using the default sqlite uri).

Model:

db.define_table("combinada", Field("combinado",
requires=IS_NOT_EMPTY(), compute=lambda row: row.primero+row.segundo,
unique=True, writable=False), Field("primero",
requires=IS_NOT_EMPTY()), Field("segundo", requires=IS_NOT_EMPTY()))

Here is the error traceback stored by web2py:

Traceback (most recent call last):
  File "/home/alan/web2py/web2py-hg/gluon/restricted.py", line 204, in
restricted
    exec ccode in environment
  File "/home/alan/web2py/web2py-hg/applications/compute/controllers/
default.py", line 73, in <module>
  File "/home/alan/web2py/web2py-hg/gluon/globals.py", line 172, in
<lambda>
    self._caller = lambda f: f()
  File "/home/alan/web2py/web2py-hg/applications/compute/controllers/
default.py", line 18, in index
    form = crud.create(db.combinada)
  File "/home/alan/web2py/web2py-hg/gluon/tools.py", line 3168, in
create
    formname=formname,
  File "/home/alan/web2py/web2py-hg/gluon/tools.py", line 3111, in
update
    detect_record_change = self.settings.detect_record_change):
  File "/home/alan/web2py/web2py-hg/gluon/sqlhtml.py", line 1273, in
accepts
    self.vars.id = self.table.insert(**fields)
  File "/home/alan/web2py/web2py-hg/gluon/dal.py", line 6634, in
insert
    return self._db._adapter.insert(self,self._listify(fields))
  File "/home/alan/web2py/web2py-hg/gluon/dal.py", line 934, in insert
    raise e
IntegrityError: column combinado is not unique

Reply via email to