Python操作Sql Server 2008数据库的方法详解
作者:至死孤独 发布时间:2024-01-20 04:47:01
本文实例讲述了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程序设计有所帮助。
来源:https://blog.csdn.net/u013013708/article/details/51082884


猜你喜欢
- 首先使用tf.where()将满足条件的数值索引取出来,在numpy中,可以直接用矩阵引用索引将满足条件的数值取出来,但是在tensorfl
- 问题:过滤用户输入中前后多余的空白字符‘ ++++abc123---
- 笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱。近期换用python开发, 也
- 本文实例讲述了Python根据已知邻接矩阵绘制无向图操作。分享给大家供大家参考,具体如下:有六个点:[0,1,2,3,4,5,6],六个点之
- 目录一 列表二 集合三 字典总结一 列表# 列表:包含0个或多个对象引用的有序队列,用中括号[]表示# 增加 a = [] a.append
- 本文实例讲述了php实现用于计算执行时间的类。分享给大家供大家参考。具体如下:有了这个php类,计算函数或者一段代码的执行时间就简单了<
- 在最近工作中,有一个需求,需要做一个表格,并且对该表格右键弹出菜单支持增删改,这里做下总结,功能截图如下:首先定义菜单结构<!-- 菜
- 本文介绍了保护MySQL数据库中重要数据受外部攻击的六个注意事项,以减少面临的风险。与自动的数据库备份不同,对系统管理员来说,保护数据免受未
- 本文实例讲述了Python基于opencv实现的简单画板功能。分享给大家供大家参考,具体如下:import cv2import numpy
- vue中form data形式传参vue项目中form data形式传参,需要在headers中添加如下代码headers: {  
- 由于微博的网页端有反爬虫,需要登录,所以我们换个思路,曲线救国。我们找到微博在浏览器上面用于手机端的调试的APL,如何找到呢?我这边直接附上
- 一、DSE算法背景介绍1. DES的采用1979年,美国银行协会批准使用1980年,美国国家标准局(ANSI)赞同DES作为私人使用的标准,
- 本文实例讲述了PHP实现的注册,登录及查询用户资料功能API接口。分享给大家供大家参考,具体如下:服务端<?phprequire
- Django是一种基于Python的Web开发框架一、在命令行中创建Django项目(Windows平台、python3.6)1、建立虚拟环
- mysqlcheck客户端工具可以检查和修复MyISAM表,还可以优化和分析表。实际上,它集成了mysql工具中check、repair、a
- 当数据库的数据量读写频繁的时候,我们就要考虑把数据库的读写分开,以提高数据库的使用效率,(当然还有其他用处比如,备份数据),这个时候我们就要
- 遇到这样一个需求,有一张表,要给这张表新增一个字段delta,delta的值等于每行的c1列的值减去上一行c1列的值。我的解决方案,可以通过
- 文本文件具备初步存放、编辑各类数据的能力,并可以持久保留和数据共享。1. 建立文件 建立文本文件有两种途径:一是通过Windows的“记事
- 随着MySQL数据库存储的数据逐渐变大,已经将原来的存储数据的空间占满了,导致mysql已经链接不上了。因此,必须要给存放的数据换个地方了。
- 本文实例为大家分享了JavaScript自定义日历效果的具体代码,供大家参考,具体内容如下实现思路:获取每个月的第一天是星期几,然后把前面的