#!/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' } connstr = "" if len(sys.argv) < 2: if os.path.exists('settings.ini'): try: from cecil.core import inifile config = inifile.inifile('settings.ini') connstr = config['settings']['db'] except: pass if not connstr: 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