#!/usr/bin/python3 import os import sys import sqlalchemy def softpad(s, l, padchar = " "): padding = padchar * l if len(s) >= l: return s + padchar return (s + padding)[:l] def pad(s, l, padchar = " "): padding = padchar * l return (s + padding)[:l] rowbuffer = None def print_row(): global rowbuffer, cur, db if not cur or not cur.description: return False try: page = int(opts['page']) colhdrs = [x[0] for x in cur.description] allcols = [] lens = [] for i in range(len(colhdrs)): l = min(len(colhdrs[i]), 10) lens.append(l) if rowbuffer: rowbuffer = [repr(x) for x in rowbuffer] allcols = [rowbuffer] for i in range(len(rowbuffer)): l = len(rowbuffer[i]) if i > len(lens): print(lens) print(rowbuffer) if l > lens[i]: lens[i] = l rowbuffer = None while len(allcols) < page: cols = cur.fetchone() if not cols: break cols = [repr(x) for x in cols] allcols.append(cols) for i in range(len(cols)): l = len(cols[i]) if l > lens[i]: lens[i] = l if not allcols: return False for i in range(len(colhdrs)): colhdrs[i] = pad(colhdrs[i], lens[i]) for i in range(len(allcols)): cols = allcols[i] for j in range(len(cols)): cols[j] = pad(cols[j], lens[j]) colhdrrow = ' | '.join(colhdrs) seprow = '-' * len(colhdrrow) print(colhdrrow) print(seprow) for cols in allcols: colsrow = ' | '.join(cols) print(colsrow) rowbuffer = cur.fetchone() if rowbuffer: print(" ( more ) ") return True except: traceback.print_exc() return False opts = { 'page': '20', 'hide_null_tablespace': '1', 'hide_tablespaces': 'SYSTEM;SYSAUX;SDE;SPATIAL_DATA' } if len(sys.argv) < 2: connstr = input('Connect string: ') else: connstr = sys.argv[1] e = sqlalchemy.create_engine(connstr) pool = e.connect() db = pool.connection cur = db.cursor() c2 = db.cursor() do_quit = False while True: try: v = input('# ') except EOFError: do_quit = True if do_quit: break v = v.strip() vl = v.lower() if vl == 'quit' or vl == 'exit': break elif vl == 'commit': db.commit() elif vl == 'rollback': db.rollback() elif vl == 'tables': rowbuffer = None cur.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES") print_row() elif vl[:5] == 'cols ': rowbuffer = None vs = v.split(' ') c2 = db.cursor() try: c2.execute("select * from %s where 1 is null" % (vs[1],)) for coldata in c2.description: print("%s%s" % (softpad(coldata[0], 40), coldata[1])) except: sys.stdout.write(str(sys.exc_info)) elif vl[:4] == 'set ': vs = v[4:] vi = vs.find('=') vn = vs[:vi] vv = vs[vi+1:] opts[vn] = vv elif vl == '': print_row() elif vl == 'help': print(""" commands: tables lists tables cols lists columns of table commit commits any pending updates or inserts rollback aborts and pending updates or inserts help displays this help quit exits sql.py """) else: rowbuffer = None try: v = v.rstrip(';') cur.execute(v) print_row() except: try: c2 = db.cursor() c2.execute("SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE 1 IS NULL") except: print("Database connection lost!") sys.exit(1) sys.stdout.write(str(sys.exc_info))