我正在使用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'])
答案 0 :(得分:6)
为了完整起见,我的上一次更新可能已添加为答案。
我通过手动编辑南迁移的正向方法修复了问题并添加了一行:
db.create_index('row_locks', ['table_name','locked_row_id'], unique=True)
罗布