gpt4 book ai didi

Django:从每个表中删除所有数据(但保留表本身)

转载 作者:行者123 更新时间:2023-12-02 04:53:41 24 4
gpt4 key购买 nike

我正在尝试在两个 django 安装(生产和测试)之间同步数据。我在生产中使用 ./manage.py dumpdata --natural 来执行此操作,然后将 ./manage.py loaddata 放入新的 syncdb 'ed 测试数据库。

一切都工作正常,直到我添加了新的自定义权限。生产 syncdb 以与空数据库上的新 syncdb 不同的顺序(使用不同的主键)加载此新权限。因此,它会获得不同的 ID。因此,尽管使用自然键,当我尝试加载数据时,在加载第一个无序权限对象时会收到此错误:

IntegrityError: duplicate key value violates unique constraint "auth_permission_content_type_id_codename_key"

我能想到的解决此问题的最简单方法是从测试安装中的每个表中删除所有数据 - 也就是说,仅使用 syncdb 创建表,而不是加载初始数据。但是 syncdb 不允许您跳过初始数据/信号步骤。如果没有显式枚举每个模型或表名称,如何在调用 syncdb 后删除所有初始数据?或者有没有办法在不使用 syncdb 的情况下只创建空表?

./manage.pylush 不是我想要的——它会重新加载初始数据并触发syncdb信号。

最佳答案

根据flush命令的帮助(我使用的是Django 1.3.1),执行的SQL与从./manage.py sqlflush获得的SQL相同,然后是初始数据固定装置已重新安装。

$ python manage.py help flush 
Usage: manage.py flush [options]

Executes ``sqlflush`` on the current database.

要获得相同的数据删除功能(减去固定加载),您可以通过调用 ./manage.py sqlflush 获取 SQL,然后使用 Django 的内置支持执行任意 SQL 来执行该 SQL:

from django.core.management import call_command, setup_environ
from your_django_project import settings
setup_environ(settings)

from django.db import connection
from StringIO import StringIO

def main():
# 'call' manage.py flush and capture its outputted sql
command_output = StringIO()
call_command("sqlflush", stdout=command_output)

command_output.seek(0)
flush_sql = command_output.read()

# execute the sql
# from: https://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly
cursor = connection.cursor()
cursor.execute(flush_sql)

print "db has been reset"

if __name__ == '__main__':
main()

这还有一个额外的好处,您可以在执行之前修改 ./manage.py sqlflush 中的 SQL,以避免删除您可能希望保持完整的表。

此外,根据 the current Django docs ,在 Django 1.5 中,一个新参数 ./manage.pylush --no-initial-data 将重置数据并且不加载初始数据固定装置。

关于Django:从每个表中删除所有数据(但保留表本身),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com