Python操作Sql Server 2008数据库的方法详解


Posted in Python onMay 17, 2018

本文实例讲述了Python操作Sql Server 2008数据库的方法。分享给大家供大家参考,具体如下:

最近由于公司的一个项目需要,需要使用Sql Server 2008数据库,开发语言使用Python,并基于windows平台上的Wing IDE4.0进行。

之前并未使用过Sql Server数据库,这次也当作一次练手,并把这次数据库前期开发过程中遇到的一些问题进行记录。

一、关于pyodbc库和pymssql库的选择

在使用python语言进行开发之前,需要确定使用哪种第三方的数据库操作接口,目前Python提供了一些库,如pymssql和pyodbc,目前网上资料比较多的也是这两个了。刚开始我尝试安装并使用了pymssql库,但是始终无法通过python应用程序远程访问连接Sql Server数据库,由于对windows平台又不太熟悉,网上查了一些资料未果,说是需要依赖feeds,还需要设置各种变量等,最终我放弃了它改用pyodbc,虽然也遇到一些小问题,但是总体来说非常顺利。

二、关于pyodbc库的一些接口说明

基于第三方python库来访问Sql Server数据库的过程非常简单(其实除了能访问sql server外,它还可以访问其它数据库,因为它们都基于标准的DB-API2.0标准),总共只需要四步:打开并连接数据库connect、 获取游标指针、执行数据库sql操作、关闭数据库连接

1 打开连接数据库

cnxn = pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;DATABASE=testdb;UID=me;PWD=pass')

或者是:

cnxn = pyodbc.connect(DRIVER='{SQL Server}',SERVER='localhost',DATABASE='testdb',UID='me',PWD='pass')

这里简单说明一下参数:

DRIVER='{SQL Server}'这个一般是固定的,除非你在Sql Server作了更改。
SERVER:此参数为数据库服务器名称,不是"192.168.0.X"这种,一般在安装时命名好了,我的是:ZHANGHUAMIN\MSSQLSERVER_ZHM
DATABASE:此参数指的是Sql Server内具体的数据库了,使用这个connect接口连接之前在sqlserver内应该是已经先创建好并存在的,否则连接不上。
UID:用户名
PWD:密码

执行完毕后,如果成功将返回一个数据库连接句柄。

2 获取游标指针

cursor = cnxn.cursor()

后面对数据库执行的sql语句将使用游标指针来操作

3 执行数据库sql操作

cursor.execute("select user_id, user_name from users") #调用游标指针的execute方法执行sql语句
row = cursor.fetchone() #sql语句执行结果的获取,如果需要一次获取多条记录,可以使用cursor.fetchall()方法
if row:
  print row

有时对数据库执行完sql语句后需要对此事务进行提交,使用如下接口:

cnxn.commit()

特别是当创建一个数据库或数据表,若未进行提交事务,在Sql Server2008终端上将找不到创建的数据库及数据表,如果提交后,在sql server2008通过终端的查询sql 语句就可以即时查到。注:提交事务的commit方法属于数据库的连接句柄对象

4 关闭数据库连接

cnxn.close()

与文件操作类似,不再说明。

三、用python操作Sql Server 2008数据库的具体例程

#!/usr/bin/python
#coding=utf-8
#-------------------------------------------------------------------------------
# Name: datamapper.py
# Purpose: using pyodbc library to operate database
#
# Author: huamin.zhang
#
# Created: 20/04/2013
#-------------------------------------------------------------------------------
import pyodbc
import time
class ODBC_MS:
  ''''' 对pyodbc库的操作进行简单封装
  pyodbc库的下载地址:http://code.google.com/p/pyodbc/downloads/list
  使用该库时,需要在Sql Server Configuration Manager里面将TCP/IP协议开启
  此类完成对数据库DB的连接/查询/执行操作
  正确的连接方式如下:
  cnxn = pyodbc.connect('DRIVER={SQL SERVER};SERVER=ZHANGHUAMIN\MSSQLSERVER_ZHM;DATABASE=AdventureWorks2008;UID=sa;PWD=wa1234')
  cnxn = pyodbc.connect(DRIVER='{SQL SERVER}',SERVER=r'ZHANGHUAMIN\MSSQLSERVER_ZHM',DATABASE='AdventureWorks2008',UID='sa',PWD='wa1234',charset="utf-8")
  '''
  def __init__(self, DRIVER,SERVER, DATABASE, UID, PWD):
    ''''' initialization '''
    self.DRIVER = DRIVER
    self.SERVER = SERVER
    self.DATABASE = DATABASE
    self.UID = UID
    self.PWD = PWD
  def __GetConnect(self):
    ''''' Connect to the DB '''
    if not self.DATABASE:
      raise(NameError,"no setting db info")
    self.conn = pyodbc.connect(DRIVER=self.DRIVER, SERVER=self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD, charset="UTF-8")
    #self.conn = pyodbc.connect(DRIVER=self.DRIVER, SERVER=self.SERVER, DATABASE=self.DATABASE, UID=self.UID, PWD=self.PWD)
    cur = self.conn.cursor()
    if not cur:
      raise(NameError,"connected failed!")
    else:
      return cur
  def ExecQuery(self, sql):
    ''''' Perform one Sql statement '''
    cur = self.__GetConnect() #建立链接并创建数据库操作指针
    cur.execute(sql)#通过指针来执行sql指令
    ret = cur.fetchall()#通过指针来获取sql指令响应数据
    cur.close()#游标指标关闭
    self.conn.close()#关闭数据库连接
    return ret
  def ExecNoQuery(self,sql):
    ''''' Person one Sql statement like write data, or create table, database and so on'''
    cur = self.__GetConnect()
    cur.execute(sql)
    self.conn.commit()#连接句柄来提交
    cur.close()
    self.conn.close()
