1
0
Fork 0
pgcli/pgcli/magic.py

59 lines
1.6 KiB
Python

from .main import PGCli
import sql.parse
import sql.connection
import logging
_logger = logging.getLogger(__name__)
def load_ipython_extension(ipython):
#This is called via the ipython command '%load_ext pgcli.magic'
#first, load the sql magic if it isn't already loaded
if not ipython.find_line_magic('sql'):
ipython.run_line_magic('load_ext', 'sql')
#register our own magic
ipython.register_magic_function(pgcli_line_magic, 'line', 'pgcli')
def pgcli_line_magic(line):
_logger.debug('pgcli magic called: %r', line)
parsed = sql.parse.parse(line, {})
conn = sql.connection.Connection.get(parsed['connection'])
try:
#A corresponding pgcli object already exists
pgcli = conn._pgcli
_logger.debug('Reusing existing pgcli')
except AttributeError:
#I can't figure out how to get the underylying psycopg2 connection
#from the sqlalchemy connection, so just grab the url and make a
#new connection
pgcli = PGCli()
u = conn.session.engine.url
_logger.debug('New pgcli: %r', str(u))
pgcli.connect(u.database, u.host, u.username, u.port, u.password)
conn._pgcli = pgcli
#For convenience, print the connection alias
print('Connected: {}'.format(conn.name))
try:
pgcli.run_cli()
except SystemExit:
pass
if not pgcli.query_history:
return
q = pgcli.query_history[-1]
if q.mutating:
_logger.debug('Mutating query detected -- ignoring')
return
if q.successful:
ipython = get_ipython()
return ipython.run_cell_magic('sql', line, q.query)