Python模拟实现oracle的sqlplus工具源码

Python模拟实现oracle的sqlplus工具

团队计划开发数据库服务平台,需要用到一些服务器的脚本开发,为了了解python,给自己定了一个模拟sqlplus的小需求,然后去实现。

个人体会:python开发快捷,集成很多常用的公共包,对常用数据结构使用很方便,最大的缺点是版本较多,新版本不向前兼容,对AIX及HP-UNIX不太常用的OS也缺少直接支持。

以下是工具演示:



以下是源代码:

以下代码用的python版本是python2.7 http://www.python.org/
需要安装cx_Oracle开发包(python访问ORACLE用的) http://cx-oracle.sourceforge.net/


import cx_Oracle import os import sys os.environ['NLS_LANG'] ='AMERICAN_AMERICA.ZHS16GBK'; connectresult=0; promptstr=""; fetchsize=50; #conn = cx_Oracle.connect('yzs/yzs@mydb'); print("------------Welcome To Python Sqlplus ----------------------"); print("| Version : 0.1"); print("| Author : MKing"); print("| Blog : http://blog.csdn.net/yzsind"); print("| Sina weibo : http://weibo.com/yzsind"); print("| Release Date: 2011-08-08"); print("| Login Example1:username/password@tnsname"); print("| Login Example2:username/password@host:port/dbname"); print("| Input exit to Quit"); print("-----------------------------------------------------------"); print(""); def getConnect(loginstr): global connectresult global promptstr try: connectresult=0; promptstr=""; conn= cx_Oracle.connect(loginstr); promptstr=conn.username+"@"+conn.dsn; print("Database version:",conn.version); print("Connected."); connectresult=1; return conn except cx_Oracle.InterfaceError as exc: error, = exc.args print(exc); except cx_Oracle.DatabaseError as exc: error, = exc.args print(error.message); def getcolformatstr(coldef): if coldef[1]==cx_Oracle.NUMBER: formatstr='%12s'; else: if coldef[2]<=32: formatstr='%-'+str(coldef[2])+'s'; else: formatstr='%-32s'; return formatstr ######################################################################### while 1: try: loginstr=raw_input("login>").strip(); if loginstr=="" : continue; elif loginstr in ["exit","exit;"]: print("...bye..."); exit(); conn = getConnect(loginstr); if connectresult==1: break; except KeyboardInterrupt: print("^C"); continue; while 1: sqlstr=""; try: sqlstrline=raw_input(promptstr+">").strip(); if sqlstrline=="" : continue; elif sqlstrline.lower() in ["exit","exit;"]: print("...bye..."); exit(); elif sqlstrline[0:7].lower()=="connect" : conn = getConnect(sqlstrline[8:]); elif sqlstrline.lower() in ["disconnect","disconnect;"] : conn.close(); print("Connection closed."); elif sqlstrline[0:4].lower()=="host" : os.system(sqlstrline[4:]) else: sqlstr=sqlstr+sqlstrline+'\n'; while sqlstrline[-1]!=";" : sqlstrline=raw_input().strip(); sqlstr=sqlstr+sqlstrline+'\n'; sqlstr=sqlstr[0:len(sqlstr)-2] try: cursor = conn.cursor(); cursor.execute(sqlstr); if sqlstr[0:6].lower()=="select" : cols=[] for col in cursor.description: print(getcolformatstr(col) % (col[0])), print(''); for col in cursor.description: if col[1]==cx_Oracle.NUMBER: print('-'*12),; else: if col[2]<=32: print('-'*col[2]),; else: print('-'*32),; print(''); recs = cursor.fetchmany(fetchsize); while len(recs)>0: for row in recs: for i in range(len(row)): if row[i]!=None: print(getcolformatstr(cursor.description[i]) % row[i]),; else: print(getcolformatstr(cursor.description[i]) % ''),; print('') recs = cursor.fetchmany(fetchsize); print(str(cursor.rowcount)+" rows selected."); elif sqlstr[0:6].lower()=="insert" : print(str(cursor.rowcount)+" rows inserted."); elif sqlstr[0:6].lower()=="update" : print(str(cursor.rowcount)+" rows updated."); elif sqlstr[0:6].lower()=="delete" : print(str(cursor.rowcount)+" rows deleted."); elif sqlstr[0:5].lower()=="merge" : print(str(cursor.rowcount)+" rows merged."); elif sqlstr[0:6].lower()=="commit" : print("Commit complete."); elif sqlstr[0:6].lower()=="rollback" : print("Rollback complete."); else : print("sql execute complete."); except cx_Oracle.InterfaceError as exc: error, = exc.args print(exc); except cx_Oracle.DatabaseError as exc: error, = exc.args print(error.message); except KeyboardInterrupt: print("^C"); continue;


特别说明:纯属个人学习python的代码,未考虑扩展性与性能,未经过专业测试,不建议拿到实际工作中当SQLPLUS用。

你可能感兴趣的:(Python模拟实现oracle的sqlplus工具源码)