相关介绍
安装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() 关闭连接
连接数据库
常规连接
import pymssql 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() 来访问它,这样一来,程序的安全性便有了很大的提高 def connect_DB(): def get_DB_configuration(): Lines=[] with open('conn.txt','r',encoding='utf-8') as f: for line in f: Lines.append(line) servername,username,password,db = Lines[0],Lines[1],Lines[2],Lines[3] dic ="as_dict=True" char="charset='utf8'" return servername,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 in cur: 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()
关闭游标和连接可以使用以下语句
if cur: cur.close() if conn: conn.close()