Django - 南 - 有没有办法查看它运行的SQL?

时间:2011-04-29 14:32:10

标签: python database migration django-south

这就是我想要做的事。

使用开发数据库在开发服务器上开发Django项目。当我更改模型时,根据需要运行南迁移。

保存每次迁移的SQL,并在我准备部署时将这些应用到生产服务器。

南方有可能这样吗? (我也很好奇其他人在使用Django时如何让你的开发数据库更改生产)

5 个答案:

答案 0 :(得分:50)

您至少可以通过执行manage.py migrate --db-dry-run --verbosity=2来检查生成的sql。这对数据库没有任何作用,会显示所有的sql。我仍然会做一个备份,比抱歉更安全。

答案 1 :(得分:7)

 python manage.py sqlmigrate <app_label> <migration_name>

答案 2 :(得分:3)

您可以尝试使用管理命令在db.connection.queries中记录SQL查询,该命令使用dry-run选项调用migrate:


from django.core.management.base import BaseCommand
from django import db

class Command(BaseCommand):
    help = 'Output SQL for migration'

    def handle(self, *app_labels, **options):
        # assumes DEBUG is True in settings
        db.reset_queries()

        from django.core.management import call_command
        kw = {'db-dry-run': 1,  'verbosity': 0}
        call_command('migrate', **kw)

        for query in db.connection.queries:
            print query['sql']

假设南方通过应该工作的常用数据库接口放置所有内容。在查询历史表时,会有一些额外的选择。

您可以将其放在应用内的management/commands/print_migration_sql.py内,然后运行它:


python manage.py print_migration_sql

它可能很容易扩展到仅针对特定应用程序等运行

答案 3 :(得分:3)

当我需要查看South为调试或验证生成的SQL时,我只需将以下日志记录设置添加到我的local_settings.LOGGING.loggers:

    'django.db.backends': {
        'handlers': ['console'],
        'level': 'DEBUG',
    },

这是South的日志记录设置的完整示例:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'verbose': {
            'format': '[%(asctime)s] %(levelname)s %(name)s %(lineno)d "%(message)s"'
        },
        'simple': {
            'format': '%(levelname)s %(message)s'
        },
    },
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',
            'formatter': 'verbose',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['console'],
            'level': 'DEBUG',
            'propagate': True,
        },
        'django.db.backends': {
            'handlers': ['console'],
            'level': 'DEBUG',
        },
    }
}

这将输出所有内容,包括South运行的查询,以决定要运行的迁移:

[2014-03-12 23:47:31,385] DEBUG django.db.backends 79 "(0.001) SELECT `south_migrationhistory`.`id`, `south_migrationhistory`.`app_name`, `south_migrationhistory`.`migration`, `south_migrationhistory`.`applied` FROM `south_migrationhistory` WHERE `south_migrationhistory`.`applied` IS NOT NULL ORDER BY `south_migrationhistory`.`applied` ASC; args=()"

将详细程度设置为2或3通常足以清楚地了解正在发生的事情。

答案 4 :(得分:2)

我要么做Lutger所建议的(并且可能写一个日志解析器去除只是 SQL),或者我在测试数据库上运行我的迁移,并在测试中启用了日志记录DB。

当然,如果您可以针对测试数据库运行它,那么距离验证迁移只需几步之遥。如果它通过,则再次针对生产再次运行。