在本地为 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

Django:用于开发的 sqlite,用于生产的 mysql? [关闭]

来自外部源的 Django 用户和身份验证

将本地 sqlite 文件发送到服务器

Django---Django连接Mysql数据库