Django的sqlsequencereset命令返回重置数据库中序列所需的SQL命令。
其他类似的管理命令默认自动执行SQL(如果指定了--dry-run选项,则只打印输出)。
在命令行中,您可以使用以下命令执行返回的命令:
python manage.py sqlsequencereset app1_name app2_name | python manage.py dbshell
但是......有没有办法直接从python内部sqlsequencereset
执行返回的代码?
答案 0 :(得分:3)
我目前通过以下方式管理:
<强>代码:强>
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()
自动填充,也可以手动填充。