def engine_from_settings(config, full_config=False): settings = get_appsettings(config, 'assembl') if settings['sqlalchemy.url'].startswith('virtuoso:'): db_schema = '.'.join((settings['db_schema'], settings['db_user'])) else: db_schema = settings['db_schema'] set_config(settings, True) session = None if full_config: env = bootstrap(config) configure_zmq(settings['changes_socket'], False) configure_indexing() configure_model_watcher(env['registry'], 'assembl') logging.config.fileConfig(config) session = get_session_maker() metadata = get_metadata() else: session = make_session_maker(zope_tr=True) import assembl.models from assembl.lib.sqla import class_registry engine = configure_engine(settings, session_maker=session) metadata = get_metadata() metadata.bind = engine session = sessionmaker(engine)() return (metadata, session)
def drop_tables(app_settings, session): log.info('Dropping all tables.') session.close() try: get_metadata().drop_all(session.connection()) mark_changed() except Exception as e: raise Exception('Error dropping tables: %s' % e)
def get_incoming_fks(table): incoming = set() for t in get_metadata().sorted_tables: for fk in t.foreign_keys: if fk.column.table == table: incoming.add(fk) return incoming
def copy_discussion(source_config, dest_config, source_slug, dest_slug, delete=False, debug=False, permissions=None): if (session_maker_is_initialized() and abspath(source_config) == get_config()["__file__"]): # not running from script dest_session = get_session_maker()() dest_metadata = get_metadata() else: dest_metadata, dest_session = engine_from_settings( dest_config, True) dest_tables = dest_metadata.sorted_tables if source_config != dest_config: from assembl.lib.sqla import _session_maker temp = _session_maker assert temp == dest_session source_metadata, source_session = engine_from_settings( source_config, False) source_tables_by_name = { table.name: table.tometadata(source_metadata, source_metadata.schema) for table in dest_tables } _session_maker = dest_session else: source_metadata, source_session = dest_metadata, dest_session try: init_key_for_classes(dest_session) from assembl.models import Discussion discussion = source_session.query(Discussion).filter_by( slug=source_slug).one() assert discussion, "No discussion named " + source_slug permissions = [x.split('+') for x in permissions or ()] for (role, permission) in permissions: assert role in SYSTEM_ROLES assert permission in ASSEMBL_PERMISSIONS existing = dest_session.query(Discussion).filter_by(slug=dest_slug).first() if existing: if delete: print("deleting", dest_slug) with transaction.manager: delete_discussion(dest_session, existing.id) else: print("Discussion", dest_slug), print("already exists! Add -d to delete it.") exit(0) from assembl.models import Role, Permission, DiscussionPermission with dest_session.no_autoflush: copy = clone_discussion( source_session, discussion.id, dest_session, dest_slug) for (role, permission) in permissions: role = dest_session.query(Role).filter_by(name=role).one() permission = dest_session.query(Permission).filter_by( name=permission).one() # assumption: Not already defined. dest_session.add(DiscussionPermission( discussion=copy, role=role, permission=permission)) except Exception: traceback.print_exc() if debug: pdb.post_mortem() capture_exception() return dest_session
def copy_discussion(source_config, dest_config, source_slug, dest_slug, delete=False, debug=False, permissions=None): if (session_maker_is_initialized() and abspath(source_config) == get_config()["__file__"]): # not running from script dest_session = get_session_maker()() dest_metadata = get_metadata() else: dest_metadata, dest_session = engine_from_settings( dest_config, True) dest_tables = dest_metadata.sorted_tables if source_config != dest_config: from assembl.lib.sqla import _session_maker temp = _session_maker assert temp == dest_session source_metadata, source_session = engine_from_settings( source_config, False) source_tables_by_name = { table.name: table.tometadata(source_metadata, source_metadata.schema) for table in dest_tables } _session_maker = dest_session else: source_metadata, source_session = dest_metadata, dest_session try: init_key_for_classes(dest_session) from assembl.models import Discussion discussion = source_session.query(Discussion).filter_by( slug=source_slug).one() assert discussion, "No discussion named " + source_slug permissions = [x.split('+') for x in permissions or ()] for (role, permission) in permissions: assert role in SYSTEM_ROLES assert permission in ASSEMBL_PERMISSIONS existing = dest_session.query(Discussion).filter_by(slug=dest_slug).first() if existing: if delete: print "deleting", dest_slug with transaction.manager: delete_discussion(dest_session, existing.id) else: print "Discussion", dest_slug, print "already exists! Add -d to delete it." exit(0) from assembl.models import Role, Permission, DiscussionPermission with dest_session.no_autoflush: copy = clone_discussion( source_session, discussion.id, dest_session, dest_slug) for (role, permission) in permissions: role = dest_session.query(Role).filter_by(name=role).one() permission = dest_session.query(Permission).filter_by( name=permission).one() # assumption: Not already defined. dest_session.add(DiscussionPermission( discussion=copy, role=role, permission=permission)) except Exception: traceback.print_exc() if debug: pdb.post_mortem() capture_exception() return dest_session
def engine_from_settings(config, full_config=False): settings = get_appsettings(config, 'assembl') set_config(settings, True) session = None if full_config: env = bootstrap(config) configure_zmq(settings['changes_socket'], False) configure_indexing() configure_model_watcher(env['registry'], 'assembl') logging.config.fileConfig(config) session = get_session_maker() metadata = get_metadata() else: session = make_session_maker(zope_tr=True) import assembl.models from assembl.lib.sqla import class_registry engine = configure_engine(settings, session_maker=session) metadata = get_metadata() metadata.bind = engine session = sessionmaker(engine)() return (metadata, session)
def get_all_tables(app_settings, session, reversed=True): schema = app_settings.get('db_schema', 'assembl_test') # TODO: Quote schema name! res = session.execute("SELECT table_name FROM " "information_schema.tables WHERE table_schema = " "'%s' ORDER BY table_name" % (schema, )).fetchall() res = {row[0] for row in res} # get the ordered version to minimize cascade. # cascade does not exist on virtuoso. ordered = [t.name for t in get_metadata().sorted_tables if t.name in res] ordered.extend([t for t in res if t not in ordered]) if reversed: ordered.reverse() log.debug('Current tables: %s' % str(ordered)) return ordered
def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ engine = get_session_maker().bind connection = engine.connect() context.configure(connection=connection, target_metadata=get_metadata()) try: context.run_migrations(pyramid_env=pyramid_env) finally: connection.close()
def clear_rows(app_settings, session): log.info('Clearing database rows.') tables_by_name = {t.name: t for t in get_metadata().sorted_tables} for table_name in get_all_tables(app_settings, session): log.debug("Clearing table: %s" % table_name) table = tables_by_name.get(table_name, None) if table is not None: cols = self_referential_columns(table) if len(cols): for col in cols: session.execute("UPDATE %s SET %s=NULL" % (table_name, col.key)) session.flush() session.execute("DELETE FROM \"%s\"" % table_name) session.commit() session.transaction.close()
def clear_rows(app_settings, session): log.info('Clearing database rows.') tables_by_name = { t.name: t for t in get_metadata().sorted_tables} for table_name in get_all_tables(app_settings, session): log.debug("Clearing table: %s" % table_name) table = tables_by_name.get(table_name, None) if table is not None: cols = self_referential_columns(table) if len(cols): for col in cols: session.execute("UPDATE %s SET %s=NULL" % (table_name, col.key)) session.flush() session.execute("DELETE FROM \"%s\"" % table_name) session.commit() session.transaction.close()
def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ engine = get_session_maker(False).bind connection = engine.connect() context.configure(connection=connection, target_metadata=get_metadata()) try: context.run_migrations(pyramid_env=pyramid_env) finally: connection.close()
def get_all_tables(app_settings, session, reversed=True): schema = app_settings.get('db_schema', 'assembl_test') # TODO: Quote schema name! res = session.execute( "SELECT table_name FROM " "information_schema.tables WHERE table_schema = " "'%s' ORDER BY table_name" % (schema,)).fetchall() res = {row[0] for row in res} # get the ordered version to minimize cascade. # cascade does not exist on virtuoso. import assembl.models ordered = [t.name for t in get_metadata().sorted_tables if t.name in res] ordered.extend([t for t in res if t not in ordered]) if reversed: ordered.reverse() log.debug('Current tables: %s' % str(ordered)) return ordered