python操作數據庫-SQLSERVER-pyodbc


剛開始學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 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#redhat17

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 = 'localhost\sqlexpress' # 實列名稱
# 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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM