官方文檔:https://www.ibm.com/support/knowledgecenter/en/SSEPGG_9.5.0/com.ibm.db2.luw.apdv.python.doc/doc/t0054682.html
import ibm_db conn = ibm_db.connect("database=MICRO_11; " "hostname=localhost; " "port=50000; " "protocol=tcpip; " "uid=administrator; " "pwd=wyz", "", "") stmt = ibm_db.exec_immediate(conn,"SELECT SYS_ORG_TYPE_CODE,SYS_ORG_TYPE_NAME " "FROM SYS_ORG_TYPE_TB " "WHERE SYS_ORG_TYPE_UPID IS NOT NULL") # if結果集條數為0:result==False # if結果集條數>0:結果為一個tuple result = ibm_db.fetch_tuple(stmt) while result: print(result[0], result[1]) # 順序和select字段順序一樣 result = ibm_db.fetch_tuple(stmt)
一、建連接:
''' ibm_db.connect() #非持久性連接 ibm_db.pconnect() #持久性連接,提升性能,連接不關閉 ''' import ibm_db conn = ibm_db.connect("dsn=name","username","password") #連接cataloged或非cataloged數據庫 ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username; PWD=password;", "", "")
二、執行SQL:
不帶參數的
''' string可以為XQuery表達式,用XMLQuery包裝的 如果將用戶輸入作為SQL變量,可能受到SQL注入攻擊 返回的是cursor類型,調用 ibm_db.num_rows()可以得到影響的數據行數 如果執行錯誤,可通過ibm_db.stmt_error() 或 ibm_db.stmt_errormsg()得到錯誤信息 ''' import ibm_db conn = ibm_db.connect("dsn=name","username","password") stmt = ibm_db.exec_immediate(conn, "UPDATE employee SET bonus = '1000' WHERE job = 'MANAGER'") print "Number of affected rows: ", ibm_db.num_rows(stmt) # XQuery if conn: sql = "SELECT XMLSERIALIZE(XMLQUERY('for $i in $t/address where $i/city = \"Olathe\" return <zip>{$i/zip/text()}</zip>' passing c.xmlcol as \"t\") AS CLOB(32k)) FROM xml_test c WHERE id = 1" stmt = ibm_db.exec_immediate(conn, sql) result = ibm_db.fetch_both(stmt) while( result ): print "Result from XMLSerialize and XMLQuery:", result[0] result = ibm_db.fetch_both(stmt)
帶參數的:
''' ibm_db.prepare(), ibm_db.bind_param(),ibm_db.execute()三個方法 准備語句可以提高性能,因為數據庫服務器為數據檢索創建了優化的訪問計划,如果再次執行該語句,則可以重用它 ''' import ibm_db conn = ibm_db.connect("dsn=name","username","password") sql = "SELECT EMPNO, LASTNAME FROM EMPLOYEE WHERE EMPNO > ? AND EMPNO < ?" stmt = ibm_db.prepare(conn, sql) max = 50 min = 0 # 綁定參數 ibm_db.bind_param(stmt, 1, min) ibm_db.bind_param(stmt, 2, max) ibm_db.execute(stmt) # Process results # Invoke prepared statement again using dynamically bound parameters param = max, min, ibm_db.execute(stmt, param)
三、檢索結果集:ibm_db.fetch_both(stmt,num) 如果指定游標為scrollable類型,【在調用ibm_db.exec_immediate()或ibm_db.prepare()的時候】,num為檢索的行數
import ibm_db # 第一種方式: conn = ibm_db.connect( "dsn=name", "username", "password" ) sql = "SELECT * FROM EMPLOYEE" stmt = ibm_db.exec_immediate(conn, sql) dictionary = ibm_db.fetch_both(stmt) while dictionary != False: print "The ID is : ", dictionary["EMPNO"] print "The Name is : ", dictionary[1] dictionary = ibm_db.fetch_both(stmt) # 第二種方式: tuple = ibm_db.fetch_tuple(stmt) while tuple != False: print "The ID is : ", tuple[0] print "The name is : ", tuple[1] tuple = ibm_db.fetch_tuple(stmt) # 第三種方式: dictionary = ibm_db.fetch_assoc(stmt) while dictionary != False: print "The ID is : ", dictionary["EMPNO"] print "The name is : ", dictionary["FIRSTNME"] dictionary = ibm_db.fetch_assoc(stmt) # 第四種方式: while ibm_db.fetch_row(stmt) != False: print "The Employee number is : ", ibm_db.result(stmt, 0) print "The Name is : ", ibm_db.result(stmt, "NAME")
四、調用存儲過程
import ibm_db conn = ibm_db.connect("dsn=sample","username","password") if conn: sql = 'CALL match_animal(?, ?, ?)' stmt = ibm_db.prepare(conn, sql) name = "Peaches" second_name = "Rickety Ride" weight = 0 ibm_db.bind_param(stmt, 1, name, ibm_db.SQL_PARAM_INPUT) ibm_db.bind_param(stmt, 2, second_name, ibm_db.SQL_PARAM_INPUT_OUTPUT) ibm_db.bind_param(stmt, 3, weight, ibm_db.SQL_PARAM_OUTPUT) print "Values of bound parameters _before_ CALL:" print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight) if ibm_db.execute(stmt): print "Values of bound parameters _after_ CALL:" print " 1: %s 2: %s 3: %d\n" % (name, second_name, weight)
五、開啟事務:適合大批量插入數據提升性能
import ibm_db array = { ibm_db.SQL_ATTR_AUTOCOMMIT : ibm_db.SQL_AUTOCOMMIT_OFF } conn = ibm_db.pconnect("dsn=SAMPLE", "user", "password", array) sql = "DELETE FROM EMPLOYEE" try: stmt = ibm_db.exec_immediate(conn, sql) except: print "Transaction couldn't be completed." ibm_db.rollback(conn) else: ibm_db.commit(conn) print "Transaction complete."
六、錯誤處理:
第一種:
import ibm_db try: conn = ibm_db.connect("dsn=sample","user","password") except: print "no connection:", ibm_db.conn_errormsg() else: print "The connection was successful"
第二種:
import ibm_db conn = ibm_db.connect( "dsn=sample", "user", "password") sql = "DELETE FROM EMPLOYEE" try: stmt = ibm_db.exec_immediate(conn, sql) except: print "Transaction couldn't be completed:" , ibm_db.stmt_errormsg() else: print "Transaction complete."
七、查看元數據
注意:調用元數據函數消耗大量的空間。如果可能的話,考慮緩存調用的結果以便在后續調用中使用。
ibm_db.client_info() | 返回包含數據庫客戶端信息的只讀對象. |
ibm_db.column_privileges() | 返回一個結果集,列出表的column和其關聯特權 |
ibm_db.columns() | 返回一個結果集,列出表的column和其關聯元數據 |
ibm_db.foreign_keys() | 返回一個結果集,列出表的column和其關聯元數據 |
ibm_db.primary_keys() | 返回一個結果集,列出表的外鍵 |
ibm_db.procedure_columns() | 返回一個結果集,列出一個或多個存儲過程的參數 |
ibm_db.procedures() | 返回一個結果集,列出數據庫里注冊了的的存儲過程 |
ibm_db.server_info() | 返回包含數據庫服務器信息的只讀對象. |
ibm_db.special_columns() | 返回一個結果集,列出 表的唯一行標識符列 |
ibm_db.statistics() | 返回一個結果集,列出表的索引和統計信息 |
ibm_db.table_privileges() | 返回一個結果集,列出數據庫中的表和相關權限。 |
import ibm_db conn = ibm_db.connect("dsn=sample", "user", "password") client = ibm_db.client_info(conn) # DB客戶端信息 if client: print "DRIVER_NAME: string(%d) \"%s\"" % (len(client.DRIVER_NAME), client.DRIVER_NAME) print "DRIVER_VER: string(%d) \"%s\"" % (len(client.DRIVER_VER), client.DRIVER_VER) print "DATA_SOURCE_NAME: string(%d) \"%s\"" % (len(client.DATA_SOURCE_NAME), client.DATA_SOURCE_NAME) print "DRIVER_ODBC_VER: string(%d) \"%s\"" % (len(client.DRIVER_ODBC_VER), client.DRIVER_ODBC_VER) print "ODBC_VER: string(%d) \"%s\"" % (len(client.ODBC_VER), client.ODBC_VER) print "ODBC_SQL_CONFORMANCE: string(%d) \"%s\"" % (len(client.ODBC_SQL_CONFORMANCE), client.ODBC_SQL_CONFORMANCE) print "APPL_CODEPAGE: int(%s)" % client.APPL_CODEPAGE print "CONN_CODEPAGE: int(%s)" % client.CONN_CODEPAGE ibm_db.close(conn) else: print "Error." # DB服務器信息 server = ibm_db.server_info(conn) if server: print "DBMS_NAME: string(%d) \"%s\"" % (len(server.DBMS_NAME), server.DBMS_NAME) print "DBMS_VER: string(%d) \"%s\"" % (len(server.DBMS_VER), server.DBMS_VER) print "DB_NAME: string(%d) \"%s\"" % (len(server.DB_NAME), server.DB_NAME) ibm_db.close(conn) else: print "Error."