Python模擬Oracle的SQL/PLUS工具的實現(xiàn)方法
作者:yzsind
本文我們主要介紹了用Python模擬Oracle的SQL/PLUS工具的實現(xiàn)方法,并給出了詳細的源代碼,希望能夠?qū)δ兴鶐椭?/div>
用Python模擬Oracle的SQL/PLUS工具的實現(xiàn)方法是本文我們主要要介紹的內(nèi)容。我們知道,團隊計劃開發(fā)數(shù)據(jù)庫服務(wù)平臺,需要用到一些服務(wù)器的腳本開發(fā),為了了解python,給自己定了一個模擬sqlplus的小需求,然后去實現(xiàn)。
個人體會:
python開發(fā)快捷,集成很多常用的公共包,對常用數(shù)據(jù)結(jié)構(gòu)使用很方便,***的缺點是版本較多,新版本不向前兼容,對AIX及HP-UNIX不太常用的OS也缺少直接支持。
以下是工具演示:
以下是源代碼:
以下代碼用的python版本是python2.7 http://www.python.org/
需要安裝cx_Oracle開發(fā)包(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:
- sqlstrsqlstr=sqlstr+sqlstrline+'\n';
- while sqlstrline[-1]!=";" :
- sqlstrline=raw_input().strip();
- sqlstrsqlstr=sqlstr+sqlstrline+'\n';
- sqlstrsqlstr=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;
特別說明:純屬個人學(xué)習python的代碼,未考慮擴展性與性能,未經(jīng)過專業(yè)測試,不建議拿到實際工作中當SQLPLUS用。
關(guān)于Python模擬Oracle的SQL/PLUS工具的實現(xiàn)方法就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】
- 適合初學(xué)者的MySQL學(xué)習筆記之管理員常用操作總結(jié)
- 適合初學(xué)者的MySQL學(xué)習筆記之SELECT語句使用詳解
- MySQL數(shù)據(jù)庫存儲引擎之MyISAM和InnoDB的區(qū)別對比
- 適合初學(xué)者的MySQL學(xué)習筆記之ORDER BY子句使用詳解
- 適合初學(xué)者的MySQL學(xué)習筆記之MySQL常用命令操作技巧
責任編輯:趙鵬
來源:
CSDN博客


相關(guān)推薦




