Pyhton連接wwwhj8828com130996366OOSQL Server數據庫解決方案

爲了提高工作效率及便利性,擬自主開發一款一鍵自動化運維小工具;其中主要一項功能用於與SQL Server數據庫進行交互,程序可以根據數據庫中數據情況,調用對應函數邏輯,做出相應的操作,以達到自動化運維的效果;
關於Python連接SQL Server的方法,調研了一些Python模塊,最終選取了pyodbc模塊:

pymysql模塊
最開始計劃選取pymysql模塊,安裝比較順利,但連接始終失敗,提示異常“pymysql.err.OperationError:[Errorno10054]”;經過排查,連接所需要的信息均正確,但經過確認後發現,pymysql模塊僅適用於連接mysql數據庫,而無法連接sqlserver數據庫,之前也由於調研時意外看錯,實際計劃選用的Python拓展包實際應爲“pymssql”。

pymssql模塊
pymssql模塊在安裝時就問題頻發,不論是在線直接安裝,還是在Python官網下載安裝文件離線安裝均未成功;

最初安裝過程中提示“_mssql.c(266) : fatal error C1083: Cannot open include file: 'sqlfront.h': No such file or directory”,經過排查,發現是由於缺少'sqlfront.h'等頭文件造成,需要下載對應版本的“freeTDS”,以獲得對應的頭文件,但將“freeTDS”包中的頭文件及dll文件放置在Python安裝對應的目錄下後,再次安裝pymssql,依然提示較多異常:

經過排查,是由於Python的底層語言是C,而系統中缺少相關環境,研究較長時間無有效解決方案,遂放棄使用pymssql模塊;之前選擇的版本是pymssql_2.1.3_cp27,在前幾天8月28日又最新發布了2.1.4版本,待校驗是否問題依然存在。

pyodbc模塊
pyodbc模塊可以直接在線安裝,安裝過程很順利:

使用import驗證pyodbc安裝成功:

pyodbc連接SQLServer
下面開始使用pyodbc嘗試連接已經建立完成的模擬待訪問的sqlserver數據庫;pyodbc連接sqlserver有兩種形式:
sqlconn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=database;UID=name;PWD=pass')
或者
sqlconn = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',DATABASE='database',UID='name',PWD='pass')
兩種形式可以根據個人習慣進行選擇,我個人比較傾向於第二種,在編譯器中會高亮關鍵字,從而便於維護,下面的代碼中大家會看到;

上述可以看到對於connect()函數連接sqlserver時需要傳入5個參數值,分別爲DRIVER、SERVER、DATABASE、UID及PWD,參數值的準確很關鍵,因爲任何一個出錯也無法正常的連接到sqlserver,而尤其對sqlserver的配置不太熟悉更是比較分不清到底每個參數實際應賦予的值是什麼?下面來說明一下:

DRIVER:一般爲固定的{SQL Server}即可,當然換成對應的Native Client的版本信息也是可以連接成功的,例如{SQL Server Native Client 10.0};

SERVER:填寫在SQL Server登錄時的服務器名稱即可,可以是SQL Server配置管理器中-SQL Server網絡配置-實例的協議-TCP/IP中任意有效的可訪問信息;

DATABASE:
這個就很好理解了,上述服務器中任意數據庫的名稱即可;

UID:數據庫登錄名,但使用的登錄名一定要允許登錄,且允許連接到數據庫引擎:

PWD:登錄密碼;
使用準確的信息進行嘗試連接,驗證連接正常:

pyodbc模塊的基本使用
pyodbc模塊在使用connect()成功連接sqlserver數據庫後,會返回一個connect對象,使用該對象我們可以對數據庫進行一些列的操作,如果之前已經瞭解過Python其他連接數據庫模塊,例如cx_Oracle、pymysql等,pyodbc模塊對數據庫操作的方法與它們是基本一致的;

cursor()
如果需要對已連接的數據庫進行數據操作,那麼必須得先從connect對象中獲取遊標,然後再使用遊標進行sql語句的操作;
遊標的獲取直接使用connect對象調用cursor()函數即可:

!usr/python/bin

-- coding:utf-8 --

import pyodbc

sqlconn = pyodbc.connect(DRIVER='{SQL Server}',

                     SERVER='127.0.0.1,1433',
                     DATABASE='OIW11111',
                     UID='sa',
                     PWD='123')

cursor = sqlconn.cursor()
關於遊標的概念:可以將遊標(Cursor)形象地看做成一個變動的光標。它實際上是一個指針,它在一段數據庫存放數據查詢結果集或數據操作結果集的內存中,這個指針可以指向結果集中的任何一條記錄 。這樣就可以得到它所指向的數據了,但初始時它指向首記錄。

cursor.execute(sqlStatement)
獲取遊標完成後,我們可以使用遊標的execute()方法來執行我們需要的sql語句,execute()內傳入需要執行語句的字符串形式,例如:
cursor.execute("select * from OIW11111..ashare_ordwth")
或者
sqlStatement = "select * from OIW11111..ashare_ordwth"
cursor.execute(sqlStatement)

cursor.fetchone()/fetchall()/fetchmany([size])
使用execute()執行完sql語句後,尤其是select語句會返回一些結果行,我們可以使用fetch系列的方法去對執行結果進行檢索獲取;
fetchone():
僅獲取一條結果行,將以元組的形式返回,若查詢結果爲空,則返回None;

fetchall():
獲取全部結果行,將以列表的形式返回,每條結果行以元組形式作爲列表元素,若查詢結果爲空,則返回空列表,即[ ];

fetchmany([size]):
獲取指定size數量的結果行,將以列表的形式返回,每條結果行以元組形式作爲列表元素,若查詢結果爲空,則返回空列表,即[ ];

connect.commit()

提交當前事務,當使用遊標對已連接的數據庫進行修改,例如insert操作時,需要使用connect對象執行commit(),與sql中的commit起到相同的作用;
但如果修改完成不執行commit(),則已進行的變更將不會更新到連接的數據庫中。

cursor.close()

關閉遊標,雖然當Python程序執行完成後,會釋放資源,小程序中如果不去關閉也不會有什麼影響,但保證每次手動釋放資源,是良好的習慣;

connect.close()

斷開連接,與cursor.close()一樣,但保證每次手動釋放資源,是良好的習慣;

其他使用
關於pyodbc模塊的實際應用遠遠不止上述所提及的,還有很多方法,後續也需要繼續研究學習,比如執行多條sql語句的方法cursor.executemany(),以及遊標移動的方法;
網上所提及的其他操作數據的拓展模塊會有scroll()方法用於移動遊標定位到指定的位置,對於文件對象的操作也可以使用seek()方法移動光標定位,但對於pyodbc模塊暫時還未發現可用的遊標移動方法,所以現在能想到的代替移動遊標的方法只能使用sql語句條件的過濾減少數據量,對於查詢結果使用fetchall()全部獲取後再進行遍歷或者定位。

完成代碼
需求:遍歷SqlServer中指定數據庫表,如果表中存在非當日數據,則進行清空,否則不進行任何操作,以完成對SqlServer中指定數據庫的初始化操作;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章