Python连接SQL Server数据库

相关介绍

安装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()

 

上一篇:EXT Grid celleditor列编辑,动态控制某一单元格只读


下一篇:基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端