python - Django 和 Github 上的数据库管理

标签 python mysql django git sqlite

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

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

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

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

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

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

最佳答案

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

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

现在,你的第二个问题有点复杂。您始终可以将数据库暴露在互联网上,但这通常不是一个好主意,除非您确切地知道自己在做什么并知道如何正确保护它。如果你走这条路,你可以 change the database parameters在您的设置文件中指向 MySQL 数据库的公共(public) 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
}

此文件应包含在您的 .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'],
    }
}

关于python - Django 和 Github 上的数据库管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61127479/

相关文章:

python - 连接httpresponse对象django

python - 基于类的 View 的实例变量是否持久?

php - MySql 查询正在对表中的每条记录执行

PHP - 数组到 MySQL 表

mysql - 使用左连接时限制右表结果

django - drf-yasg 自定义 SwaggerUIRenderer

python - Python 类和工厂方法中未绑定(bind)方法的类型错误

python - 如何修复 ImportError : No module named packages. urllib3?

python - GraphLab Create 安装错误 - Python 3.5.2

mysql - 我在 django 的 request.session 中设置了一个键,但没有效果