0,首先在電腦中安裝pymssql庫,該庫可以到這里下載:http://www.lfd.uci.edu/~gohlke/pythonlibs/#pymssql
---使用該庫時,需要在Sql Server Configuration Manager里面將TCP/IP協議開啟
1,下面是連接和查詢Sql數據庫類(底層訪問類---通用,有了它就可以隨意訪問數據庫了,主要包含一些訪問數據庫的函數):
import pymssql
class MSSQL:
def __init__(self,host,user,pwd,db): #類的構造函數,初始化數據庫連接ip或者域名,以及用戶名,密碼,要連接的數據庫名稱
self.host=host
self.user=user
self.pwd=pwd
self.db=db
def __GetConnect(self): #得到數據庫連接信息函數, 返回: conn.cursor()
if not self.db:
rasie(NameError,"沒有設置數據庫信息")
self.conn=pymssql.connect(host=self.host,user=self.user,password=self.pwd,database=self.db,charset='utf8')
cur=self.conn.cursor() #將數據庫連接信息,賦值給cur。
if not cur:
raise(NameError,"連接數據庫失敗")
else:
return cur
#執行查詢語句,返回的是一個包含tuple的list,list的元素是記錄行,tuple的元素是每行記錄的字段
def ExecQuery(self,sql): #執行Sql語句函數,返回結果
cur = self.__GetConnect() #獲得數據庫連接信息
cur.execute(sql) #執行Sql語句
resList = cur.fetchall() #獲得所有的查詢結果
#查詢完畢后必須關閉連接
self.conn.close() #返回查詢結果
return resList
def ExecNonQuery(self,sql):
cur = self.__GetConnect()
cur.execute(sql)
self.conn.commit()
self.conn.close()
2,下面在函數中,連接數據庫,並執行一個簡單的查詢語句(查):
def main():
ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong") #實例化類對象,連接數據對象
reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc") #調用函數執行查詢語句
for(id,huiyuancontent) in reslist: #遍歷返回結果
print huiyuancontent #轉換為字符串,打印出來。
3,下面是一個超微復雜點的查詢語句(查):
def main():
ms=MSSQL(host="117.79.156.40",user="wutongview",pwd="*******",db="Wutong")
lst2=[] #聲明列表,Python中沒有數組這個概念
lst=[569454,1405892,1062101,647328,1221889,1255607,1268513,1282851]
for i in lst: #遍歷列表
reslist=ms.ExecQuery("SELECT com_name FROM com WHERE cust_id='"+str(i)+"'") #Python可以用這種加號拼接,也可以用占位符和format進行字符串格式化拼接
if len(reslist)==0: #如果查詢的結果集數組為空,直接添加數據庫查詢結果集,否則,添加結果集中的第一行第一列的值,即reslist[0][0]
lst2.append(reslist)
#print("第一個為空")
#break #break可以跳出循環
else:
lst2.append(reslist[0][0])
return lst2 #返回列表
4,下面是插入數據(增)操作:
def insert():
ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
back_val=ms.ExecNonQuery("INSERT dbo.bx_xyzBackContent ( backmsg, time ) VALUES ( N'nihaoceshi','2014-04-02 13:55:27')") #注意,這里back_val為None值。
return back_val
5,下面是刪除(刪)操作:
def delete():
ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
back_val=ms.ExecNonQuery("DELETE FROM dbo.bx_xyzBackContent WHERE id='6333'") #注意,這里back_val為None值。
return back_val
6,下面是更新(改)操作:
def update():
ms=MSSQL(host="117.79.156.45",user="cswutong",pwd="cjsys!@#",db="CsWutong")
back_val=ms.ExecNonQuery("UPDATE dbo.bx_xyzBackContent SET backmsg='nihaotest' WHERE id=6331") #注意,這里back_val為None值。
return back_val
7,執行存儲過程:
cur.execute("exec 存儲過程名 @參數1=XXX, @參數2='YYY'......")
***一個真實的案例:
def main():
ms=MSSQL(host="192.168.0.156",user="view",pwd="*********",db="Wutong")
reslist=ms.ExecQuery("exec SearchBshi @fromProvince='',@fromCity='',@fromArea='',@companyAddress='',@intPageNo=1,@intPageSize=10")
return reslist #這里,返回的也是查詢結果集,就像一張臨時表,處理方法和上邊一樣。
---前提,你的賬號要有執行存儲過程的權限,否則會報下邊錯誤:
OperationalError: (229, "The EXECUTE permission was denied on the object 'SearchBshi', database 'Wutong', schema 'dbo'.DB-Lib error message 229, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\n")
@注意事項:
- 文件頭加上 #coding=utf8
- sql語句中有中文的時候進行encode
insertSql = "insert into WeiBo([UserId],[WeiBoContent],[PublishDate]) values(1,'測試','2012/2/1')".encode( "utf8")
-
連接的時候加入charset設置信息pymssql.connect(host = self.host,user = self.user,password = self.pwd,database = self.db,charset = "utf8")
2,print str(huiyuancontent),不要加str,會報編碼錯誤。用unicode(huiyuancontent)。
3,注意Sql語句,查詢返回的結果值處理問題。reslist=ms.ExecQuery("select top 10 id,c_value from dbo.bx_categories AS bc")
這里reslist是一個數組對象[(u'\u505a\u4e8b',), (u'\u4f5c\u4e3a\u5b9e\u73b0',), (u'\u4f50\u7167\u9f99',)],[]代表查詢的結果集數組,里邊的圓括號表示的是一行一行的數據,圓括號內逗號隔開的是一列一列的數據。
---最主要,是我們取值的時候,要取對應的值。假如我取結果集中第一行第一列的值,那就是reslist[0][0]