I've been working in deployment scripts for my current project and sometimes I need to drop all the tables and sequences from the database so I can create everything from scratch. I had been doing a
DROP SCHEMA public CASCADE; CREATE SCHEMA public AUTHORIZATION bob; GRANT ALL ON SCHEMA public TO bob;
This was great but a little destructive and over the top. It removes stored procedures and triggers as well which isn't what I want. So I looked at the SQLAlchemy docs and there is a metadata command drop_all()
def drop_tables(): metadata.drop_tables()
Unfortunately this doesn't CASCADE so this isn't going to work in cases where tables have foreign keys (which is most of the time). It also leaves sequences in place.
So I looked at dropping each table in turn with a cascade. So how do you get a list of tables and sequences in the database? I could hard code the names of the tables and sequences but that seemed a little poor.
It turns out that PostgreSQL has a set of views that expose the inner workings of your database and a few queries can give you all the information you need.
def get_table_list_from_db(): """ return a list of table names from the current databases public schema """ sql="select table_name from information_schema.tables"\ "where table_schema='public'" execute = metadata.execute return [name for (name, ) in execute(text(sql))] def get_seq_list_from_db(): """return a list of the sequence names from the current databases public schema """ sql="select sequence_name from information_schema.sequences"\ "where sequence_schema='public'" execute = metadata.execute return [name for (name, ) in execute(text(sql))] def drop_all_tables_and_sequences(): execute = metadata.execute for table in get_table_list_from_db(): try: execute(text("DROP TABLE %s CASCADE" % table)) except SQLError, e: print e for seq in get_seq_list_from_db(): try: execute(text("DROP SEQUENCE %s CASCADE" % table)) except SQLError, e: print e
The information_schema is full of interesting information. It's actually a 'view' of lower level database tables. You can find all sorts of performance and configuration information in there. Quite handy
Here are some docs.
Good luck.