update features, add padding
This commit is contained in:
parent
9b2ecd4762
commit
47292a9b1b
1 changed files with 218 additions and 135 deletions
131
sql.py
131
sql.py
|
@ -7,18 +7,40 @@ import readline
|
|||
import traceback
|
||||
|
||||
|
||||
|
||||
|
||||
def softpad(s, l, padchar = " "):
|
||||
def softpad(s, l, padchar=" "):
|
||||
padding = padchar * l
|
||||
if len(s) >= l:
|
||||
return s + padchar
|
||||
return (s + padding)[:l]
|
||||
def pad(s, l, padchar = " "):
|
||||
|
||||
|
||||
def pad(s, l, padchar=" "):
|
||||
padding = padchar * l
|
||||
return (s + padding)[:l]
|
||||
|
||||
|
||||
rowbuffer = None
|
||||
|
||||
|
||||
def execute_cmdline_query(v):
|
||||
global rowbuffer
|
||||
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)
|
||||
traceback.print_exc()
|
||||
sys.stdout.write('\n')
|
||||
|
||||
|
||||
def print_row():
|
||||
global rowbuffer, cur, db
|
||||
if not cur or not cur.description:
|
||||
|
@ -84,20 +106,24 @@ opts = {
|
|||
'hide_null_tablespace': '1',
|
||||
'hide_tablespaces': 'SYSTEM;SYSAUX;SDE;SPATIAL_DATA'
|
||||
}
|
||||
|
||||
connstr = ""
|
||||
if len(sys.argv) < 2:
|
||||
if os.path.exists('settings.ini'):
|
||||
if os.path.exists('settings.ini'):
|
||||
try:
|
||||
from cecil.core import inifile
|
||||
config = inifile.inifile('settings.ini')
|
||||
connstr = config['settings']['db']
|
||||
except:
|
||||
except None:
|
||||
pass
|
||||
|
||||
cmdline_query = None
|
||||
if not connstr:
|
||||
if len(sys.argv) < 2:
|
||||
if not connstr:
|
||||
connstr = input('Connect string: ')
|
||||
else:
|
||||
connstr = sys.argv[1]
|
||||
else:
|
||||
connstr = sys.argv[-1]
|
||||
elif len(sys.argv) > 1:
|
||||
cmdline_query = sys.argv[-1]
|
||||
|
||||
e = sqlalchemy.create_engine(connstr)
|
||||
pool = e.connect()
|
||||
|
@ -105,6 +131,11 @@ db = pool.connection
|
|||
cur = db.cursor()
|
||||
c2 = db.cursor()
|
||||
|
||||
if cmdline_query != None:
|
||||
execute_cmdline_query(cmdline_query)
|
||||
db.commit()
|
||||
sys.exit(0)
|
||||
|
||||
do_quit = False
|
||||
while True:
|
||||
try:
|
||||
|
@ -123,6 +154,44 @@ while True:
|
|||
db.commit()
|
||||
elif vl == 'rollback':
|
||||
db.rollback()
|
||||
elif vl[:4] == 'copy' or vl[:5] == 'copyi':
|
||||
vs = v.split(' ')
|
||||
try:
|
||||
configsrc = inifile.inifile(vs[1])
|
||||
connstrsrc = configsrc['settings']['db']
|
||||
esrc = sqlalchemy.create_engine(connstrsrc)
|
||||
poolsrc = e.connect()
|
||||
dbsrc = pool.connection
|
||||
cursrc = db.cursor()
|
||||
|
||||
c2 = db.cursor()
|
||||
#c2.execute("select * from %s where 1 is null" % (vs[2],))
|
||||
cursrc.execute("select * from %s" % (vs[2],))
|
||||
colnames = []
|
||||
dstart = 1
|
||||
if vs[0] == "copyi":
|
||||
dstart = 0
|
||||
for coldata in cursrc.description[dstart:]:
|
||||
colnames.append(coldata[0])
|
||||
rowload = 0
|
||||
rowerror = 0
|
||||
for r in cursrc:
|
||||
try:
|
||||
colnamesql = ", ".join(colnames)
|
||||
colmarks = ", ".join("%s" for cn in colnames)
|
||||
srcq = "insert into %s (%s) values (%s)" % (vs[2], colnamesql, colmarks)
|
||||
print(srcq)
|
||||
print(r[0])
|
||||
print(r[1])
|
||||
print(r[2])
|
||||
print(len(r))
|
||||
c2.execute(srcq, tuple(r[dstart:]))
|
||||
except:
|
||||
traceback.print_exc()
|
||||
rowerror += 1
|
||||
print(f"Rows loaded {rowload}, errors {rowerror}")
|
||||
except:
|
||||
traceback.print_exc()
|
||||
elif vl == 'tables':
|
||||
rowbuffer = None
|
||||
cur.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES")
|
||||
|
@ -133,8 +202,29 @@ while True:
|
|||
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]))
|
||||
typedata = coldata[1]
|
||||
try:
|
||||
import pytds.tds_base
|
||||
tdlist = []
|
||||
for x in dir(pytds.tds_base):
|
||||
if getattr(pytds.tds_base, x) == typedata:
|
||||
tdlist.append(x)
|
||||
if tdlist:
|
||||
tdlist2 = [x.replace("NTYPE", "").replace(
|
||||
"TYPE", "") for x in tdlist if "TYPE" in x]
|
||||
if tdlist2:
|
||||
tdlist = tdlist2
|
||||
if tdlist:
|
||||
tdlist.sort()
|
||||
tdlist.sort(key=len)
|
||||
typedata = " ".join(tdlist)
|
||||
|
||||
except:
|
||||
pass
|
||||
|
||||
print("%s%s" % (softpad(coldata[0], 40), typedata))
|
||||
except:
|
||||
traceback.print_exc()
|
||||
sys.stdout.write('\n')
|
||||
|
@ -153,21 +243,14 @@ commands:
|
|||
cols <table> lists columns of table
|
||||
commit commits any pending updates or inserts
|
||||
rollback aborts and pending updates or inserts
|
||||
set <key>=<val> sets internal options, like "set page=40" to page at 40 rows
|
||||
help displays this help
|
||||
copy <path> <tbl> reads the config from <path> connects to that database and copies the contents of <tbl>
|
||||
quit exits sql.py
|
||||
<empty line> next page if there are (MORE) pages, just hit "ENTER"
|
||||
<anything else> executes SQL query on the server
|
||||
""")
|
||||
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))
|
||||
execute_cmdline_query(v)
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue