Django / MySql не соблюдает уникальность - PullRequest
2 голосов
/ 12 октября 2010

Я использую 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'])

1 Ответ

6 голосов
/ 29 октября 2010

Для полноты моего последнего обновления, вероятно, следовало добавить как ответ.

Я исправил проблему, вручную отредактировав метод forward южной миграции и добавил строку:

db.create_index('row_locks', ['table_name','locked_row_id'], unique=True)

Rob

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...