From ecb256ef46a309b893ee44cc74404de577ffcf60 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 5 Mar 2012 12:11:53 -0600 Subject: [PATCH 1/2] Adding db_shell.py that can be used to simplify writing command line scripts against the Galaxy model/database layer or to make use of Galaxy models in an interactive shell. --- scripts/__init__.py | 0 scripts/db_shell.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 scripts/__init__.py create mode 100644 scripts/db_shell.py diff --git a/scripts/__init__.py b/scripts/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/scripts/db_shell.py b/scripts/db_shell.py new file mode 100644 index 00000000000..eb02153711b --- /dev/null +++ b/scripts/db_shell.py @@ -0,0 +1,86 @@ +# This script allows easy access to Galaxy's database layer via the +# Galaxy models. For example:q +# % python -i scripts/db_shel.py +# >>> new_user = User("admin@gmail.com") +# >>> new_user.set_password +# >>> sa_session.add(new_user) +# >>> sa_session.commit() +# >>> sa_session.query(User).all() +# +# You can also use this script as a library, for instance see https://gist.github.com/1979583q +# TODO: This script overlaps alot wth manage_db.py and create_db.py, +# these should maybe be refactored to remove duplication. +import sys, os.path, logging + +new_path = [ os.path.join( os.getcwd(), "lib" ) ] +new_path.extend( sys.path[1:] ) # remove scripts/ from the path +sys.path = new_path + +from galaxy import eggs + +import pkg_resources +pkg_resources.require( "sqlalchemy-migrate" ) +pkg_resources.require( "SQLAlchemy" ) + +from ConfigParser import SafeConfigParser + +log = logging.getLogger( __name__ ) + +if sys.argv[-1] in [ 'community' ]: + # Need to pop the last arg so the command line args will be correct + # for sqlalchemy-migrate + webapp = sys.argv.pop() + config_file = 'community_wsgi.ini' + repo = 'lib/galaxy/webapps/community/model/migrate' +else: + # Poor man's optparse + config_file = 'universe_wsgi.ini' + if '-c' in sys.argv: + pos = sys.argv.index( '-c' ) + sys.argv.pop(pos) + config_file = sys.argv.pop( pos ) + if not os.path.exists( config_file ): + print "Galaxy config file does not exist (hint: use '-c config.ini' for non-standard locations): %s" % config_file + sys.exit( 1 ) + repo = 'lib/galaxy/model/migrate' + +cp = SafeConfigParser() +cp.read( config_file ) + +if cp.has_option( "app:main", "database_connection" ): + db_url = cp.get( "app:main", "database_connection" ) +elif cp.has_option( "app:main", "database_file" ): + db_url = "sqlite:///%s?isolation_level=IMMEDIATE" % cp.get( "app:main", "database_file" ) +else: + db_url = "sqlite:///./database/universe.sqlite?isolation_level=IMMEDIATE" + +dialect_to_egg = { + "sqlite" : "pysqlite>=2", + "postgres" : "psycopg2", + "mysql" : "MySQL_python" +} +dialect = ( db_url.split( ':', 1 ) )[0] +try: + egg = dialect_to_egg[dialect] + try: + pkg_resources.require( egg ) + log.debug( "%s egg successfully loaded for %s dialect" % ( egg, dialect ) ) + except: + # If the module is in the path elsewhere (i.e. non-egg), it'll still load. + log.warning( "%s egg not found, but an attempt will be made to use %s anyway" % ( egg, dialect ) ) +except KeyError: + # Let this go, it could possibly work with db's we don't support + log.error( "database_connection contains an unknown SQLAlchemy database dialect: %s" % dialect ) + +# Setup DB scripting environment +from sqlalchemy import * +from sqlalchemy.orm import * +from sqlalchemy.exc import * + +os.environ['PYTHONINSPECT'] = 'True' +engine = create_engine(db_url, echo=True) +db_session = scoped_session( sessionmaker( bind = engine ) ) +from galaxy.model.mapping import context as sa_session +sa_session.bind = engine +from galaxy.model import * + From de62173affd4862ef432ddd9d2e3edeeb05d8b63 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Mon, 5 Mar 2012 15:23:28 -0600 Subject: [PATCH 2/2] Actually we don't want to set that environment variable, that make python behave like -i every execution. --- scripts/db_shell.py | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/db_shell.py b/scripts/db_shell.py index eb02153711b..c9acde171e1 100644 --- a/scripts/db_shell.py +++ b/scripts/db_shell.py @@ -77,7 +77,6 @@ from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.exc import * -os.environ['PYTHONINSPECT'] = 'True' engine = create_engine(db_url, echo=True) db_session = scoped_session( sessionmaker( bind = engine ) ) from galaxy.model.mapping import context as sa_session