Это зависит от того, что вы пытаетесь сделать. По умолчанию 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()
). Однако даже с таким ограничением вы все равно захотите выполнить некоторую проверку ввода в своем приложении, чтобы избежать ошибок в базе данных.
person
Anthony
schedule
13.03.2012