如何使用python脚本进行数据库迁移?

时间:2017-10-12 04:48:51

标签: python django

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

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

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")

然后访问了映射到迁移的url,返回"最终迁移成功"

然后我尝试了像

这样的数据库
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路径中,以便导入mysite有效。

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

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

2 个答案:

答案 0 :(得分:7)

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

以下是使用它来调用migrate的示例;

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

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

答案 1 :(得分:3)

基本上你需要:

  • 导入您的设置
  • 使用您的设置配置djnago
  • 设置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)

希望有所帮助