Сбой ограничения FOREIGN KEY в Web2py - PullRequest
0 голосов
/ 28 мая 2018

У меня есть две таблицы в tables.py -

db.define_table('spr_details',
Field('SPR_name', 'string', unique=True, notnull=True),
Field('Object_location',notnull=True),
Field('NSK_System',notnull=True,),
primarykey = ['SPR_name'],migrate=True)

db.define_table('my_master_table',
Field('Test_id',notnull=True),
Field('Test_suite',notnull=True),
Field('Test_category',notnull=True),
Field('Test_unit',notnull=True),
Field('Test_case',notnull=True),
Field ('Applicability', db.spr_details,'string'),migrate=True)

Я вставил одну строку в таблицу spr_details.Теперь, когда я вставляю запись в таблицу my_master, я выбираю ранее вставленное значение из выпадающего столбца Применимость.Но при отправке я получаю ошибку

FOREIGN KEY.

ниже - трассировка стека -

трассировка стека

Traceback

 Traceback (most recent call last):
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\restricted.py", line 219, in restricted
    exec(ccode, environment)
  File "C:/Users/pandeyar/Downloads/web2py_src/web2py/applications/JDBC_E2E/controllers/default.py", line 183, in <module>
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\globals.py", line 419, in <lambda>
    self._caller = lambda f: f()
  File "C:/Users/pandeyar/Downloads/web2py_src/web2py/applications/JDBC_E2E/controllers/default.py", line 99, in admin
    user_signature=False,
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\sqlhtml.py", line 3338, in smartgrid
    user_signature=user_signature, **kwargs)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\sqlhtml.py", line 2534, in grid
    onsuccess=oncreate)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\html.py", line 2300, in process
    self.validate(**kwargs)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\html.py", line 2238, in validate
    if self.accepts(**kwargs):
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\sqlhtml.py", line 1965, in accepts
    self.vars.id = self.table.insert(**fields)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\packages\dal\pydal\objects.py", line 753, in insert
    ret = self._db._adapter.insert(self, row.op_values())
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\packages\dal\pydal\adapters\base.py", line 486, in insert
    raise e
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\packages\dal\pydal\adapters\base.py", line 481, in insert
    self.execute(query)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\packages\dal\pydal\adapters\__init__.py", line 67, in wrap
    return f(*args, **kwargs)
  File "C:\Users\pandeyar\Downloads\web2py_src\web2py\gluon\packages\dal\pydal\adapters\base.py", line 412, in execute
    rv = self.cursor.execute(command, *args[1:], **kwargs)
sqlite3.IntegrityError: FOREIGN KEY constraint failed

Любая помощь будет чрезвычайно полезна.

1 Ответ

0 голосов
/ 28 мая 2018

Пожалуйста, обратитесь к документации по таблицам с ключами (т. Е. Таблицам, первичный ключ которых не является целочисленным идентификатором поля по умолчанию с автоматическим увеличением), поскольку spr_details является такой таблицей.

Обратите внимание, что с определением ссылочного поля есть две проблемы:

    Field('Applicability', db.spr_details, 'string')

Во-первых, как указано в документации, при ссылке на таблицу с ключами формат для аргумента type для Field() должен быть'reference tablename.fieldname', а не db.tablename.Во-вторых, вы не должны отдельно указывать тип ссылочного поля (т. Е. Вы не должны передавать 'string' в качестве третьего аргумента Field(), поскольку третий аргумент является аргументом length, а не type -type выводится в зависимости от типа поля, на которое делается ссылка).Итак, определение поля должно быть:

    Field('Applicability', 'reference spr_details.SPR_name')

Обратите внимание, что с вашим текущим неправильным определением поля Applicability поле становится целочисленным полем (так как оно ожидает сохранения ссылки на поле целочисленного идентификаторав чужой таблице).Если вы попытаетесь вставить целое число, вы получите ошибку сбоя ограничения внешнего ключа, а если вы попытаетесь вставить строку, вы получите ошибку о вставке строки, где ожидается int.Вы не должны получать никаких ошибок, если используете правильное определение поля, как показано выше, и вставляете строковые значения, которые соответствуют значениям, существующим в поле db.spr_details.SPR_name.

Также обратите внимание, что web2py предполагает, что таблицы с ключами будут использоваться вместе (т.е. как ссылочная, так и ссылочная таблица будут снабжены ключами).Так, например, если вы используете SQLFORM с my_master_table, по умолчанию будет предполагаться, что, поскольку my_master_table не является ключом, ни таблица spr_details, на которую она ссылается.Поэтому он попытается преобразовать значение SPR_details в целочисленный идентификатор (что приведет к преобразованию в 0, что приведет к ошибке ограничения внешнего ключа).Чтобы обойти эту проблему, вы должны обрабатывать вставки и обновления базы данных вручную, например:

form = SQLFORM(db.my_master_table).process(dbio=False)
if form.accepted:
    db.my_master_table.insert(**form.vars)

Выше, установка dbio=False не позволяет SQLFORM выполнять саму вставку (что приведет к ошибке).Вместо этого вставка выполняется явно с использованием значений в form.vars.

...