def dump_schema (class_, connection_string, schema_name, tables=None): db.connect(connection_string) oracle_database = Database() diffs = [] db_schema = Schema(schema_name, database=oracle_database) oracle_database.add(db_schema) if tables: tables = {OracleIdentifier(table_name): ([c.strip() for c in columns[0].split(',')] if len(columns) else None) for table_name, *columns in (table.split(':', 1) for table in tables)} for table in Table.from_db(db_schema.name.schema, oracle_database, tables): db_schema.add(table) for table_name, columns in tables.items(): table = db_schema.find(table_name, Table, False) if columns: for column_name in columns: db_schema.find(table.name.with_(part=column_name), Column, False) Data.from_db(table, columns) diffs.append(Diff(["-- Data for {}".format(table_name)] + [datum.sql(fq=False, columns=columns) for datum in table.data], produces=set(table.data))) else: db_schema.from_db() # Set index ownership for all unique constraints if Constraint in db_schema.objects: for cons in db_schema.objects[Constraint].values(): if isinstance(cons, UniqueConstraint): cons.index_ownership = UniqueConstraint.FULL_INDEX_CREATE diffs = db_schema.diff(Schema(schema_name, database=Database())) if diffs: diffs = order_diffs(diffs) return diffs
def diff_to_db (self, connection_string): self.log.info('Loading current database state...') # Perform all schema aliasing on self, before passing any attributes on to # the oracle_database. The oracle_database will therefore be fully aliased. self.default_schema = schema_alias(self.default_schema) for schema_name in set(self.schemas): aliased_schema_name = schema_alias(schema_name) if schema_name != aliased_schema_name: if aliased_schema_name in self.schemas: self.merge_schemas(aliased_schema_name, schema_name) else: self.rename_schema(schema_name, aliased_schema_name) db.connect(connection_string) oracle_database = Database(self.default_schema) oracle_database._ignores = self._ignores oracle_database._ignore_schemas = self._ignore_schemas for schema_name in self.schemas: if (schema_name not in self._ignore_schemas and schema_name not in oracle_database.schemas): oracle_database.add(Schema(schema_name)) oracle_database.from_db() self.log.info('Comparing database definition to current database state...') diffs = [] for schema_name in self.schemas: if schema_name not in self._ignore_schemas: diffs.extend(self.schemas[schema_name].diff( oracle_database.schemas[schema_name])) if diffs: diffs = order_diffs(diffs) return diffs