Это зависит от того, что вы пытаетесь сделать. По умолчанию web2py автоматически создает автоматически увеличивающееся поле id
, которое будет служить первичным ключом для каждой таблицы, и это рекомендуемый подход, когда это возможно. Если вы имеете дело с устаревшей базой данных с составными первичными ключами и не можете изменить схему, вы можете указать атрибут primarykey
, хотя с некоторыми ограничениями (как объяснено здесь ):
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()
). Однако даже с таким ограничением вы все равно захотите выполнить некоторую проверку входных данных в вашем приложении, чтобы избежать ошибок в базе данных.