Django/MySql不尊重unique_together

rtm*_*mie 2 python mysql django

我正在使用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"),)
Run Code Online (Sandbox Code Playgroud)

运行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)
Run Code Online (Sandbox Code Playgroud)

还检查了我可以为table_name和locked_row_id输入具有相同值的重复行,而不会出现完整性错误.

现在我的假设是我在这里做错了,因为这样一个显而易见的事情不可能像野生动物一样,但是我看不到它,

任何新鲜的眼睛将不胜感激

更新:正如多米尼克指出的那样,问题在于南迁没有创造出独特的约束.我本来可以看一下2次迁移,一次是创建表,然后是后续的一次添加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'])
Run Code Online (Sandbox Code Playgroud)

手动编辑:

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'])
Run Code Online (Sandbox Code Playgroud)

rtm*_*mie 6

为了完整起见,我的上次更新可能已添加为答案.

我通过手动编辑南迁移的正向方法修复了问题,并添加了以下行:

db.create_index('row_locks', ['table_name','locked_row_id'], unique=True)
Run Code Online (Sandbox Code Playgroud)

  • 应该是db.create_unique('row_locks',['table_name','locked_row_id']) (2认同)