2016-08-01 4 views
-2

私はStackoverflowでエラーを見直しましたが、私は、データベース接続をクラスに入れ、データベースインスタンス中に呼び出すために、cx_Oracleのクラスを作成しようとしています。 私はC#で同様のクラスを作成しましたが、何らかの理由でPythonが特に難しいです。どんな援助も感謝しますTypeErrorを取得しているクラスを呼び出す:バインドされていないメソッドを呼び出す必要があります

私はこのコードを活用は、こちらをご覧ください: cx_Oracle and Exception Handling - Good practices?

import sys 
    import os 
    import cx_Oracle 

    class Oracle(object): 

     __db_server = os.getenv("ORACLE_SERVER") 
     __db_user = os.getenv("ORACLE_ACCT") 
     __db_password = os.getenv("ORACLE_PWD") 

     def connect(self): 
      """ Connect to the database. """ 

      try: 
       self.db = cx_Oracle.connect(__db_user+'/'+__db_password+'@'+__db_server) 
      except cx_Oracle.DatabaseError as e: 
       error, = e.args 
       if error.code == 1017: 
        print('Please check your credentials.') 
       else: 
        print('Database connection error: %s'.format(e)) 
       # Very important part! 
       raise 

      # If the database connection succeeded create the cursor 
      # we-re going to use. 
      self.cursor = db.Cursor() 

     def disconnect(self): 
      """ 
      Disconnect from the database. If this fails, for instance 
      if the connection instance doesn't exist we don't really care. 
      """ 

      try: 
       self.cursor.close() 
       self.db.close() 
      except cx_Oracle.DatabaseError: 
       pass 

     def execute(self, sql, bindvars=None, commit=False): 
      """ 
      Execute whatever SQL statements are passed to the method; 
      commit if specified. Do not specify fetchall() in here as 
      the SQL statement may not be a select. 
      bindvars is a dictionary of variables you pass to execute. 
      """ 

      try: 
       self.cursor.execute(sql, bindvars) 
      except cx_Oracle.DatabaseError as e: 
       error, = e.args 
       if error.code == 955: 
        print('Table already exists') 
       elif error.code == 1031: 
        print("Insufficient privileges") 
       print(error.code) 
       print(error.message) 
       print(error.context) 

       # Raise the exception. 
       raise 

      # Only commit if it-s necessary. 
      if commit: 
       self.db.commit() 

     def select(self, sql, commit=False):   
      bindvars=None 
      result = None 
      try: 
       self.cursor.execute(sql, bindvars) 
       result = self.cursor.fetchall() 
      except cx_Oracle.DatabaseError as e: 
       error, = e.args 
       print "Database Error: failed with error code:%d - %s" % (error.code, error.message) 
       raise 
      if commit: 
       self.db.commit() 
      return result 

     def commit(self): 
      try: 
       self.db.commit() 
      except cx_Oracle.DatabaseError as e: 
       error, = e.args 
       print "Database Commit failed with error code:%d - %s" % (error.code, error.message) 
       raise 

     def rollback(self): 
      try: 
       self.db.rollback() 
      except cx_Oracle.DatabaseError as e: 
       error, = e.args 
       print "Database Rollback failed with error code:%d - %s" %(error.code, error.message) 
       raise 

そして、これが私の関連のノートでルーチン

import sys 
    import os 
    #import cx_Oracle 
    from Oracle import Oracle 

    def main(): 
     oracle = Oracle.connect() 
     query = """SELECT DISTINCT NAME FROM MyTable""" 
     data = oracle.select(query) 
     for row in data: 
      print row 
     oracle.disconnect() 

    ### MAIN 
    if __name__ == '__main__': 
     main() 

を呼んでいる:私は私のオラクルを見つけるためにはPythonを得るように見えることはできませんが呼び出し元関数と同じディレクトリにある場合を除き、.pyクラスです。あなたはそれを使用するようにクラスのインスタンスを作成する必要が

アラン

+1

あなたはクラスをインスタンス化するつもりでしたか? –

+0

(そうではない)プロのヒント:StackOverflowにリンクされた複製が見つかりました。 –

+0

はい、私の質問とマークされた複製の両方で参照されているサンプルが不完全であるようです。したがって、追加の質問につながる。 –

答えて

0

orcl = Oracle() 
orcl.connect() 
... 
関連する問題