【问题标题】:Django / MySql not honouring unique_togetherDjango / MySql 不尊重 unique_together
【发布时间】:2011-04-24 09:32:48
【问题描述】:

我将 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 输入具有相同值的重复行而不会出现完整性错误。

现在我的假设是我在这里做错了什么,因为如此明显的事情不可能在野外作为一个错误,但我看不到它,

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

罗伯

更新: 因此,正如多米尼克指出的那样,问题在于南迁没有创造独特的约束。我本可以进行 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'])

手动编辑:

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'])

【问题讨论】:

  • 最初创建表后是否添加了 unique_together?
  • 否 - 表最初是使用 unique_together 创建的(通过南迁移),后来回滚并使用南重新创建并看到同样的问题
  • 如果您使用的是 South,那么大概您在创建模型时创建了一个 schemamigration。这种迁移是什么样的?是否包含提及unique_together 索引?
  • 该死的多米尼克,就是这样。前向迁移只是创建表,但不创建任何约束。去看看我是否必须手动编辑迁移,或者是否有什么我应该告诉南方的。感谢现场。

标签: python mysql django


【解决方案1】:

为了完整起见,我的最后一次更新可能应该作为答案添加。

我通过手动编辑南移的forward方法解决了这个问题,并添加了一行:

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

罗伯

【讨论】:

  • 应该是 db.create_unique('row_locks', ['table_name','locked_row_id'])
猜你喜欢
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 2012-08-13
  • 2011-03-30
  • 2016-02-14
  • 2011-08-30
  • 2020-06-30
  • 2013-10-01
相关资源
最近更新 更多