从python中执行Django的sqlsequencereset代码

时间:2017-04-27 16:45:14

标签: django python-2.7

Django的sqlsequencereset命令返回重置数据库中序列所需的SQL命令。

其他类似的管理命令默认自动执行SQL(如果指定了--dry-run选项,则只打印输出)。

在命令行中,您可以使用以下命令执行返回的命令:

python manage.py sqlsequencereset app1_name app2_name | python manage.py dbshell

但是......有没有办法直接从python内部sqlsequencereset执行返回的代码?

4 个答案:

答案 0 :(得分:3)

我目前通过以下方式管理:

  1. 使用call_command运行sqlsequencereset
  2. 将输出抓取到内存中的StringIO对象(而不是写入光盘上的文件)
  3. Executing the SQL directly针对Django的默认数据库
  4. <强>代码:

    import StringIO
    
    from django.core.management import call_command
    from django.db import connection
    
    
    app_name = 'my_app'
    
    # Get SQL commands from sqlsequencereset
    output = StringIO.StringIO()
    call_command('sqlsequencereset', app_name, stdout=output, no_color=True)
    sql = output.getvalue()
    
    with connection.cursor() as cursor:
        cursor.execute(sql)
    
    output.close()
    

答案 1 :(得分:1)

鉴于这是Django管理命令的不一致,最好的解决方案可能是看它是否可以在源头修复。有关如何执行此操作的详细信息,请参阅Requesting Features

答案 2 :(得分:0)

另请参见[this gist][1],例如可以在此处完成从控制台查看所有应用。

import os

os.environ['DJANGO_COLORS'] = 'nocolor'

from django.core.management import call_command
from django.db import connection
from django.apps import apps
from StringIO import StringIO

commands = StringIO()
cursor = connection.cursor()

for app in apps.get_app_configs():
    call_command('sqlsequencereset', app.label, stdout=commands)

cursor.execute(commands.getvalue())

答案 3 :(得分:0)

我使用以下代码来使用sequence_reset_sql(如果受支持),否则通过SQL语句使用-到目前为止已发布的各种响应的组合

from django.db import connection
from django.core.management.color import no_style


def resetsequence(appmodels):
    if appmodels is None:
        return

    with connection.cursor() as cursor:
        sequence_sql = connection.ops.sequence_reset_sql(no_style(), appmodels)
        if sequence_sql:
            for sqlstr in sequence_sql:
                cursor.execute(sqlstr)
        else:
            for appmodel in appmodels:
                table = appmodel._meta.db_table
                sqlstr = "ALTER TABLE {:s} AUTO_INCREMENT = 1;".format(table)
                cursor.execute(sqlstr)

appmodels可以通过django.apps.apps.get_app_config()自动填充,也可以手动填充。