相关介绍
安装pymssql,需安装2005版本以上的SQL Server
pip install pymssql
pymssql使用较为简单
使用 pymssql.connect(server,user,password,database) 创建连接对象;
使用 connection.cursor() 获取连接的游标对象,与数据库的各种交互基本都在游标上执行,一个连接一次只能有一个游标的查询处于活跃状态;
使用 cursor.executeXXX() 执行SQL语句,使用 cursor.fetchXXX()获取查询结果 获取查询结果,可以一次获取所有数据,一次获取一行数据;
如果对数据库中数据进行了修改,需使用 connection.commit() 提交结果,否则数据库内的数据不会有变化
使用 connection.close() 关闭连接
连接数据库
常规连接
importpymssql
server="localhost"user=""password=""database=""conn= pymssql.connect(server,user,password,database,as_dict=True,charset='utf8')#as_dict 设置返回数据类型为字典,否则为元组 ,返回字典类型便于转成DataFrame类型#charset 设置数据库的字符集
cur = conn.cursor()
用嵌套函数连接数据库
以明文的形式定义数据库连接在程序中非常简便,但隐私性相对弱。而Python函数的一大特性就是Python支持函数的嵌套,就是指函数里又有函数。
函数的嵌套,主要有下面两个方面的作用
函数的嵌套能保证内部函数的隐私。内部函数只能被外部函数所调用和访问,不会暴露在全局作用域,因此,如果你的函数内部有一些隐私数据(比如数据库的用户、密码等),不想暴露在外,那你就可以使用函数的的嵌套,将其封装在内部函数中,只通过外部函数来访问。
合理的使用函数嵌套,能够提高程序的运行效率
#这里的函数 get_DB_configuration,便是内部函数,它无法在#connect_DB() 函数以外被单独调用。我们只能通过调用外部函数#connect_DB() 来访问它,这样一来,程序的安全性便有了很大的提高
defconnect_DB():defget_DB_configuration():
Lines=[]
with open('conn.txt','r',encoding='utf-8') as f:for line inf:
Lines.append(line)
servername,username,password,db= Lines[0],Lines[1],Lines[2],Lines[3]
dic="as_dict=True"char="charset='utf8'"
returnservername,username, password,db,dic,char
conn=pymssql.connect(get_DB_configuration())return conn
查询与获取数据
#创建游标,用以对数据库进行操作
cur =conn.cursor()#下面编写SQL语句,多行文本用三个引号
sql_difftime = '''SELECT * FROM(
SELECT IC.id,IC.card,IC.time AS ICTIME,
GPS.gmtTime AS GPSTIME, DATEPART(HH,IC.time) AS IC_Hour,
ABS(DATEDIFF(ss,IC.time,gmtTime)) AS DIFFTIME,GPS.stationSeqNum
FROM GPS INNER JOIN IC ON GPS.srcAddr = IC.car_id
) AS TEMP
WHERE DIFFTIME<301
order by id,DIFFTIME'''
#执行查询语句
cur.execute(sql_difftime)#获取查询数据,每条数据以字典形式返回
data =cur.fetchall()#将数据转化为Dataframe类型
df =pd.DataFrame(data)#关闭游标
cur.close()
编写查询语句时,可能会需要格式控制输出
sql_var = '''SELECT [gps_id],[longitude],[latitude],[gps_time],[direction],[amap_line],[gps_date]
FROM [GAODE_BUS].[dbo].[wangjing.gps]
WHERE [gps_date]={date_number} AND[amap_line]='{line_number}'
ORDER BY [gps_id] DESC ,[gps_time]'''.format(date_number=gps_date_list[jj],line_number=amap_line_list[ii])#采用格式控制输出,在语句中,用{}进行占位#用.format进行数据控制
获取数据主要用 cur.fetchXXX()进行 ,下面进行详细讲解
#可以使用for循环迭代查询结果
for row incur:print(row)#只取表中第一条数据
cur.fetchone()#显示多条数据
cur.fetchmany(5)#取全部数据
cur.fetchall()
修改数据库中的数据
#插入多条记录用 cur.executemany()
cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)",
[(1, 'John Smith', 'John Doe'),
(2, 'Jane Doe', 'Joe Dog'),
(3, 'Mike T.', 'Sarah H.')])#记得进行提交
conn.commit()
关闭游标和连接可以使用以下语句
ifcur:
cur.close()ifconn:
conn.close()