在本地为 Django 使用 SQLite,在服务器上使用 Postgres
Posted
技术标签:
【中文标题】在本地为 Django 使用 SQLite,在服务器上使用 Postgres【英文标题】:Use SQLite for Django locally and Postgres on server 【发布时间】:2017-04-02 21:53:30 【问题描述】:我开始将 Django 开发作为一个爱好项目。到目前为止,我很高兴使用 SQLite,无论是在开发中(即使用 py manage.py runserver
)还是在部署中(在 nginx + uWSGI 上)。现在我也想学习使用更健壮的 PostgreSQL 数据库。但是,如果可能的话,我想跳过在本地安装它,以避免在 Windows 上安装 Postgres。
我想知道当我在部署中使用内置服务器和 Postgres 时,是否可以通过 Django 使用 SQLite,而无需更改项目代码。找不到怎么做。
我可以使用一种解决方法,让我的部署过程在每次部署时更改服务器上的设置。但这有点像 hack。
【问题讨论】:
只需在您的开发机器上安装 PostgreSQL。通过这种方式,您可以获取生产数据并在本地复制和调试问题。 在开发/测试和生产中使用不同的堆栈是一个坏主意。 Django 不会为您处理的数据库之间存在很多差异,因此您肯定会在生产中遇到本地不会发生的问题。 @mu_is_too_short,感谢您的提醒。我的测试也是在服务器上完成的,所以它的配置与生产几乎相同。同样对于这个项目,模型非常简单,所以我希望 Django 能够管理。不过我会注意问题,并会尽快切换。我什至已经在考虑使用 SQLite 进行生产,以保持相同。 【参考方案1】:您可以将settings.py
拆分为多个设置文件,例如
[projectname]/
├── [projectname]/
│ ├── __init__.py
│ ├── settings/
│ │ │── base.py
│ │ │── development.py
│ │ │── production.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
您的 base.py
包含您当前 settings.py 中的所有代码。在 development.py
(sqlite3) 和 production.py
(postgresql) 中指定不同的数据库,并在每个中导入 base.py
from .base import *
最后但同样重要的是,您必须告诉 django 它应该使用哪个文件。添加
export DJANGO_SETTINGS_MODULE="projectname.settings.development"
在您的开发服务器上对您的 virtualenv 进行后激活和
export DJANGO_SETTINGS_MODULE="projectname.settings.production"
在您的生产服务器上。别忘了
unset DJANGO_SETTINGS_MODULE
在您的预停用中。
更多信息在这里:http://www.marinamele.com/taskbuster-django-tutorial/settings-different-environments-version-control 顺便提一句。一个很棒的教程,包含很多最佳实践
【讨论】:
【参考方案2】:将settings.py
替换为
settings/
│── __init__.py
│── base.py
│── development.py
│── production.py
在__init__.py
import os
app_stage = os.environ.get('DJANGO_APP_STAGE', 'dev')
if app_stage == 'prod':
from .production import *
else:
from .development import *
最后,当您启动应用程序进行生产时,请确保您设置了env DJANGO_APP_STAGE='prod'
在各个文件中创建您的数据库设置,然后您就可以开始了。
【讨论】:
以上是关于在本地为 Django 使用 SQLite,在服务器上使用 Postgres的主要内容,如果未能解决你的问题,请参考以下文章
Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db
Django 多个数据库 - 无法连接到 mysql 服务器回退到 sqlite