为啥我在运行时出现整数精度错误:heroku run python manage.py migrate
Posted
技术标签:
【中文标题】为啥我在运行时出现整数精度错误:heroku run python manage.py migrate【英文标题】:Why am I getting an integer precision error when I run: heroku run python manage.py migrate为什么我在运行时出现整数精度错误:heroku run python manage.py migrate 【发布时间】:2021-10-12 05:44:05 【问题描述】:我在 Heroku 上部署了一个 Django 应用程序,但我想迁移到 PostgreSQL,所以我正在关注 YouTube 上的视频教程,了解如何做到这一点。在本教程中,我们必须运行 Heroku run python manage.py migrate
将我当前的 SQLite 数据库迁移到 Heroku 上的 PostgreSQL 数据库。我不断收到此错误:
psycopg2.errors.CannotCoerce: cannot cast type date to double precision
LINE 1: ...cted" TYPE double precision USING "lastInteracted"::double p...
这是我的 models.py 文件。我很确定问题出在带有lastInteracted
变量的Conversation
模型中,但我不知道为什么会这样。
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.db.models.fields import CharField
from django.db.models.fields.files import FileField, ImageField, ImageFieldFile
from django.utils.timezone import localtime, now
from datetime import datetime
import time
import os
import sys
from django.core.files.base import File
from django.core.files.uploadedfile import InMemoryUploadedFile
class User(AbstractUser):
userType = models.CharField(max_length=20, default="student")
profile_pic = models.ImageField(
null=True, blank=True, default="blankUserIcon.svg")
class Clas-s-room(models.Model):
name = models.CharField(max_length=100, default="Clas-s-room")
students = models.ManyToManyField(User, blank=True)
teacher = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="teacher")
code = models.CharField(max_length=20)
subject = models.CharField(max_length=50, default="")
theme = models.CharField(max_length=20, default="cardBlue")
class Comment(models.Model):
date = models.DateTimeField(default=datetime.now())
text = CharField(max_length=5000, default="")
commenter = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="commenter", null=True)
class Announcement(models.Model):
clas-s-room = models.ForeignKey(
Clas-s-room, on_delete=models.CASCADE, related_name="clas-s-room", null=True)
body = CharField(max_length=20000, default="")
creator = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="creator", null=True)
date = models.DateTimeField(default=datetime.now())
comments = models.ManyToManyField(Comment, blank=True)
class Text(models.Model):
sender = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="sender")
reciever = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="reciever")
date = models.DateTimeField(default=datetime.now())
text = CharField(max_length=1000, default="")
class Conversation(models.Model):
user1 = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="user1")
user2 = models.ForeignKey(
User, on_delete=models.CASCADE, related_name="user2")
texts = models.ManyToManyField(Text, blank=True)
lastInteracted = models.IntegerField(default=-1)
readUser1 = models.BooleanField(default=True)
readUser2 = models.BooleanField(default=True)
class FileModel(models.Model):
file = models.FileField(blank=True)
def name(self):
return os.path.basename(self.file.name)
class Submission(models.Model):
resubmitted = models.BooleanField(default=False)
grade = models.IntegerField(default=-1)
files = models.ManyToManyField(FileModel, blank=True)
description = models.CharField(max_length=1000, default="")
user = models.ForeignKey(
User, null=True, related_name="submitter", on_delete=models.CASCADE)
date = models.DateField(default=datetime.now())
class Assignment(models.Model):
givenFiles = models.ManyToManyField(FileModel, blank=True)
title = models.CharField(max_length=500, default="")
description = models.CharField(max_length=20000, default="")
duedate = models.DateTimeField()
submissions = models.ManyToManyField(Submission, blank=True)
clas-s-room = models.ForeignKey(
Clas-s-room, on_delete=models.CASCADE, related_name="belongingToClas-s-room", null=True)
class MCanswer(models.Model):
answer = models.IntegerField(default=-1)
class MultipleChoiceQuestion(models.Model):
question = models.CharField(max_length=1000)
option1 = models.CharField(max_length=1000)
option2 = models.CharField(max_length=1000)
option3 = models.CharField(max_length=1000)
option4 = models.CharField(max_length=1000)
correctOption = models.IntegerField(default=1)
selectedOption = models.IntegerField(default=-1)
class QuizSubmission(models.Model):
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
date = models.DateField(default=datetime.now())
grade = models.IntegerField(default=0)
answers = models.ManyToManyField(MCanswer, blank=True)
class Quiz(models.Model):
name = models.CharField(max_length=1000, default="Untitled Quiz")
submissions = models.ManyToManyField(QuizSubmission, blank=True)
questions = models.ManyToManyField(MultipleChoiceQuestion, blank=True)
duedate = models.DateTimeField(null=True)
clas-s-room = models.ForeignKey(
Clas-s-room, null=True, on_delete=models.CASCADE)
为了澄清,lastInteracted
变量保存自纪元时间以来的当前时间(以秒为单位)。我验证了这一点,它确实小于整数最大值 2.47B。
这里是我尝试使用这个 lastInteracted 变量的代码 sn-ps:
conversation = Conversation()
conversation.lastInteracted = int(time.time())
和
convs = (Conversation.objects.filter(
Q(user1=request.user) | Q(user2=request.user))).order_by('-lastInteracted')
【问题讨论】:
“我们必须运行Heroku run python manage.py migrate
才能将我当前的 SQLite 数据库迁移到 Heroku 上的 PostgreSQL 数据库”——大写很重要。你会运行heroku run
,而不是Heroku run
。但更重要的是,这不是此命令的作用。它应用数据库迁移将您的数据库模式从一个版本更改为另一个版本。它与更改数据库管理系统完全无关。
问题可能在于您的数据库迁移无法在 Postgres 上运行。数据库服务器不是相互替代的。问题可能是您生成的数据库迁移,而不是您的模型。
@Chris 是的,我肯定在运行小写版本。我也遵循本教程中的确切步骤,对他来说效果很好:youtube.com/watch?v=TFFtDLZnbSs&t=19s。如果你对 django 很好,你有什么建议吗?我真的很困惑。
您没有得到integer
的精度问题,而得到的是double precision(float)
一个。此外,如果您在 SQLite 数据库中将该字段声明为 date
,它将被忽略,因为 SQLite 没有 date
类型。
我们不会为了理解您的问题而观看视频。请阅读How to Ask。
【参考方案1】:
我通过删除数据库和迁移文件夹来重置数据库。我还从所有模型中删除了 default=datetime.now() ,这些更改似乎奏效了。不确定这是否会帮助任何人,但无论如何都会在这里给出答案。
【讨论】:
以上是关于为啥我在运行时出现整数精度错误:heroku run python manage.py migrate的主要内容,如果未能解决你的问题,请参考以下文章
[使用模式构建数据库时出现NoDatabaseError(Rails,Heroku)
在 Heroku 上部署 MEAN 应用程序时出现应用程序错误
为啥我在运行 maven install 时出现“包不存在”错误?