views:

182

answers:

3

Here's how I can do it when MySQL is the backend,

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

But how can I do it when postgresql is the backend?

+1  A: 

You can use select * from pg_tables; get get a list of tables, although you probably want to exclude where schemaname <> 'pg_catalog'...

Based on another one of your recent questions, if you're trying to just drop all your django stuff, but don't have permission to drop the DB, can you just DROP the SCHEMA that Django has everything in?

Also on your drop, use CASCADE.

EDIT: Can you select * from information_schema.tables; ?

EDIT: Your column should be row[2] instead of row[0] and you need to specify which schema to look at with a WHERE schemaname = 'my_django_schema_here' clause.

EDIT: Or just SELECT table_name from pg_tables where schemaname = 'my_django_schema_here'; and row[0]

rfusca
Nope. Just tried dropping the whole SCHEMA. Wouldn't let me.
Mark
Schucks, well you can still use pg_tables to get the tables.
rfusca
See update.. it's telling me "pg_catalogs" doesn't exist... didn't know that was one of my tables?
Mark
@Mark see update
rfusca
tried that `from pg_tables where schemaname='public'` too, that didn't work.
Mark
@Mark See the updates about your row[0] ...if you're SELECT * its row[2] if you SELECT table_name its [0]
rfusca
A: 

\dt is the equivalent command in postgres to list tables. Each row will contain values for (schema, Name, Type, Owner), so you have to use the second (row[1]) value.

Anyway, you solution will break (in MySQL and PostgreSQL) when foreign-key constraints are involved, and if there aren't any, you might get troubles with the sequences. So the best way is in my opinion to simply drop the whole database and call initdb again (which is also the more efficient solution).

tux21b
\dt is not a server command. It won't work when sent from an application. Its a psql client command.
rfusca
I'd be happy to drop the whole database, but I don't have the required permissions (nor to drop the schema).
Mark
Ok, you might be right (so you should pg_tables), but the second part is still valid and "DROP <schema>" will work on both :D
tux21b
`cursor.execute(r'\dt')` gives me a syntax error...
Mark
DROP the database won't work if he doesn't have permissions, which is the point of trying to a hack through the django code.
rfusca
+1  A: 
    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]

Courtesy of http://www.siafoo.net/snippet/85

Mark
Thats pretty much what I'd posted in my last edit.....
rfusca
@rfusca: well then you can have the check :p I found this before I read your edit tho.
Mark