Я использую django с mysql (InnoDB) и в моей модели django есть следующее:
class RowLock(models.Model):
table_name = models.CharField(blank = False, max_length = 30)
locked_row_id = models.IntegerField(null = False)
process_id = models.IntegerField(null = True)
thread_id = models.IntegerField(null = True)
class Meta:
db_table = "row_locks"
unique_together = (("table_name", "locked_row_id"),)
Запуск python manage.py sql app_name дает:
Однако в клиенте mysql делаетdesc row_locks дает:
mysql> desc row_locks;
+---------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| table_name | varchar(30) | NO | | NULL | |
| locked_row_id | int(11) | NO | | NULL | |
| process_id | int(11) | YES | | NULL | |
| thread_id | int(11) | YES | | NULL | |
+---------------+-------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)
Также проверил, что я могу вводить повторяющиеся строки с одинаковыми значениями для table_name и locked_row_id без ошибки целостности.
Теперь я предполагаю, что я здесь что-то не так делаюпотому что такая очевидная вещь не может быть в дикой природе, как ошибка, но я не вижу этого,
Любые свежие глаза будут оценены
Роб
Обновление:Таким образом, как отметил Доминик, проблема заключалась в том, что миграция на юг не создавала уникального ограничения.Я мог бы взглянуть на выполнение двух миграций, одну для создания таблицы, а затем следующую, чтобы добавить unique_together - не знаю, сработало бы это или нет - можно попробовать с большим количеством времени.
В любомСлучай, который я обошел, вручную отредактировав метод forward в скрипте миграции на юг следующим образом:
Как генерируется югом:
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'RowLock'
db.create_table('row_locks', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('table_name', self.gf('django.db.models.fields.CharField')(max_length=30)),
('locked_row_id', self.gf('django.db.models.fields.IntegerField')()),
('process_id', self.gf('django.db.models.fields.IntegerField')(null=True)),
('thread_id', self.gf('django.db.models.fields.IntegerField')(null=True)),
))
db.send_create_signal('manager', ['RowLock'])
Отредактировано вручную:
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'RowLock'
db.create_table('row_locks', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('table_name', self.gf('django.db.models.fields.CharField')(max_length=30)),
('locked_row_id', self.gf('django.db.models.fields.IntegerField')()),
('process_id', self.gf('django.db.models.fields.IntegerField')(null=True)),
('thread_id', self.gf('django.db.models.fields.IntegerField')(null=True)),
))
db.create_index('row_locks', ['table_name','locked_row_id'], unique=True)
db.send_create_signal('manager', ['RowLock'])