为啥 django sqlite3 数据库在一台机器上与另一台机器上的工作方式不同?

Posted

技术标签:

【中文标题】为啥 django sqlite3 数据库在一台机器上与另一台机器上的工作方式不同?【英文标题】:Why doesn't a django sqlite3 database work the same on one machine vs the other?为什么 django sqlite3 数据库在一台机器上与另一台机器上的工作方式不同? 【发布时间】:2021-02-03 20:42:39 【问题描述】:

我正在努力学习 Django,但我遇到了一个问题,即我的数据库无法正确传输(或者它正在正确传输而我遗漏了一些东西,这就是我认为正在发生的事情)。

我在models.py 中有一个 Django 模型 Link

class Link(models.Model):
    title = models.CharField(max_length=100)
    alt = models.CharField(max_length=100)
    dest = models.CharField(max_length=100)
    image = models.FilePathField(path='static/misc/link_in_bio/img/')
    def __str__(self):
        title = self.title + ' Link'
        return self.title
    class Meta:
        ordering = ('title', )

然后我创建了这个模型的实例并确认它们已正确输入到数据库中。然后在页面的 html 中引用它们,如下所示:

% for link in links %
<div id="space">
    <div class="w3-container">
        <div class="w3-panel" style="padding: 0.06em">
            <button class="block" type="button" title="link.title" onclick="window.open('link.dest')">
                <img src="../link.image"  style="max-height: 7em">
            </button>
        </div>
    </div>
</div>
% endfor %

在我的开发机器上,一切都按预期工作,并显示如下:

然后,当我在 Heroku 上部署它时,一切都正确构建,python manage.py makemigrationspython manage.py migrate 运行正常,但是当我查看页面时它只是显示:

我也无法使用我在第一台机器上创建的超级用户登录到管理页面,我知道这是相关的,但我不知道如何处理它。是否有一些步骤来加载和初始化数据库或其他什么?

如果有帮助,完整代码在 github here。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

在开发环境中使用 postgreSQL。如果您不想弄脏您的开发环境,请尝试使用 docker 容器:

https://hub.docker.com/_/postgres

docker run --name postgres -v postgresql-data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword -d postgres

因此,您的开发环境将更接近生产环境(也尝试使用相同的版本)。

【讨论】:

【参考方案2】:

发生这种情况是因为他们的架构文件系统不适合 SQLite3,并且经常导致根本没有数据,从而使您的数据库为空。

Heroku 开发中心有一个关于这个主题的 entire page。引用相关部分:

Heroku 的 Cedar 堆栈有一个临时文件系统。你可以写信给它, 您可以从中读取,但内容将被清除 定期。如果你在 Heroku 上使用 SQLite,你会失去你的 整个数据库至少每 24 小时一次。

即使 Heroku 的磁盘持久运行 SQLite 仍然不会 很合适。由于 SQLite 不作为服务运行,因此每个 dyno 都会 运行单独的运行副本。这些副本中的每一个都需要自己的磁盘 支持的商店。这意味着为您的应用程序供电的每个测功机都会 由于磁盘未同步,因此具有不同的数据集。

Heroku 建议在生产环境中使用 PostgreSQL,您会发现很多资源都在讨论如何在 Heroku 上使用它而不是 SQLite。

如果需要,您还可以使用支持 SQLite3 的平台 PythonAnywhere。

【讨论】:

非常感谢,我认为这是一个 Django 问题,出于某种原因,我完全忘记了 Heroku,尽管现在这似乎是明显的罪魁祸首。一旦我可以奖励赏金(t-减去 22 小时),赏金就是你的了。我很感激。

以上是关于为啥 django sqlite3 数据库在一台机器上与另一台机器上的工作方式不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Django 不在 SQLite3 中重置序列?

为啥 django test --keep-db 适用于 postgres 数据库但不适用于默认 sqlite3

iptables 从一台机到另一台机端口转发

为啥 Spring 在一台机器上而不是另一台机器上出现循环依赖问题?

如何在一台服务器上运行两个 django 项目

django数据迁移