刚开始学python时,大家都习惯用pymssql去读写SQLSERVER。但是实际使用过程中,pymssql的读写性能以及可靠性的确不如pyodbc来的好。
正如微软官方推荐使用pyodbc库,作为学习以及生产环境使用。参考链接 https://docs.microsoft.com/en-us/sql/connect/python/python-driver-for-sql-server?view=sql-server-2017
第一步、为pyodbc Python开发配置开发环境。
1、在Windows上安装Microsoft ODBC SQL Server驱动程序
window根据需要 安装
Download Microsoft ODBC Driver 17 for SQL Server (x64)
Download Microsoft ODBC Driver 17 for SQL Server (x86)
linux以centos为例
sudo su #Download appropriate package for the OS version #Choose only ONE of the following, corresponding to your OS version #RedHat Enterprise Server 6 curl https://packages.microsoft.com/config/rhel/6/prod.repo > /etc/yum.repos.d/mssql-release.repo #RedHat Enterprise Server 7 curl https://packages.microsoft.com/config/rhel/7/prod.repo > /etc/yum.repos.d/mssql-release.repo #RedHat Enterprise Server 8 and Oracle Linux 8 curl https://packages.microsoft.com/config/rhel/8/prod.repo > /etc/yum.repos.d/mssql-release.repo exit sudo yum remove unixODBC-utf16 unixODBC-utf16-devel #to avoid conflicts sudo ACCEPT_EULA=Y yum install msodbcsql17 # optional: for bcp and sqlcmd sudo ACCEPT_EULA=Y yum install mssql-tools echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc source ~/.bashrc # optional: for unixODBC development headers sudo yum install unixODBC-devel
完成odbc驱动的安装后,依赖环境就已经完成了
第二步、安装pyodbc
这个只要pip安装下就好了。
pip install pyodbc
第三步、如何使用pyodbc进行t-sql操作
1)简单查询
import pyodbc # Some other example server values are # server = 'localhostsqlexpress' # 实列名称 # server = 'myserver,port' # 如果实例是有特殊端口号的,默认1433 server = 'tcp:myserver.database.windows.net' database = 'mydb' username = 'myusername' password = 'mypassword' cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password) cursor = cnxn.cursor() cursor.execute("SELECT @@version;")
# 第一种
# rows = cursor.fetchall()
# for row in rows:
# print(row)
# 第二种
# for row in cursor:
# print(row)
# # 第三种
# row=cursor.fetchone()
# while row:
# print(row)
# row=cursor.fetchone()
2)执行操作
cursor.execute(""" INSERT INTO SalesLT.Product (Name, ProductNumber, StandardCost, ListPrice, SellStartDate) VALUES (?,?,?,?,?)""", 'SQL Server Express New 20', 'SQLEXPRESS New 20', 0, 0, CURRENT_TIMESTAMP) cnxn.commit() row = cursor.fetchone() while row: print('Inserted Product key is ' + str(row[0])) row = cursor.fetchone()
3)如何使用window验证
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';Trusted_Connection=yes)
第四步、利用c_mssql库
c_mssql库是一个对pyodbc的封装、刚开始是用pymssql进行SQLSERVER进行操作。
但是最近使用SSHTunnel 用跳板机进行SQLSERVER的连接时,线程的问题太严重,看了看官方文档微软现在都主推pyodbc了,那么我们也用pyodbc重新封装下吧。
可以快速读取数据库的数据
from c_mssql import DB_Config from c_mssql.mssql_source import Mssql_Source #配置一下需要读取的数据库 item_db_config=DB_Config(server='127.0.0.1',user="item_db",password="password",database="item_db",port=1433) item_db=Mssql_Source(item_db_config) #读取单值 print(item_db.get_value("SELECT GETDATE()")) #读取单行 print(item_db.get_rowdict("SELECT top 1 * from item")) #读取datalist print(item_db.get_datalist("SELECT * from item"))
利用拼接sql语句快速插入,不需要写sql语句,直接将datalist导入数据表中
from c_mssql import DB_Config from c_mssql.mssql_source import Mssql_Source from c_mssql.mssql_dst import Mssql_Dst item_db_config=DB_Config(server='127.0.0.1',user="item_db",password="!QAZwsx",database="item_db",port=1433) item_db=Mssql_Source(item_db_config) item_dst=Mssql_Dst(item_db) #source_data需要插入的数据 #dst_table 需要插入的表 #dst_title 需要插入的列 ,支持list和dict,也可以默认为None。 dict 是{"column":"类型"} #类型 ["string","binary","date","time","datetime","int","float","numeric","UUID","expression"] #source_title 是source的列。 #batch是一批导入多少行 item_dst.import_into_dst(source_data=[{"a":"aa","b":1}],dst_table="table_name",dst_title=None,source_title=None,batch=1000)