【问题标题】:Database Management on Django and GithubDjango 和 Github 上的数据库管理
【发布时间】:2020-07-22 10:42:31
【问题描述】:

我正在尝试使用 Django 框架建立一个网站。因为方便,我从项目开始就选择 SQLite 作为我的数据库。它非常易于使用,我对这个解决方案非常满意。

作为一名新开发人员,我对 Github 和数据库管理非常陌生。由于 SQLite 数据库位于单个文件中,因此我能够在 Github 上推送我的更新,直到该 .db 文件达到大于 100MB 的临界大小。从那时起,我的文件似乎太大而无法推送到我的存储库(对于其他有同样问题的人,我在这里找到了令人满意的答案:GIT: Unable to delete file from repo)。

由于这个问题,我现在正在考虑另一种解决方案:

由于我的网站也需要用户与我的数据库进行交互(预计他们会发布一定数量的数据),我正在考虑将 SQLite 切换为 MySQL。有人告诉我 MySQL 会更好地处理用户输入并且更容易扩展(我敢于期待大量用户)。这是我问题的第一部分。在使用 SQLite 一段时间后切换到 MySQL 是一个好主意/好习惯,还是会导致迁移问题?

如果第一个问题的答案是肯定的,那么我还有其他关于如何处理此更改的问题。由于 SQLite 是无服务器的,我将不得不为 MySQL 设置一个新服务器。我可以使用该服务器远程访问我的数据吗?因为我曾经将我的数据库推送到我的 Github 存储库中,所以当我想远程工作时,我会从这里获取我的数据。有没有办法让我在服务器上托管我的数据(希望是免费的)并像在 Github 上获取代码一样获取它?

非常感谢您的帮助,希望您有愉快的一天。

【问题讨论】:

  • 您的数据库首先不应该在您的存储库中。该 repo 用于 code,而不是 data

标签: python mysql django git sqlite


【解决方案1】:

首先,您不应该将任何敏感数据上传到您的存储库。这包括数据库密码、Django 的密钥或数据库本身(在 SQLite 的情况下)。

回答您的第一个问题,从 SQLite 切换到 MySQL 应该没有任何问题。 Django 处理迁移异常出色,SQLite 的功能比 MySQL 少。要将数据迁移到 mysql 数据库,您可以使用 django 的 dumpdataloaddata

现在,您的第二个问题有点复杂。您始终可以将数据库暴露在 Internet 上,但这通常不是一个好主意,除非您确切地知道自己在做什么并且知道如何正确保护它。如果你这样做,你可以在你的设置文件中change the database parameters 指向你的 MySQL 数据库的公共 IP 并添加数据库名称、用户和密码。

不过,我的建议是在您的开发 PC 中使用一个用于开发的数据库,而在您的生产服务器中使用另一个数据库,该数据库位于防火墙后面并且只能通过 localhost 访问。如果您有一些足够的示例数据,我认为您不需要开发 PC 中的数据库始终是最新的。

因此,您可以在项目的根目录中添加一个 secrets.json 文件,而不是将敏感数据写入设置文件,如下所示:

{
   "secret_key": "YOURSUPERSECRETKEY",
   "debug": true, TRUE IN YOUR DEV PC, FALSE IN YOUR PROD SERVER
   "allowed_hosts": ["127.0.0.1" , "localhost", "YOUR"], 
   "db_name": "YOURDBNAME",
   "db_user": "YOURDBUSER",
   "db_password": "YOURDBPASSWORD",
   "db_host": "localhost",
   "db_port": 3306
}

该文件应该包含在您的.gitignore 中,这样它就不会被推送到您的存储库中,您将在本地电脑中拥有一个,在生产服务器中拥有另一个具有不同设置的文件(您可以使用 vi 或 nano创建文件)。

然后在您的settings.py 文件中,您可以执行以下操作:

import json

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

try:
    with open(os.path.join(BASE_DIR, 'secrets.json')) as handle:
        SECRETS = json.load(handle)
except IOError:
    SECRETS = {}


SECRET_KEY = SECRETS['secret_key']

ALLOWED_HOSTS = SECRETS['allowed_hosts']

DEBUG = SECRETS['debug']

...

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': SECRETS['db_name'],
        'USER': SECRETS['db_user'],
        'PASSWORD': SECRETS['db_password'],
        'HOST': SECRETS['db_host'],
        'PORT': SECRETS['db_port'],
    }
}

【讨论】:

  • 谢谢angardi,这对我帮助很大。祝您有愉快的一天!
猜你喜欢
  • 2010-10-13
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2010-11-02
相关资源
最近更新 更多