宝塔服务器面板,一键全能部署及管理,送你10850元礼包,点我领取

刚开始学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根据需要 安装

python操作数据库-SQLSERVER-pyodbc-风君子博客 Download Microsoft ODBC Driver 17 for SQL Server (x64)
Download Download Microsoft ODBC Driver 17 for SQL Server (x86)

linux以centos为例

参考链接 https://docs.microsoft.com/en-us/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

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)