Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db
Posted
技术标签:
【中文标题】Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db【英文标题】:Django: SQLite overriding POSTGRESQL db on heroku when pushing from local development 【发布时间】:2014-11-23 12:29:57 【问题描述】:所以我在本地进行了更改,然后推送到 github 和 heroku,然后当我访问我的 live heroku 项目时,我注意到数据库奇怪地恢复到我在本地开发期间拥有的对象。
这很可能是因为我没有正确设置 heroku postgresql 数据库(这是我第一次使用 django 设置 heroku postgresql)。
这是我的 Settings.py 中的一个 sn-p,请假设括号中的信息:
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': '',
我运行了一个同步数据库,但它似乎什么也没做。 :
(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 db。我肯定错过了什么。任何建议表示赞赏。如果需要,我可以展示更多。
【问题讨论】:
【参考方案1】:Heroku 不提供 ON_HEROKU
环境变量。除非您自己设置,否则这是行不通的。
但是,无论如何,您都不应该在设置中硬编码生产数据库值。正如Heroku docs 解释的那样,这些值是由环境变量提供的,应该使用 dj-database-url 库将其自动转换为正确的设置。因此,您可以使用 DATABASE_URL
环境变量的存在或不存在在硬编码的 sqlite 设置和动态生产设置之间切换,或者甚至更好地在本地开发环境中设置 DATABASE_URL
,指向您的 sqlite文件。
【讨论】:
我一直在阅读有关不对其进行硬编码的方法,但我想我对如何构建 DATABASE_URL 感到困惑。你认为你可以链接到一个例子吗,heroku 文档还不够。至于 'ON_HEROKU' 变量,我在其他堆栈中看到过这个,我不知道它不会起作用。以上是关于Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db的主要内容,如果未能解决你的问题,请参考以下文章
在本地为 Django 使用 SQLite,在服务器上使用 Postgres
Django:用于开发的 sqlite,用于生产的 mysql? [关闭]
3. 在Django 2.2中启动开发服务器时处理SQLite3错误