使用pymssql模块操作SQL Server数据库

一,连接数据库

使用pymssql连接SQL Server数据库,首先创建连接和游标:


import pymssql

conn = pymssql.connect(host='host',user='user',password='pwd',database='db_name')
cursor = conn.cursor()



1,行的格式

当执行select语句获取数据时,返回的数据行有两种格式:元组和字典,行的默认格式是元组。pymssql返回的数据集的格式是在创建游标时设置的,当参数 as_dict为True时,返回的行是字典格式,该参数的默认值是False,因此,默认的行格式是元组。



cursor = conn.cursor(as_dict=True)



2,执行查询

使用游标执行SQL语句



cursor.execute("sql statement")



3,提交事务

当执行更新操作时,需要显式调用 commit()函数来提交事务:



conn.commit()



如果事务执行失败,可以回滚事务:



conn.rollback()



4,关闭连接,释放资源



conn.close()



二,更新数据

对数据库有查询,更新和新增操作,在更新和插入数据时,需要显式提交事务。当需要更新数据时,调用游标的execute()函数执行SQL命令来实现:



Cursor.execute(operation)
Cursor.execute(operation, params)



如果要在一个事务中执行多条SQL命令,可以调用游标的executemany()函数:



Cursor.executemany(operation, params_seq)



1,执行数据更新和删除

通过游标的execute()函数来执行TSQL语句,调用 commit() 来提交事务



cursor.execute("""
sql statement
""")  

conn.commit()



2,执行数据的多行插入

如果需要插入多条记录,可以使用游标的executemany()函数,该函数包含模板SQL 命令和一个格式化的参数列表,用于在一条事务中插入多条记录:



args=[(1, 'John Smith', 'John Doe'),
     (2, 'Jane Doe', 'Joe Dog'),
     (3, 'Mike T.', 'Sarah H.')]

cursor.executemany("INSERT INTO persons VALUES (%d, %s, %s)", args )
conn.commit()



三,遍历数据

当从SQL Server数据库中获取数据时,可以使用fetchone()从结果集中提取一条记录,使用fetchmany()从结果集中提取多条记录,或使用fetchall()提取全部结果集:



cursor.fetchone()           # return a row (a tuple or a dict) if as_dict was passed to pymssql.connect()
cursor.fetchmany(size=None) # return a list of tuples or dicts if as_dict was passed to pymssql.connect() 
cursor.fetchall()           # return a list of tuples or dicts if as_dict was passed to pymssql.connect()



由于游标是一个迭代器,因此,可以使用for语句以迭代方式逐行处理查询的结果集。



for row in cursor:



1,以元组方式遍历数据

返回的结果集中,每一行都是一个元组:



cursor=connect.cursor()
cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
for row in cursor:
    print('row = %r' % (row,))



2,以字典方式遍历数据

返回的结果集,每一行是一个字典结构:



cursor = conn.cursor(as_dict=True)
 cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
 for row in cursor:
     print("ID=%d, Name=%s" % (row['id'], row['name']))



四,关闭连接

在一个连接中,可以提交多个事务,当查询完成之后,一定要关闭连接:



conn.close()



通常情况下,使用with来自动关闭连接:



import pymssql 
 
with pymssql.connect(server, user, password, "db_name") as conn:
    with conn.cursor(as_dict=True) as cursor:  
        cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')
        for row in cursor:
            print("ID=%d, Name=%s" % (row['id'], row['name']))



 

参考文档:

pymssql reference

Python中从SQL型数据库读写dataframe型数据