python调用sql数据库_Python操作MSSQL

本文介绍了如何使用Python的pymssql模块连接和操作SQLServer数据库,包括安装步骤、游标使用注意事项、查询结果的处理方式,以及通过with语句进行资源管理。示例代码详细展示了如何执行查询、非查询操作和批量插入数据。
摘要由CSDN通过智能技术生成

Python 操作SQLServer 需要使用 pymssql 模块,使用pip install pymssql安装。然后import该包即可。安装成功后,使用如下语句和 MSSql 数据库交互。

下载 FreeTDS,地址:www.freetds.org

下载后解压: tar -zxvf XXX.tar.gz

然后执行

./configure --prefix=/usr/local/freetds --with-tdsver=7.1 --enable-msdblib

make

make install

示例代码(游标使用注意事项):

import pymssql

# 可以进入 connect 方法里面查看更多参数

conn=pymssql.connect(server='192.168.0.110', port=9526, user='sa', password='pwd', database='test')

# 游标使用注意事项

# 一个连接一次只能有一个游标的查询处于活跃状态,如下:

cursor_1 = conn.cursor()

cursor_1.execute('SELECT * FROM persons')

cursor_2 = conn.cursor()

cursor_2.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

print( "all persons" )

print( cursor_1.fetchall() ) # 显示出的是cursor_2游标查询出来的结果

print( "John Doe" )

print( cursor_2.fetchall() ) # 不会有任何结果

为了避免上述的问题可以使用以下两种方式:

1. 创建多个连接来保证多个查询可以并行执行在不同连接的游标上

2. 使用fetchall方法获取到游标查询结果之后再执行下一个查询,

示例如下:

c1.execute('SELECT ...')

c1_list = c1.fetchall()

c2.execute('SELECT ...')

c2_list = c2.fetchall()

游标返回字典变量

上述例子中游标获取的查询结果的每一行为元组类型,

可以通过在创建游标时指定as_dict参数来使游标返回字典变量,

字典中的键为数据表的列名

import pymssql

# 可以进入 connect 方法里面查看更多参数

conn = pymssql.connect(server, user, password, database) # 可以在连接时指定参数 as_dict=True

cursor = conn.cursor(as_dict=True) # 也可以在创建游标时指定参数 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']))

cursor.close()

conn.close()

使用with语句(上下文管理器)

可以通过使用with语句来省去显示的调用close方法关闭连接和游标

import pymssql

with pymssql.connect(server, user, password, database) 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']))

简单使用示例:

import pymssql

conn = pymssql.connect(server, user, password, database)

cur=conn.cursor()

cur.execute('select top 5 * from [dbo].[Dim_Area]')

# 如果 update/delete/insert 记得要 conn.commit() ,否则数据库事务无法提交

# 如果没有指定autocommit属性为True的话就需要调用commit()方法

# conn.commit()

print (cur.fetchall())

cur.close()

cursor = conn.cursor()

cursor.executemany(

"INSERT INTO persons VALUES (%d, %s, %s)",

[(1, 'John Smith', 'John Doe'),

(2, 'Jane Doe', 'Joe Dog'),

(3, 'Mike T.', 'Sarah H.')])

# 如果没有指定autocommit属性为True的话就需要调用commit()方法

conn.commit()

# 查询操作

cursor.execute('SELECT * FROM persons WHERE salesrep=%s', 'John Doe')

row = cursor.fetchone()

while row:

print("ID=%d, Name=%s" % (row[0], row[1]))

row = cursor.fetchone()

# 也可以使用for循环来迭代查询结果

# for row in cursor:

# print("ID=%d, Name=%s" % (row[0], row[1]))

# 关闭连接

conn.close()

示例代码:

#!/usr/bin/python3

# -*- coding: utf-8 -*-

import pymssql

db_host = '192.168.0.5'

db_port = '9526'

db_user = 'test'

db_pwd = 'test'

db_name = 'TestDB'

tb_name = 'TestTB'

class SqlServerOperate(object):

def __init__(self, server, port, user, password, db_name):

self.server = server

self.port = port

self.user = user

self.password = password

self.db_name = db_name

pass

def __del__(self):

# 其他地方不关闭连接,可以在这个地方统一关闭

# self.conn.close()

pass

def __get_connect(self):

self.conn = pymssql.connect(

server=self.server,

port=self.port,

user=self.user,

password=self.password,

database=self.db_name,

as_dict=True,

charset="utf8"

)

cur = self.conn.cursor()

if not cur:

raise (NameError, "连接数据库失败")

else:

return cur

def exec_query(self, sql):

cur = self.__get_connect()

cur.execute(sql)

result_list = list(cur.fetchall())

self.conn.close() # 查询完毕后必须关闭连接

# 使用with语句(上下文管理器)来省去显式的调用close方法关闭连接和游标

print('****************使用 with 语句******************')

with self.__get_connect() as cur:

cur.execute(sql)

val = list(cur.fetchall()) # 把游标执行后的结果转换成 list

print(val)

return result_list

def exec_non_query(self, sql):

cur = self.__get_connect()

cur.execute(sql)

self.conn.commit()

self.conn.close() # 完毕后必须关闭连接

def test():

ms = SqlServerOperate(db_host, db_port, db_user, db_pwd, db_name)

sql_string = "select * from SpiderItem where ResourceType = 20"

temp_result_list = ms.exec_query(sql_string)

for i in temp_result_list:

print(i)

pass

if __name__ == "__main__":

test()

pass

改进版:

#!/usr/bin/python3

# -*- coding: utf-8 -*-

# @Author :

# @File : mongodboperate.py

# @Software : PyCharm

# @description :

import pymssql

db_host = '192.168.0.5'

db_port = '9526'

db_user = 'test'

db_pwd = 'test'

db_name = 'TestDB'

tb_name = 'TestTB'

class SqlServerOperate(object):

def __init__(self, server, port, user, password, db_name, as_dict=True):

self.server = server

self.port = port

self.user = user

self.password = password

self.db_name = db_name

self.conn = self.get_connect(as_dict=as_dict)

pass

def __del__(self):

self.conn.close()

def get_connect(self, as_dict=True):

conn = pymssql.connect(

server=self.server,

port=self.port,

user=self.user,

password=self.password,

database=self.db_name,

as_dict=as_dict,

charset="utf8"

)

return conn

def exec_query(self, sql):

cur = self.conn.cursor()

cur.execute(sql)

result_list = list(cur.fetchall())

cur.close()

# 使用with语句(上下文管理器)来省去显式的调用close方法关闭连接和游标

# print('****************使用 with 语句******************')

# with self.get_connect() as cur:

# cur.execute(sql)

# result_list = list(cur.fetchall()) # 把游标执行后的结果转换成 list

# # print(result_list)

return result_list

def exec_non_query(self, sql, params=None):

cur = self.conn.cursor()

# cur.execute(sql, params=params)

cur.execute(sql, params=params)

self.conn.commit()

cur.close()

def exec_mutil_sql(self, sql, data_list):

"""

执行一次 sql, 批量插入多条数据

:param sql: 参数用 %s 代替 : insert into table_name(col1, col2, col3) values(%s, %s, %s)

:param data_list: list类型, list中每个元素都是元组

:return:

"""

cur = self.conn.cursor()

cur.executemany(sql, data_list)

self.conn.commit()

cur.close()

def test():

ms = SqlServerOperate(db_host, db_port, db_user, db_pwd, db_name)

sql_string = "select * from SpiderItem where ResourceType = 20"

temp_result_list = ms.exec_query(sql_string)

for i in temp_result_list:

print(i)

pass

if __name__ == "__main__":

test()

pass

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值