【问题标题】:Database problems with Heroku/Django: won't keep information after every pushHeroku/Django 的数据库问题:每次推送后都不会保留信息
【发布时间】:2019-03-06 02:10:08
【问题描述】:

每次我在 Heroku 上对生产中的数据库进行更改然后执行推送时,数据库都会重置为我本地计算机上的任何内容。我尝试将db.sqlite3__pycache__ 添加到.gitignore,但这不起作用。

有谁知道如何解决这个问题?

更新(将设置更改为):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.path.join(BASE_DIR, 'thesite'),
        'USER': 'tom',
        'PASSWORD': '!'
    }
}

并添加

import os
import psycopg2

DATABASE_URL = os.environ['DATABASE_URL']

conn = psycopg2.connect(DATABASE_URL, sslmode='require')

import dj_database_url
DATABASES['default'] = dj_database_url.config()

【问题讨论】:

    标签: python django heroku django-models


    【解决方案1】:

    Heroku's filesystem is ephemeral:您对文件所做的任何更改都将在下次您的测功机重新启动时丢失,happens frequently(至少每天一次)。由于 SQLite 是基于文件的数据库,因此与 Heroku 不兼容。

    您可以改用客户端-服务器数据库。 Heroku 自己的PostgreSQL add-on 应该已经为您设置好了,但如果您愿意,可以使用任何several others

    dj-database-url 可以为您简化此操作:它允许您从 DATABASE_URL 环境变量设置数据库配置,该环境变量应该已由 Heroku Postgres 设置。

    下面是一个示例,说明如何使用 dj-database-url 来使用 DATABASE_URL 环境变量(如果存在),如果不存在则回退到另一个数据库:

    DATABASES['default'] = dj_database_url.config(default='sqlite://db.sqlite3')
    

    我展示了一个回退到 SQLite 的示例,但实际上我strongy建议在您的所有环境中使用相同的数据库引擎。 Django 的 ORM 有助于“平衡”不同的数据库引擎,但仍然存在差异。您不希望您的代码在本地使用 SQLite 工作,但在使用 PostgreSQL 的生产环境中失败。

    【讨论】:

    • 我是否必须更改 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db. sqlite3'), } }
    • 好的,我要更新我的东西了。因为我更改了它,现在它不接受我在管理员上的用户名密码
    • @lakerskill,这是一个完全不同的数据库。您需要创建一个新的超级用户,例如通过heroku run python manage.py createsuperuser。您的数据不会在本地机器和生产环境之间同步(通常没关系)。
    • 好的,我现在可以登录了,我会在创建几件事后尝试推送新信息
    • 你修好了。谢谢你,先生。标记为已回答。一个简单的问题,如果我在本地添加到数据库,比如另一个表或列或行,那会直接通过 apush 进入 heroku 吗?就像,如果我通过models.py添加
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2012-11-14
    • 2012-07-09
    • 2017-08-02
    相关资源
    最近更新 更多