我正在编写一个脚本,可以从不同的API中提取数据并存储到MySQL数据库中。此应用程序将从命令行运行。所以我只使用Django的ORM。
但是当我创建一个没有主键但有一个名为id的列的模型时。当我尝试在此模型中保存数据时,我收到错误 django.db.utils.IntegrityError:(1048," Column' id'不能为空&#34 ;)
我真的很困惑为什么会这样。因为从API我从id列获取值,并且没有机会为此列获取null或空值。
请告诉我这里我做错了什么。
这是我的模特:
class Graphite(models.Model):
class Meta:
db_table = 'graphite'
id = models.BigIntegerField()
full_name = models.CharField(max_length=250, null=True)
email = models.CharField(max_length=250, null=True)
status = models.CharField(max_length=150, null=True)
当我尝试在此模型中保存数据时,这是代码:
Graphite.objects.using('database_name').create(
id=row['id'],
full_name=row['full_name'],
email=row['email'],
status=row['status'])
将数据保存到模型中时,我使用 Graphite.objects.using(' database_name')。因为我在此应用程序中连接了多个数据库。
答案 0 :(得分:0)
嗯,我不确定你是否使用了django迁移,但是它不允许你在django中创建这种模型,你的id属性(在模型中)没有主键作为它的参数(mySQL)。那你为什么不定义:
class Graphite(models.Model):
class Meta:
db_table = 'graphite'
id = models.BigIntegerField(primary_key=True)
full_name = models.CharField(max_length=250, null=True)
email = models.CharField(max_length=250, null=True)
status = models.CharField(max_length=150, null=True)
所以在id上设置primary_key?然后,在创建Graphite
时,您不必传递ID。
BUT
如果您必须提供id
,这是您需要在每个Graphite
模型中使用的内容,而且它与主键不同,那么只需将其定义为不同,即可。 s说row_id
。但是,当您希望将id
设置为primary_key
时,您的模型中的True
属性仍然应设置为id
。
编辑(示例)
在mySQL中执行以下命令:
BigIntegerField
然后你的模型应该是这样的:
ALTER TABLE graphite ADD COLUMN row_id BIGINT;
用法:
class Graphite(models.Model):
class Meta:
db_table = 'graphite'
row_id = models.BigIntegerField()
full_name = models.CharField(max_length=250, null=True)
email = models.CharField(max_length=250, null=True)
status = models.CharField(max_length=150, null=True)
那就是它。
答案 1 :(得分:0)
问题是您没有主键。
来自docs:
每个模型只需要一个字段即可使primary_key = True(显式声明或自动添加)。
因此,您必须通过添加$xml = (string) $element;
将id
字段作为主键。然后,它不会抱怨。
答案 2 :(得分:0)
您从默认的django表id
覆盖id
。
所以主键没有id
。只需将其primary=True
。或使用其他id
,例如graphaite_id
答案 3 :(得分:0)
您错过了主键,请确保拥有primary=True
并存储id
为其创建另一列