簡體   English   中英

Django / MySql不尊重unique_together

[英]Django / MySql not honouring unique_together

我將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輸入具有相同值的重復行,而不會出現完整性錯誤。

現在我的假設是我在這里做錯了,因為這樣一個顯而易見的事情不可能像個bug一樣在野外,但是我看不到,

任何新鮮的眼睛將不勝感激

更新:正如多米尼克(Dominic)所指出的那樣,問題在於南遷徙並未產生獨特的約束。 我本來可以進行兩次遷移,一次遷移創建表,然后一次遷移添加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'])

為了完整起見,我的最新更新可能應該作為答案添加。

我通過手動編輯向南遷移的正向方法解決了問題,並添加了以下代碼行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM