Django:SQLite在从本地开发推送时覆盖了heroku上的POSTGRESQL数据库

时间:2014-09-29 07:15:39

标签: django sqlite postgresql heroku django-models

所以我在本地进行了更改,然后推送到github和heroku,然后当我访问我的live heroku项目时,我注意到数据库奇怪地恢复到我在本地开发期间拥有的对象。

这很可能是因为我没有正确设置我的heroku postgresql db(这是我第一次使用django设置heroku postgresql)。

以下是我的 Settings.py 的摘要,请假设括号内的信息:

ON_HEROKU = os.environ.get('ON_HEROKU')
HEROKU_SERVER = os.environ.get('HEROKU_SERVER')


if ON_HEROKU:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': '<the name is here>',
            'USER': '<user is here>',
            'PASSWORD': '<password is here>',
            'HOST': '<host is here>',                      
            'PORT': '<port is here>',   
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            'USER': '',
            'PASSWORD': '',
            'HOST': '',                      
            'PORT': '',  
        }
    }

我运行了一个syncdb,它似乎什么也没做。 :

(venv)$ heroku run python manage.py syncdb --account personal
Running `python manage.py syncdb` attached to terminal... up, run.7965
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)

为了记录,我第一次运行syncdb时,似乎从未设置过新用户,而只是尝试安装更多表。我不知道为什么,但这似乎是一面红旗。

我还运行以下命令来检查postgres db是否存在:

(venv)$ heroku addons --account personal | grep POSTGRES
heroku-postgresql:hobby-dev  HEROKU_POSTGRESQL_COBALT

即使一切似乎都没问题,我的项目也在实时使用SQLite数据库。我肯定错过了什么。任何建议表示赞赏如果需要,我可以展示更多。

1 个答案:

答案 0 :(得分:3)

Heroku没有提供ON_HEROKU环境变量。除非你自己设定,否则这不会起作用。

但是,无论如何,您不应该在设置中对生产数据库值进行硬编码。正如Heroku docs解释的那样,这些值是由环境变量提供的,应该使用dj-database-url库将其自动转换为正确的设置。因此,您可以使用DATABASE_URL env var的存在与否来在硬编码的sqlite设置和动态生成的设置之间切换,或者甚至更好地在本地开发环境中设置DATABASE_URL,指向你的sqlite文件。