这就是我想要做的事。
使用开发数据库在开发服务器上开发Django项目。当我更改模型时,根据需要运行南迁移。
保存每次迁移的SQL,并在我准备部署时将这些应用到生产服务器。
南方有可能这样吗? (我也很好奇其他人在使用Django时如何让你的开发数据库更改生产)
答案 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。
当然,如果您可以针对测试数据库运行它,那么距离验证迁移只需几步之遥。如果它通过,则再次针对生产再次运行。