【问题标题】:How to do database migration using python script?如何使用python脚本进行数据库迁移?
【发布时间】:2017-10-12 04:48:50
【问题描述】:

是否可以从 python 脚本进行迁移?

我正在尝试在没有 shell 但我可以使用 python 脚本的 Heliohost 上使用 django。

something like

from django import shell
shell.main(['mysite/manage.py', 'migrate'])

编辑

使用来自@Shadow 的输入,我尝试将此代码放入views.py 文件中

def migrate(request):
    django.setup()
    from django.core.management import call_command
    call_command("migrate", interactive=False)
    return HttpResponse("Final Migration Successful")

然后访问映射到 migrate 的 url 返回“Final Migration Success”

然后我尝试了类似的数据库

from .models import Question


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

给我错误:

(1146, "Table 'usr_mydb.polls_question' doesn't exist")

来自 Django 教程:

绕过manage.py

如果您不想使用 manage.py,没问题。只需将 DJANGO_SETTINGS_MODULE 环境变量设置为 mysite.settings,启动一个普通的 Python shell,然后设置 Django:

>>> import django
>>> django.setup()

如果这引发 AttributeError,您可能使用的 Django 版本与本教程版本不匹配。你会想要切换到较旧的教程或较新的 Django 版本。

您必须从 manage.py 所在的同一目录运行 python,或者确保该目录位于 Python 路径上,以便 import mysite 起作用。

有关所有这些的更多信息,请参阅 django-admin 文档。

但是如何使用django.setup() 来做python manage.py <command> 在文档中没有。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以使用call_command 来运行django manage 命令。

    这里是一个使用它来调用迁移的例子;

    from django.core.management import call_command
    call_command("migrate", interactive=False)
    

    我有 interactive=False,因为它在持续集成服务器上运行 - 但根据您的使用情况,您可能希望省略它。

    【讨论】:

    • 创建的脚本应该保存在哪里? manage.py 在哪里?或者 settings.py 在哪里?该脚本如何知道您想要执行“python manage.py migrate”。在运行你的代码之前我需要做 django.setup() 吗?
    • 在 Heliohost 上我没有 bash、python shell。我所拥有的是运行 Django App。我可以从 django view.py 文件运行迁移代码吗?
    • 如果你有 ftp 到 django 项目文件。在 python 脚本中创建一个 script.py 保存 @Shadow 代码。将脚本上传到 myproject/myproject/myapp 目录。在views.py 中编写一个调用python 脚本的视图。更新您的 urls.py 以指向视图。每当您访问该网址时,它都会为您运行您的迁移脚本。 (这不是在主机上运行迁移的干净方式)
    • 谢谢。我已将该代码添加到视图本身。工作正常。
    【解决方案2】:

    基本上你需要:

    • 导入您的设置
    • 使用您的设置配置 Django
    • 设置 Django
    • 调用命令

    如果你有一个 python shell并且它在你的项目的 python 路径中,一旦你进入 shell,你可以执行以下操作:

    >>> from myprojectpath import settings as myapp_defaults
    >>> import django
    >>> from django.conf import settings
    >>> from django.core.management import call_command
    >>> if not settings.configured:
            settings.configure(myapp_defaults)
    >>> django.setup()
    >>> call_command("migrate", interactive=False)
    

    希望对你有帮助

    【讨论】:

    • 我说我没有 Python 控制台。但我认为我可以将其转换为脚本并尝试运行。
    • if not settings.configured: settings.configure(myapp_defaults) 对我来说不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 2019-12-02
    • 2021-10-25
    相关资源
    最近更新 更多