Django 和 Github 上的数据库管理

che*_*612 2 python mysql git sqlite django

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

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

由于这个问题,我现在正在考虑替代解决方案:

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

如果第一个问题的答案是肯定的,那么我还有关于如何处理这一变化的其他问题。由于 SQLite 是无服务器的,我必须为 MySQL 设置一个新服务器。我可以通过该服务器远程访问我的数据吗?由于我过去常常将数据库推送到 Github 存储库上,因此当我想要远程工作时,我可以在此处获取数据。有没有一种方法可以让我将数据托管在服务器上(希望是免费的)并以与在 Github 上获取代码相同的方式获取数据?

非常感谢您的帮助,祝您度过愉快的一天。

小智 5

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

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

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

不过,我的建议是在您的开发 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
}
Run Code Online (Sandbox Code Playgroud)

该文件应该包含在您的文件中.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'],
    }
}
Run Code Online (Sandbox Code Playgroud)