我希望在迁移结束时包含许多原始SQL文件(函数,触发器…)的处理。
我本想写我的own Special operation,但有人告诉我改为使用django.db.migrations.RunPython()命令,并在调用的函数中放入一些django.db.migrations.runsql()命令。
由于runpython()接受一个带有两个实例(一个应用程序和一个schemaeditor)的可调用函数,我严重怀疑(我查看了一下源代码)是否可以用纯python代码调用一个函数,因此它似乎只能执行orm操作。我应该在runpython中使用execute_from_command_line()吗?还是注定要失败?或者做得不好?

from __future__ import unicode_literals
from django.db import migrations

def load_sql(apps, schema_editor):

    from os.path import normpath, dirname, isfile, join
    from os import listdir

    sql_folder_path = '/backoffice/sql/'

    def load_raw_sql(folder_inside):
        folder_path = join(sql_folder_path, folder_inside)
        sql_files = [join(folder_path, f) for f in listdir(folder_path) if isfile(join(folder_path, f))]
        for sql_file in sql_files:
            with open(sql_file, 'r') as g:
                migrations.RunSQL(g.read())

    folders = ['functions', 'index', 'triggers']

    for folder in folders:
        load_raw_sql(folder)


class Migration(migrations.Migration):
    dependencies = [
        ('app1', '0001_squashed_0018_auto_20150616_0708'),
    ]

    operations = [
        migrations.RunPython(load_sql),
    ]

我们正在使用PostgreSQL。
提前谢谢你的回答。

最佳答案

我本以为一个名为RunPython的操作可以,呃,运行python代码是相当明显的,但简单的回答是可以的,在RunPython操作中你可以做任何你想做的事情。
要考虑的主要问题是,您编写的代码需要在未来继续工作(或者直到您压缩迁移),因为每次运行migratemakemigrations,所有以前的迁移都被用来导出数据库的当前状态。

关于python - migrations.RunPython可以运行任意python代码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31192805/

10-10 04:41