我正在编写一个脚本,可以从不同的 API 中提取数据并将其存储到 MySQL 数据库中。该应用程序将从命令行运行。所以我只使用 Django 的 ORM。
但是当我创建一个没有主键但有一个名为 id 的列的模型时。当我尝试在此模型中保存数据时,出现错误django.db.utils.IntegrityError: (1048, "Column 'id' can not be null")
我真的很困惑为什么会发生这种情况。因为我从 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')。因为我在此应用程序中连接了多个数据库。
最佳答案
嗯,我不确定你是否使用了 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了.
但是
如果您必须提供id
这是每个 Graphite
中您都需要拥有的东西model 并且它与主键不同,那么只需定义不同的东西,比方说 row_id
。但你应该还有最后一个 id
模型中的属性 primary_key
设置为True
当你想要id
时如BigIntegerField
.
编辑(在示例中)
在 mySQL 中执行此命令:
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)
及用法:
Graphite.objects.using('database_name').create(
row_id=row['id'],
full_name=row['full_name'],
email=row['email'],
status=row['status'])
就是这样。
关于mysql - Django 在将数据保存到模型中时显示错误 : django. db.utils.IntegrityError : (1048, "Column ' id' 不能为 null"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065692/