Django处理8000个模型实例时极慢(如何删除PostgreSQL数据库)
我在开发服务器上安装了Django。最近我用了一条命令:python manage.py loaddata 8000models.json
。结果现在一切都变得超级慢,页面加载不出来。python manage.py flush
也没有反应,ModelType.objects.count()
也不返回结果。
(或者说,如果我等得够久,它们可能会返回。)
这是怎么回事呢?Django真的处理不了这么多数据吗?还是说有其他问题?
更新:我发现这个问题出现在PostgreSQL上,但在SQLite上同样的数据却没有问题。也许我只需要清空PostgreSQL的数据,然后重新加载。
更新 2:我该怎么清空PostgreSQL并重置呢?python manage.py reset appname
没有反应。
更新 3:这是我尝试清空PostgreSQL的方式:
#! bin/bash
sudo -u postgres dropdb mydb
sudo -u postgres createdb mydb
sudo -u postgres psql mydb < ~/my-setup/my-init.sql
python ~/path/to/manage.py syncdb
但是,这导致了以下错误:
dropdb: database removal failed: ERROR: database "mydb" is being accessed by other users
DETAIL: There are 8 other session(s) using the database.
createdb: database creation failed: ERROR: database "mydb" already exists
ERROR: role "myrole" cannot be dropped because some objects depend on it
DETAIL: owner of table mydb.mytable_mytable
# ... more "owner of table", "owner of sequence" statements, etc
我该如何关闭这些其他会话?我没有运行Apache。我每次只使用一个Django开发服务器的实例。然而,当它变得无响应时,我用Control+Z强制结束了它。也许这导致它没有释放数据库连接,从而引发了这个问题?我该如何解决这个问题呢?
2 个回答
你有没有试过检查一下你的PostgreSQL数据库是否还在响应?听起来它可能正在处理你让它加载的数据。
在加载数据的时候,你应该先让它完成。如果页面加载还是很慢,那你就需要检查一下你的查询语句了。
使用.count()这个方法,即使在PostgreSQL(它的计数速度比较慢)上,处理8000个项目也应该能在合理的时间内返回结果。
按下 Ctrl-Z 只是暂停了这个过程,并没有彻底结束它。(我假设你在使用 bash)在你的终端输入 jobs
,你会看到之前的进程还在运行。
一旦你结束了所有正在访问 PostgreSQL 数据库的任务,你就可以像预期那样删除、创建和同步数据库了。