【问题标题】:Django PostgreSQL -- Drop all tables?Django PostgreSQL——删除所有表?
【发布时间】:2010-07-23 18:48:27
【问题描述】:

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

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

但是当 postgresql 是后端时,我该怎么做呢?

【问题讨论】:

    标签: django postgresql


    【解决方案1】:
        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 我在阅读你的编辑之前发现了这个。
    【解决方案2】:

    您可以使用select * from pg_tables; 获取表列表,尽管您可能希望排除where schemaname <> 'pg_catalog'...

    根据您最近提出的另一个问题,如果您只想删除所有 django 内容,但没有删除数据库的权限,您可以 DROP the SCHEMA 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]

    【讨论】:

    • Schucks,你仍然可以使用 pg_tables 来获取表格。
    • 查看更新……它告诉我“pg_catalogs”不存在……不知道那是我的一张桌子?
    • 也试过from pg_tables where schemaname='public',还是不行。
    • @Mark 查看有关您的行 [0] 的更新 ...如果您是 SELECT * 它的行 [2] 如果您选择 table_name 它的 [0]
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我使用这个脚本来清除表,我把它放在一个名为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;
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • \dt 不是服务器命令。从应用程序发送时它将不起作用。它是一个 psql 客户端命令。
        • 我很乐意删除整个数据库,但我没有所需的权限(也没有删除架构)。
        • 好吧,你可能是对的(所以你应该使用 pg_tables),但第二部分仍然有效,并且“DROP ”对两者都有效:D
        • 如果他没有权限,DROP 数据库将无法工作,这是试图通过 django 代码进行破解的关键。
        猜你喜欢
        • 1970-01-01
        • 2012-10-24
        • 2020-04-18
        • 1970-01-01
        • 2020-10-21
        • 2011-01-18
        • 2015-04-09
        • 2012-08-18
        • 2011-03-20
        相关资源
        最近更新 更多