2016-10-25 15 views
0

python에서 cx_Oracle 모듈을 사용하여 oracle 데이터베이스를 연결하고 쿼리합니다.cx_Oracle 연결 메소드에서 성공하지 못하면 암호를 재 시도하라는 메시지 프롬프트

username = 'user' 
password = 'password' 
db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(username, password)) 

: 사용자가 차례로 연결 방법의 사용자/암호 부분에 전달 얻을 것이다, 사용자 이름과 암호를 입력하라는 메시지가 표시 될 수 있도록

import cx_Oracle 

은 내가 Tkinter의 위젯을 구축 이 방법은 사용자가 첫 번째 시도에서 올바른 사용자 이름과 암호를 입력 할 때 제대로 작동하지만 그렇지 않은 경우 사용자 이름 및/또는 암호를 반복적으로 다시 시도 할 논리가 필요합니다.

잘못된 자격 증명을 입력 할 때 발생되는 오류는 이것이다 : 지금 잠시 동안 interweb 주위에 파고 봤는데 정말 작동 뭔가를 찾을 수 없습니다

cx_Oracle.DatabaseError: ORA-01017: invalid username/password; logon denied

나를. 내가 봤던 많은 것들이 사용자 명과 암호를 알고있는 사전이나 그 선을 따라 무엇인가를 확인하는 것과 관련이있는 것 같다. 나는 그렇게 할 사치가 없다. 나는 어쨌든 이것을 생각하고 끝나는 시점에 있으므로 게시하고 싶었습니다. 나는 그것이 필요한 일종의 쉬운 'while'루프 일 뿐이라고 느낀다. 뭔가 같이 :

여기
while connection_throws_error_: 
    keep_trying_to_log_in 

내 일반적인 코드 :

import Tkinter 
from Tkinter import * 
import cx_Oracle, pprint 

master = Tk() 
Label(master, text="Username").grid(row=0) 
Label(master, text="Password").grid(row=1) 

e1 = Entry(master) 
e2 = Entry(master, fg = 'red', show="*") 

e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 

Button(master, text='Login', command=master.quit).grid(row=3, column=1, sticky=W, pady=4) 

master.title("MEMPRD Login") 
master.mainloop() 

# This is where I need to iteratively prompt user to enter crentials if they are incorrect. 
db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(e1.get(), e2.get()) 

UPDATE 아래 알렉스에

감사합니다, 나는 몇 사용자 정의를 만들어, 자신의 코드를 사용했습니다 내 자신의 사용 및 작동합니다. 여기에 작업 코드입니다 :

master = Tk() 
Label(master, text="Username").grid(row=0) 
Label(master, text="Password").grid(row=1) 

e1 = Entry(master) 
e2 = Entry(master, fg = 'red', show="*") 

e1.grid(row=0, column=1) 
e2.grid(row=1, column=1) 

Button(master, text='Login', command=master.quit).grid(row=3, column=1, sticky=W, pady=4) 
#Button(master, text='Show', command=show_entry_fields).grid(row=3, column=1, sticky=W, pady=4) 



master.title("Login") 
master.mainloop() 

#show_entry_fields() 



print e1.get() 
print e2.get() 

while True: 
    try: 
     db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(e1.get(), e2.get()) 
    except cx_Oracle.DatabaseError as e: 
     error, = e.args 
     if error.code == 1017: 
      print('Please check your credentials.') 
      e2.delete(0, 'end') 
      master.mainloop()   
     else:   
      raise 
    else: 
     print 'success!' 
     break 

답변

1

이이 간단한 콘솔 응용 프로그램에서 어떻게 보일지입니다 :

while True: 
    username = input('Username:') 
    password = getpass('Password:') 
    try: 
     db = cx_Oracle.connect('{0}/{1}@//random.company:1234/db1.company.com'.format(username, password)) 
    except cx_Oracle.DatabaseError as e: 
     # I'm guessing here, you will have to inspect the exception to decide 
     # how to check what kind of error it is 
     if 'username/password invalid' in e.message.lower(): 
      print('Invalid login') 
     else: 
      raise 
    else: 
     print('Success!') 
     break 

나는 그래서 당신은 아마 그것을 구조 조정이 어떻게 작동 Tkinter를 모른다, 하지만 요점은 루프에서 try/except를 사용하는 것입니다.

+0

감사합니다. Alex. 이것은 제가 상상했던 것보다 더 많이 보입니다. while 회 돌이에서도 try 및 except 문을 통합해야한다는 느낌이 들었습니다. 이 기능이 어떻게 작동하는지 다시보고 하겠지만이 로그인 테스트를 모두 마치면 내 oracle 계정에서 자신을 잠급니다! – Mike