def main():
  ms = ODBC_MS('{SQL SERVER}', r'ZHANGHUAMIN\MSSQLSERVER_ZHM', 'zhm_db', 'sa', 'wa1234')#zhm_db数据库是在sql server 终端里先创建好的
  #ms.ExecNoQuery("drop table Customers_test")
  sql = '''''CREATE TABLE Customers_test
  (
    CustomerNo   int       IDENTITY   NOT NULL,
    CustomerName  varchar(30)         NOT NULL,
    Address1    nvarchar(30)         NOT NULL ,
    Address2    nvarchar(30)         NOT NULL,
    City      nvarchar(20)         NOT NULL,
    State     nchar(20)          NOT NULL,
    Zip      varchar(10)         NOT NULL,
    Contact    varchar(25)         NOT NULL,
    Phone     char(15)           NOT NULL,
    FedIDNo    varchar(9)          NOT NULL,
    DateInSystem  smalldatetime        NOT NULL
  );'''
  ms.ExecNoQuery(sql)
  #注意:在进行插入操作时,自增长度不能够写入
  sql = u'''''insert into Customers_test
  (
    CustomerName,
    Address1,
    Address2,
    City,
    State,
    Zip,
    Contact,
    Phone,
    FedIDNo,
    DateInSystem
  )
  VALUES
  (
    'zhm', '北京市朝阳区', '北京市朝阳区', '北京', '哈哈','3625514', '18001226509', '010-88765879', '21', '2012-09-09'
  );
  '''
  ms.ExecNoQuery(sql)
if __name__ == '__main__':
  main()

说明:我之前连接了一个Sql Server自带的AdventureWorks2008数据库例程,并在其中创建了一个如上数据表Customers_test,然后插入一条如上记录,结果在Sql Server2008的终端上用Select * FROM Customers_test查询,结果对包含中文信息字段的数据变成如“??????”的乱码,经过倒腾了一上午,唯一可能解释的原因可能在于AdventureWorks2008数据库做了一些我不知道的约束,中文所对应的编码它不支持。 因为在如上例程中,我自己创建的zhm_db数据库,并在其中创建数据表,然后插入记录,同样的在Sql Server终端里用select查询,中文也是可以正常显示的。

注意,在python程序中需要增加:#coding = utf-8编码,并在连接connect内增加charset = "utf-8"指明字符集为utf-8编码即可。这样可以防止乱码的出现

最后在Sql Server 2008内通过终端使用SELECT * FROM Customers_test显示的结果如下:

Python操作Sql Server 2008数据库的方法详解

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python备份Mysql脚本
Aug 11 Python
利用Django框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
python比较两个列表大小的方法
Jul 11 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
python中如何使用正则表达式的非贪婪模式示例
Oct 09 Python
利用python的socket发送http(s)请求方法示例
May 07 Python
python实现按长宽比缩放图片
Jun 07 Python
利用Python的sympy包求解一元三次方程示例
Nov 22 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 Python
如何用python反转图片,视频
Apr 24 Python
Python读写及备份oracle数据库操作示例
May 17 #Python
Python selenium抓取微博内容的示例代码
May 17 #Python
Python实现的查询mysql数据库并通过邮件发送信息功能
May 17 #Python
Python实现读取txt文件并转换为excel的方法示例
May 17 #Python
cmd运行python文件时对结果进行保存的方法
May 16 #Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
May 16 #Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 #Python
You might like
国内咖啡文化
2021/03/03 咖啡文化
PHP中Session的概念
2006/10/09 PHP
用文本文件实现的动态实时发布新闻的程序
2006/10/09 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
利用PHP判断是否是连乘数字串的方法示例
2017/07/03 PHP
验证手机号码的JS方法分享
2013/09/10 Javascript
JavaScript实现Java中StringBuffer的方法
2015/02/09 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
2015/08/12 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
2017/08/17 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
layui select获取自定义属性方法
2018/08/15 Javascript
基于VUE的v-charts的曲线显示功能
2019/10/01 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python使用paramiko模块实现ssh远程登陆上传文件并执行
2014/01/27 Python
Python中将字典转换为列表的方法
2016/09/21 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
Python语言描述最大连续子序列和
2017/12/05 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
在Python中如何传递任意数量的实参的示例代码
2019/03/21 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
Python中求对数方法总结
2020/03/10 Python
在主流系统之上安装Pygame的方法
2020/05/20 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
C#笔试题和英文面试题
2013/02/07 面试题
JAVA软件工程师测试题
2014/07/25 面试题
共青团员自我评价范文
2014/09/14 职场文书
支教个人总结
2015/03/04 职场文书
楚门的世界观后感
2015/06/03 职场文书
家长通知书家长意见
2015/06/03 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle