设为首页 收藏本站
查看: 1127|回复: 0

[经验分享] Python模拟实现oracle的sqlplus工具源码

[复制链接]

尚未签到

发表于 2016-7-28 06:14:50 | 显示全部楼层 |阅读模式
Python模拟实现oracle的sqlplus工具

  团队计划开发数据库服务平台,需要用到一些服务器的脚本开发,为了了解python,给自己定了一个模拟sqlplus的小需求,然后去实现。
  个人体会:python开发快捷,集成很多常用的公共包,对常用数据结构使用很方便,最大的缺点是版本较多,新版本不向前兼容,对AIX及HP-UNIX不太常用的OS也缺少直接支持。

  以下是工具演示:
DSC0000.gif

  

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

  
import cx_Oracleimport osimport sysos.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 connectresultglobal promptstrtry:connectresult=0;promptstr="";conn= cx_Oracle.connect(loginstr);promptstr=conn.username+"@"+conn.dsn;print("Database version:",conn.version);print("Connected.");connectresult=1;return connexcept cx_Oracle.InterfaceError as exc:error, = exc.argsprint(exc);except cx_Oracle.DatabaseError as exc:error, = exc.argsprint(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!=None:print(getcolformatstr(cursor.description) % row),;else:print(getcolformatstr(cursor.description) % ''),;  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.argsprint(exc);except cx_Oracle.DatabaseError as exc:error, = exc.argsprint(error.message);except KeyboardInterrupt:print("^C");continue;    
  

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250285-1-1.html 上篇帖子: 取Oracle_表名_字段名_注释等实用语句 下篇帖子: 【转】Oracle开发人员应该具备的几个资源
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表