Это зависит от того, что вы пытаетесь сделать. По умолчанию web2py автоматически создает автоматически увеличивающееся поле id
, служащее первичным ключом для каждой таблицы, и это рекомендуется по мере возможности. Если вы имеете дело с унаследованной базой данных с составными первичными ключами и не можете изменить схему, можно указать атрибут primarykey
, хотя и с некоторыми ограничениями (как объяснено here):
db.define_table('pairing',
Field('user', writable=True, readable=True),
Field('uid', writable=True, readable=True),
primarykey=['user', 'uid'])
Возможно, вместо того, чтобы вы на самом деле не нужны настоящий составной первичный ключ, но вам просто нужен способ, чтобы в таблицу были вставлены только уникальные пары значений user/uid. В этом случае, вы можете сделать это, указав правильно сконструированный IS_NOT_IN_DB
валидатор для одного из двух полей:
db.define_table('pairing',
Field('user', writable=True, readable=True),
Field('uid', writable=True, readable=True))
db.pairing.uid.requires=IS_NOT_IN_DB(db(db.pairing.user==request.vars.user),
'pairing.uid')
Это удостоверится uid
является уникальным среди множества записей, где user
соответствует новому значению user
существ (поэтому комбинация user
и uid
должна быть уникальной). Примечание. Валидаторы (например, IS_NOT_IN_DB) применяются только тогда, когда значения вставляются через SQLFORM
или с использованием метода .validate_and_insert()
, поэтому вышеуказанное не будет работать для произвольных вставок в таблицу, но в первую очередь предназначено для представлений ввода пользователя.
Вы также можете использовать SQL для установки уникального ограничения по нескольким столбцам в таблице (что вы можете делать непосредственно в базе данных или через метод web2py .executesql()
). Однако даже при таком ограничении вы все равно хотите выполнить некоторую проверку ввода в своем приложении, чтобы избежать ошибок из базы данных.
У меня есть таблица, где я хотел бы сделать проверку на двух других полях. sh_code и sh_organization. Я пробовал с вашим предлагаемым кодом, но запись все еще вставлена. Любые предложения – Yebach
Трудно сказать, не видя свой код. Вышеупомянутый подход работает с любыми двумя полями. – Anthony