diff --git a/hive/db/db_state.py b/hive/db/db_state.py index 405b944e297b73bd680912478a0f4b451ef38e9e..3c97d5031a6ca82ecb137d0b5362837e8adf9774 100644 --- a/hive/db/db_state.py +++ b/hive/db/db_state.py @@ -162,10 +162,9 @@ class DbState: except sqlalchemy.exc.ProgrammingError as ex: log.warning("Ignoring ex: {}".format(ex)) - # TODO: #111 - #for key in cls._all_foreign_keys(): - # log.info("Drop fk %s", key.name) - # key.drop(engine) + from hive.db.schema import drop_fk, create_fk + log.info("Dropping FKs") + drop_fk(cls.db()) log.info("[INIT] Finish pre-initial sync hooks") @@ -241,12 +240,13 @@ class DbState: update_active_starting_from_posts_on_block(last_imported_block, current_imported_block) + log.info("Recreating FKs") + from hive.db.schema import create_fk + create_fk(cls.db()) + time_end = perf_counter() log.info("[INIT] update_all_posts_active executed in %fs", time_end - time_start) - # TODO: #111 - #for key in cls._all_foreign_keys(): - # log.info("Create fk %s", key.name) - # key.create(engine) + @staticmethod def status(): diff --git a/hive/db/schema.py b/hive/db/schema.py index 400748ddf3e48c84ec6e24a6d50c8e5c3603730d..7d630aaf1f7792803230a425b665d93565e6b637 100644 --- a/hive/db/schema.py +++ b/hive/db/schema.py @@ -183,11 +183,11 @@ def build_metadata(): sa.PrimaryKeyConstraint('author_id', 'permlink_id', 'voter_id', name='hive_votes_pk'), - sa.ForeignKeyConstraint(['post_id'], ['hive_posts.id']), - sa.ForeignKeyConstraint(['voter_id'], ['hive_accounts.id']), - sa.ForeignKeyConstraint(['author_id'], ['hive_accounts.id']), - sa.ForeignKeyConstraint(['permlink_id'], ['hive_permlink_data.id']), - sa.ForeignKeyConstraint(['block_num'], ['hive_blocks.num']), + sa.ForeignKeyConstraint(['post_id'], ['hive_posts.id'], name='hive_votes_fk1'), + sa.ForeignKeyConstraint(['voter_id'], ['hive_accounts.id'], name='hive_votes_fk2'), + sa.ForeignKeyConstraint(['author_id'], ['hive_accounts.id'], name='hive_votes_fk3'), + sa.ForeignKeyConstraint(['permlink_id'], ['hive_permlink_data.id'], name='hive_votes_fk4'), + sa.ForeignKeyConstraint(['block_num'], ['hive_blocks.num'], name='hive_votes_fk5'), sa.Index('hive_votes_post_id_idx', 'post_id'), sa.Index('hive_votes_voter_id_idx', 'voter_id'), @@ -206,8 +206,8 @@ def build_metadata(): sa.Column('post_id', sa.Integer, nullable=False), sa.Column('tag_id', sa.Integer, nullable=False), sa.PrimaryKeyConstraint('post_id', 'tag_id', name='hive_post_tags_pk1'), - sa.ForeignKeyConstraint(['post_id'], ['hive_posts.id']), - sa.ForeignKeyConstraint(['tag_id'], ['hive_tag_data.id']), + sa.ForeignKeyConstraint(['post_id'], ['hive_posts.id'], name='hive_post_tags_fk1'), + sa.ForeignKeyConstraint(['tag_id'], ['hive_tag_data.id'], name='hive_post_tags_fk2'), sa.Index('hive_post_tags_post_id_idx', 'post_id'), sa.Index('hive_post_tags_tag_id_idx', 'tag_id') ) @@ -377,6 +377,24 @@ def teardown(db): """Drop all tables""" build_metadata().drop_all(db.engine()) +def drop_fk(db): + db.query_no_return("START TRANSACTION") + for table in build_metadata().sorted_tables: + for fk in table.foreign_keys: + sql = """ALTER TABLE {} DROP CONSTRAINT {}""".format(table.name, fk.name) + db.query_no_return(sql) + db.query_no_return("COMMIT") + +def create_fk(db): + from sqlalchemy.schema import AddConstraint + from sqlalchemy import text + connection = db.engine().connect() + connection.execute(text("START TRANSACTION")) + for table in build_metadata().sorted_tables: + for fk in table.foreign_keys: + connection.execute(AddConstraint(fk.constraint)) + connection.execute(text("COMMIT")) + def setup(db): """Creates all tables and seed data""" # initialize schema