Django PostgreSQL -- 删除所有表?

3

当MySQL是后端时,我可以这样做:

    cursor.execute('show tables')
    rows = cursor.fetchall()
    for row in rows:
        cursor.execute('drop table %s; ' % row[0]) 

但是当postgresql是后端时,我该如何处理呢?

5个回答

4
    cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type != 'VIEW' AND table_name NOT LIKE 'pg_ts_%%'""")
    rows = cursor.fetchall()
    for row in rows:
        try:
            cursor.execute('drop table %s cascade ' % row[0])
            print "dropping %s" % row[0]
        except:
            print "couldn't drop %s" % row[0]

本文由http://www.siafoo.net/snippet/85提供。


@rfusca:那么你可以拿到支票:p 在我读你的编辑之前,我就找到了这个。 - mpen

3
您可以使用select * from pg_tables;获取表格列表,尽管您可能想要排除where schemaname <> 'pg_catalog'...
基于您最近的另一个问题,如果您只是想删除所有Django内容,但没有权限删除数据库,那么您是否可以删除Django所在的模式
在删除时,也请使用CASCADE
编辑:您可以使用select * from information_schema.tables;吗?
编辑:您的列应该是row[2]而不是row[0],并且您需要使用WHERE schemaname = 'my_django_schema_here'子句指定要查看哪个模式。
编辑:或者只需使用SELECT table_name from pg_tables where schemaname = 'my_django_schema_here';row[0]

唉,你仍然可以使用pg_tables获取表格。 - rfusca
查看更新...它告诉我 "pg_catalogs" 不存在...不知道那是我的哪个表之一? - mpen
尝试过使用 from pg_tables where schemaname='public',但是没有起作用。 - mpen
1
@Mark 请注意关于你的 row[0] 的更新...如果你使用的是 SELECT * ,那么它应该是 row[2] ,如果你选择了 table_name ,那么它就是 [0]。 - rfusca

2

我使用这个脚本来清空表格,我把它放在一个名为phoenixdb.sh的脚本中,因为它会将数据库销毁并从灰烬中重新崛起。我使用它来防止在项目早期进行大量迁移。

set -e
python manage.py dbshell <<EOF
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
EOF

python manage.py migrate

这将从数据库中抹掉所有表而不会删除数据库。但是,您的Django用户需要拥有模式,可以通过以下设置进行设置:

alter schema public owner to django-db-user-name; 

你可能也想更改数据库的所有者

alter database django-db-name owner to django-db-user-name;

2
文档说明 ./manage.py sqlclear 打印出给定应用程序名称的 DROP TABLE SQL 语句。

0

\dt 是在Postgres中列出表的等效命令。每行都包含(schema, Name, Type, Owner)的值,因此您必须使用第二个(row[1])值。

无论如何,当涉及到外键约束时,您的解决方案将会在MySQL和PostgreSQL中出现问题,如果没有任何问题,您可能会遇到序列的麻烦。所以我认为最好的方法是简单地删除整个数据库并再次调用initdb(这也是更有效的解决方案)。


\dt 不是服务器命令。当从应用程序发送时,它不起作用。这是一个 psql 客户端命令。 - rfusca
我很乐意删除整个数据库,但我没有所需的权限(也无法删除模式)。 - mpen
好的,你可能是对的(所以你应该使用pg_tables),但第二部分仍然有效,"DROP <schema>"将在两个上起作用 :D - tux21b
1
如果没有权限,删除数据库是行不通的,这也是试图通过Django代码进行黑客攻击的关键所在。 - rfusca

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接