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/

  1. import cx_Oracle  
  2. import os  
  3. import sys  
  4. os.environ['NLS_LANG'] ='AMERICAN_AMERICA.ZHS16GBK';  
  5.   
  6. connectresult=0;  
  7. promptstr="";  
  8. fetchsize=50;  
  9. #conn = cx_Oracle.connect('yzs/yzs@mydb');   
  10. print("------------Welcome To Python Sqlplus ----------------------");  
  11. print("|  Version     : 0.1");  
  12. print("|  Author      : MKing");  
  13. print("|  Blog        : http://blog.csdn.net/yzsind");  
  14. print("|  Sina weibo  : http://weibo.com/yzsind");  
  15. print("|  Release Date: 2011-08-08");  
  16. print("|  Login Example1:username/password@tnsname");  
  17. print("|  Login Example2:username/password@host:port/dbname");  
  18. print("|  Input exit to Quit");  
  19. print("-----------------------------------------------------------");  
  20. print("");  
  21.   
  22. def getConnect(loginstr):  
  23.   global connectresult  
  24.   global promptstr  
  25.   try:  
  26.     connectresult=0;  
  27.     promptstr="";  
  28.     conn= cx_Oracle.connect(loginstr);  
  29.     promptstr=conn.username+"@"+conn.dsn;  
  30.     print("Database version:",conn.version);  
  31.     print("Connected.");  
  32.     connectresult=1;  
  33.     return conn  
  34.   except cx_Oracle.InterfaceError as exc:  
  35.     error, = exc.args  
  36.     print(exc);  
  37.   except cx_Oracle.DatabaseError as exc:  
  38.     error, = exc.args  
  39.     print(error.message);  
  40.   
  41. def getcolformatstr(coldef):  
  42.   if coldef[1]==cx_Oracle.NUMBER:  
  43.     formatstr='%12s';  
  44.   else:  
  45.     if coldef[2]<=32:  
  46.       formatstr='%-'+str(coldef[2])+'s';  
  47.     else:  
  48.       formatstr='%-32s';  
  49.   return formatstr  
  50.     
  51. #########################################################################   
  52. while 1:  
  53.   try:  
  54.     loginstr=raw_input("login>").strip();  
  55.     if loginstr=="" :  
  56.       continue;  
  57.     elif loginstr in ["exit","exit;"]:  
  58.       print("...bye...");  
  59.       exit();      
  60.     conn = getConnect(loginstr);  
  61.     if connectresult==1:  
  62.       break;  
  63.   except KeyboardInterrupt:  
  64.     print("^C");  
  65.     continue;    
  66. while 1:  
  67.   sqlstr="";  
  68.   try:  
  69.     sqlstrline=raw_input(promptstr+">").strip();  
  70.     if sqlstrline=="" :  
  71.       continue;  
  72.     elif sqlstrline.lower() in ["exit","exit;"]:  
  73.       print("...bye...");  
  74.       exit();  
  75.     elif sqlstrline[0:7].lower()=="connect" :  
  76.       conn = getConnect(sqlstrline[8:]);  
  77.     elif sqlstrline.lower() in ["disconnect","disconnect;"] :  
  78.       conn.close();  
  79.       print("Connection closed.");  
  80.     elif sqlstrline[0:4].lower()=="host" :  
  81.       os.system(sqlstrline[4:])  
  82.     else:  
  83.       sqlstr=sqlstr+sqlstrline+'\n';  
  84.       while sqlstrline[-1]!=";" :  
  85.         sqlstrline=raw_input().strip();  
  86.         sqlstr=sqlstr+sqlstrline+'\n';  
  87.       sqlstr=sqlstr[0:len(sqlstr)-2]  
  88.       try:  
  89.         cursor = conn.cursor();  
  90.         cursor.execute(sqlstr);  
  91.         if sqlstr[0:6].lower()=="select" :  
  92.           cols=[]  
  93.           for col in cursor.description:  
  94.             print(getcolformatstr(col) % (col[0])),  
  95.           print('');  
  96.           for col in cursor.description:  
  97.             if col[1]==cx_Oracle.NUMBER:  
  98.               print('-'*12),;  
  99.             else:  
  100.               if col[2]<=32:  
  101.                 print('-'*col[2]),;  
  102.               else:  
  103.                 print('-'*32),;  
  104.           print('');  
  105.           recs = cursor.fetchmany(fetchsize);  
  106.           while len(recs)>0:  
  107.             for row in recs:  
  108.               for i in range(len(row)):  
  109.                 if row[i]!=None:  
  110.                   print(getcolformatstr(cursor.description[i]) % row[i]),;  
  111.                 else:  
  112.                   print(getcolformatstr(cursor.description[i]) % ''),;    
  113.               print('')  
  114.             recs = cursor.fetchmany(fetchsize);  
  115.           print(str(cursor.rowcount)+" rows selected.");  
  116.         elif sqlstr[0:6].lower()=="insert" :  
  117.           print(str(cursor.rowcount)+" rows inserted.");  
  118.         elif sqlstr[0:6].lower()=="update" :  
  119.           print(str(cursor.rowcount)+" rows updated.");  
  120.         elif sqlstr[0:6].lower()=="delete" :  
  121.           print(str(cursor.rowcount)+" rows deleted.");  
  122.         elif sqlstr[0:5].lower()=="merge" :  
  123.           print(str(cursor.rowcount)+" rows merged.");  
  124.         elif sqlstr[0:6].lower()=="commit" :  
  125.           print("Commit complete.");  
  126.         elif sqlstr[0:6].lower()=="rollback" :  
  127.           print("Rollback complete.");  
  128.         else :  
  129.           print("sql execute complete.");  
  130.       except cx_Oracle.InterfaceError as exc:  
  131.         error, = exc.args  
  132.         print(exc);  
  133.       except cx_Oracle.DatabaseError as exc:  
  134.         error, = exc.args  
  135.         print(error.message);  
  136.   except KeyboardInterrupt:  
  137.     print("^C");  
  138.     continue;    
  139.     
  140.     
  141.     

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

相关内容