从python内部执行Django的sqlsequencereset代码

ise*_*rds 5 django python-2.7

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

默认情况下,其他类似的管理命令会自动执行SQL(并且只有指定--dry-run选项时,才打印输出)。

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

python manage.py sqlsequencereset app1_name app2_name | python manage.py dbshell
Run Code Online (Sandbox Code Playgroud)

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

ise*_*rds 6

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

  1. 使用call_command运行 sqlsequencereset
  2. 将输出抓取到内存中的StringIO对象中(而不是写入磁盘上的文件)
  3. 直接针对 Django 的默认数据库执行 SQL

代码:

import io

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


app_name = 'my_app'

# Get SQL commands from sqlsequencereset
output = io.StringIO()
call_command('sqlsequencereset', app_name, stdout=output, no_color=True)
sql = output.getvalue()
    
with connection.cursor() as cursor:
    cursor.execute(sql)

output.close()
Run Code Online (Sandbox Code Playgroud)


Pao*_*rre 5

您可以通过sqlsequencereset以下方式执行python内部生成的SQL查询(使用默认数据库):

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

from myapps.models import MyModel1, MyModel2


sequence_sql = connection.ops.sequence_reset_sql(no_style(), [MyModel1, MyModel2])
with connection.cursor() as cursor:
    for sql in sequence_sql:
        cursor.execute(sql)
Run Code Online (Sandbox Code Playgroud)

我使用Python3.6Django 2.0PostgreSQL 10测试了此代码。