__all__ = ['create_tables', 'create_tables_sql', 'drop_tables', 'drop_tables_sql'] def create_tables(tables, if_not_exists=False, connection=None): """ Create the given tables as a set. Constraints are collected and only created at the end of the process. Tables are created in the given order. """ if connection is None: connection = tables[0].sqlmeta.get_connection() if if_not_exists: tables = [t for t in tables if not t.sqlmeta.table_exists()] sql = create_tables_sql(tables, connection) cur = connection.cursor() for s in sql: cur.execute(s) cur.close() def create_tables_sql(tables, connection=None): """ Return a list of SQL statements for creating the given tables. """ create_context = {} sql = [] lazy_sql = [] for table in tables: table_sql, table_lazy_sql = table.sqlmeta.create_sql( connection, create_context) sql.extend(table_sql) lazy_sql.extend(table_lazy_sql) sql.extend(lazy_sql) return sql def drop_tables(tables, if_exists=False, connection=None): """ Drop the given tables as a set. Tables are dropped in *reverse* order. """ if connection is None: connection = tables[0].sqlmeta.get_connection() if if_exists: tables = [t for t in tables if t.sqlmeta.table_exists()] sql, lazy_sql = drop_tables_sql(tables, connection) cur = connection.cursor() for s in sql + lazy_sql: cur.execute(s) cur.close() def drop_tables_sql(tables, connection=None): sql = [] lazy = [] reversed = list(tables) reversed.reverse() for table in reversed: this_sql, this_lazy = table.sqlmeta.drop_sql(connection) sql.extend(this_sql) lazy.extend(this_lazy) return sql, lazy