我正在尝试创建一个测试数据库,它是预先存在的数据库的副本。我正在使用 Django 模型(理论上是与原始数据库一起使用的模型)来执行此操作。我最近从其他人那里继承了代码,并试图弄清楚代码到底发生了什么。
在该模型中,其中一个表有两列标识为主键。
column1 = models.IntegerField(primary_key = True)
column2 = models.IntegerField(primary_key = True)
column3 = models.CharField(max_length = 30)
当我尝试将此模型同步到测试数据库时 - 发生错误:
文件“/somePathHere/MySQLdb/connections.py”,第 36 行,在 defaulterrorhandler 中引发错误类、错误值
_mysql_exceptions.OperationalError:(1068,'定义了多个主键')
它写在Django 文档Django 不允许多个主键。然而,看看输出DESCRIBE [tablename]
在原始 MySQL 数据库中,看起来这正是这里发生的事情:
+------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| IDENTIFIER | bigint(20) | NO | PRI | NULL | |
| TIMESTAMP_ | bigint(20) | NO | PRI | NULL | |
| VALUE_ | longtext | YES | | NULL | |
+------------+------------+------+-----+---------+-------+
请注意,IDENTIFIER 和 TIMESTAMP_ 都被列为主键。
我看到很多关于SO的话题(实施例1 , 实施例2, and 实施例3)关于基于多列创建主键 - 我看到的是复合键吗?在这种情况下,如何通过 Django 模型进行转发,即如何复制它?
如果不是复合键,那它是什么?
Django 不支持它,但有一个解决方法。在您的模型上指定 unique_together 和 Meta 部分中的字段:
class MyClass(models.Model):
IDENTIFIER = models.IntegerField(blank=False,null=False)
TIMESTAMP_ = models.IntegerField(blank=False,null=False)
VALUE_ = models.TextField(blank=True, null=True)
class Meta:
unique_together = ('IDENTIFIER', 'TIMESTAMP_')
这将保留两列主键行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)