【Python連接數據庫】Python連接Teradata數據庫-ODBC方式(pyodbc包和teradata包)


1.安裝Python

Python下載地址:Python-3.6.8.tar.xz

(1)前置安裝包查看

rpm -qa |grep -i zlib
rpm -qa |grep -i bzip2
rpm -qa |grep -i ncurses
rpm -qa |grep -i readline
rpm -qa |grep -i openssl
rpm -qa |grep -i xz
rpm -qa |grep -i sqlite
rpm -qa |grep -i gdbm
rpm -qa |grep -i tk
rpm -qa |grep -i gcc     #非常重要,而且單獨安裝非常麻煩需要1-2h

(2)安裝Python

將安裝軟件上傳到/software目錄,執行如下語句安裝

mkdir -p /usr/local/python3
cd /software
xz -d Python-3.6.8.tar.xz
tar -xvf Python-3.6.8.tar
cd Python-3.6.8 
./configure --prefix=/usr/local/python3
make 
make install

(3)更新默認Python為新版本

ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip3

mv /usr/bin/python /usr/bin/python_bak_2.6.9
mv /usr/bin/pip /usr/bin/pip_bak_2.6.9

ln -s /usr/local/python3/bin/python3.6 /usr/bin/python
ln -s /usr/local/python3/bin/pip3.6 /usr/bin/pip

(4)驗證安裝

pip --version
python -v

2.使用ODBC+pyodbc連接TD數據庫

TeraGSS和tdicu(ODBC依賴包在TTU中):TeradataToolsAndUtilitiesBase__linux_indep.16.20.10.00.tar 

Teradata ODBC驅動下載地址:tdodbc1620__linux_indep.16.20.00.65-1.tar          其它版本下載地址: Windows   AIX 

2.1檢查是否安裝TeraGSS和tdicu

rpm -qa | grep -i GSS
rpm -qa | grep -i tdicu

如果沒有安裝,則使用TTU安裝上述組件(TeradataToolsAndUtilitiesBase__linux_indep.16.20.10.00.tar)。

特別說明:

除使用上述16版本TTU安裝方式外,也可以使用15版本的ODBC驅動包中含有的TERAGSS和tdicu獨立安裝包進行安裝(16版本ODBC驅動包不含獨立安裝包)。15版本的ODBC驅動下載地址為tdodbc__linux_indep.15.00.00.08-1.tar.gz

使用rpm -ivh 安裝相應的rpm包即可。

rpm -ivh TeraGSS_linux_x64-15.00.06.05-1.noarch.rpm
rpm -ivh tdicu-15.00.00.00-1.noarch.rpm

2.2 安裝Teradata的ODBC驅動

將安裝軟件tdodbc1620__linux_indep.16.20.00.65-1.tar上傳到/software目錄,執行如下語句安裝(如果odbc已經安裝完畢則跳過如下安裝步驟,或者卸載當前版本后安裝新版本)

rpm -qa | grep -i odbc  #驗證是否安裝tdodbc

cd /software
tar -xvf tdodbc1620__linux_indep.16.20.00.65-1.tar
cd tdodbc1620/
rpm -ivh tdodbc1620-16.20.00.65-1.noarch.rpm --nodeps
rpm -qa | grep -i tdodbc
   tdodbc-16.20.00.65-1

rpm -e tdodbc-16.20.00.65-1   #卸載tdodbc

ODBC安裝完畢后,會在teradata安裝目錄/opt/teradata/client/16.20下出現兩個目錄odbc_32和odbc_64,分別為32位和64位驅動。

64位驅動路徑(每個版本不同可查看odbc.ini中Driver):/opt/teradata/client/16.20/odbc_64/lib/tdataodbc_sb64.so
32位驅動路徑(每個版本不同可查看odbc.ini中Driver):/opt/teradata/client/16.20/odbc_32/lib/tdataodbc_sb32.so

64位odbc.ini模板位置:/opt/teradata/client/16.20/odbc_64/odbc.ini
64位odbcinst.ini模板位置: /opt/teradata/client/16.20/odbc_64/odbcinst.ini

32位odbc.ini模板位置:/opt/teradata/client/16.20/odbc_32/odbc.ini
32位odbcinst.ini模板位置: /opt/teradata/client/16.20/odbc_32/odbcinst.ini

2.3 安裝pyodbc

Python連接ODBC模塊下載地址:pyodbc-4.0.26.tar.gz    其它版本下載地址:pyodbc 4.0.26 

(1)將安裝軟件上傳到/software目錄,執行如下語句安裝

cd /software
tar -zxvf pyodbc-4.0.26.tar.gz
cd pyodbc-4.0.26

(2)編輯安裝配置

vi setup.py
# Other posix-like: Linux, Solaris, etc.
# Python functions take a lot of 'char *' that really should be const. gcc complains about this *a lot*
   settings['extra_compile_args'].append('-Wno-write-strings')

改變為(紅色字體16.20,根據odbc的版本不同而有所改動)(盡量在原有基礎上去改動,不要兩行一起復制粘貼,否則會報格式問題,注意Python是使用tab鍵控制層次)

# Other posix-like: Linux, Solaris, etc.
# Python functions take a lot of 'char *' that really should be const. gcc complains about this *a lot*
settings['extra_compile_args']=['-Wno-write-strings','-I/opt/teradata/client/16.20/odbc_64/include','-DSQL_CP_ONE_PER_HENV=2']
settings['extra_link_args']=['-L/opt/teradata/client/16.20/odbc_64/lib']

(3)安裝pyodbc

python setup.py build
python setup.py install

(4)驗證安裝

#查看如下目錄中有pyodbc目錄則安裝成功
[root@localhost] ll /usr/local/python3/lib/python3.6/site-packages
[root@localhost]$ python
>>> import pyodbc
>>> pyodbc.apilevel
  '2.0'

 2.4 配置ODBC並使用pyodbc連接數據庫

2.4.1 直接使用DRIVER的連接方式(不使用DSN,僅配置odbcinst.ini文件即可,無需配置odbc.ini)

connection=pyodbc.connect('DRIVER={Teradata Database ODBC Driver 16.20};DBCNAME=192.168.253.131;UID=dbc;PWD=dbc;QUIETMODE=YES;')

配置步驟如下:

(1)查看並拷貝odbcinst.ini模板到當前用戶根目錄,並改名稱為隱藏文件.odbcinst.ini

updatedb             #創建或更新slocate命令所必需的數據庫文件,執行時間可能會很長
locate odbcinst.ini  #查看odbcinst模板位置
cp /opt/teradata/client/16.20/odbc_64/odbcinst.ini ~/.odbcinst.ini

(2)odbcinst.ini配置樣例

 如下ODBC注冊配置文件odbcinst.ini中可以看到,可以使用的Driver名稱為Teradata Database ODBC Driver 16.20(可以根據實際情況自行改動此名稱,連接數據庫時DRIVER同步更改即可)。

[ODBC Drivers]
Teradata Database ODBC Driver 16.20=Installed

[Teradata Database ODBC Driver 16.20]
Description=Teradata Database ODBC Driver 16.20
Driver=/opt/teradata/client/16.20/odbc_64/lib/tdataodbc_sb64.so
# Note: Currently, Data Direct Driver Manager does not support Connection Pooling feature.
CPTimeout=60

(3)連接數據庫樣例(test_pyodbc.py)

# import pyodbc module
import pyodbc

# disable connection pooling
pyodbc.pooling = False

# create connection
connection=pyodbc.connect('DRIVER={Teradata Database ODBC Driver 16.20};DBCNAME=192.168.253.131;UID=dbc;PWD=dbc;QUIETMODE=YES;') # enable auto commit
connection.autocommit = True;

# python 3.x connect Teradata set charset(如果不設置此字符集,數據庫連接無問題,但是執行SQL會無法執行)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
#connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le')
connection.setencoding(encoding='utf-8')

# print driver and database info
print ('-ODBC version        =',connection.getinfo(10))
print ('-DBMS name           =',connection.getinfo(17))
print ('-DBMS version        =',connection.getinfo(18))
print ('-Driver name         =',connection.getinfo(6))
print ('-Driver version      =',connection.getinfo(7))
print ('-Driver ODBC version =',connection.getinfo(77))

#disconnect
connection.close()

(4)執行結果

 2.4.2 使用DSN數據源配置的連接方式(僅配置odbc.ini文件即可,無需配置odbcinst.ini)

connection=pyodbc.connect('DSN=testdsn;UID=dbc;PWD=dbc;QUIETMODE=YES;')  #DSN中沒有配置了連接數據庫用戶名和口令

connection=pyodbc.connect('DSN=testdsn;QUIETMODE=YES;') #DSN中配置了連接數據庫用戶名和口令

配置步驟如下:

(1)查看並拷貝odbc.ini模板到當前用戶根目錄,並改名稱為隱藏文件.odbc.ini

updatedb          #創建或更新slocate命令所必需的數據庫文件,執行時間可能會很長
locate odbc.ini   #查看odbc模板位置
cp /opt/teradata/client/16.20/odbc_64/odbc.ini ~/.odbc.ini

(2)odbc.ini配置樣例

 如下ODBC的DSN文件odbc.ini中可以看到,可以使用的DSN名稱為testdsn(可以根據實際情況自行改動此名稱,連接數據庫時DSN值同步更改即可)。

[ODBC]
# For Data Direct to load its error messages
# Data Direct Driver Manager looks for the messages here:
# "/opt/teradata/client/16.20/locale/xx_xx/LC_MESSAGES/"
InstallDir=/opt/teradata/client/16.20/odbc_64
Trace=0
TraceDll=/opt/teradata/client/16.20/odbc_64/lib/odbctrac.so
TraceFile=/usr/joe/odbcusr/trace.log
TraceAutoStop=0

[ODBC Data Sources]
testdsn=tdata.so

[testdsn]
# This key is not necessary and is only to give a description of the data source.
Description=Teradata Database ODBC Driver 16.20

# Driver: The location where the ODBC driver is installed to.
Driver=/opt/teradata/client/16.20/odbc_64/lib/tdataodbc_sb64.so

# Required: These values can also be specified in the connection string.
DBCName=192.168.253.131 UID= PWD=
CharacterSet=UTF8

# Optional
AccountString=
DatasourceDNSEntries=
DateTimeFormat=AAA
DefaultDatabase=
DontUseHelpDatabase=0
DontUseTitles=1
EnableExtendedStmtInfo=1
EnableReadAhead=1
IgnoreODBCSearchPattern=0
LogErrorEvents=0
LoginTimeout=20
MaxRespSize=65536
MaxSingleLOBBytes=4000
MaxTotalLOBBytesPerRow=65536
MechanismName=
NoScan=0
PrintOption=N
retryOnEINTR=1
ReturnGeneratedKeys=N
SessionMode=System Default
SplOption=Y
TABLEQUALIFIER=0
TCPNoDelay=1
TdmstPortNumber=1025
UPTMode=Not set
USE2XAPPCUSTOMCATALOGMODE=0
UseDataEncryption=0
UseDateDataForTimeStampParams=0
USEINTEGRATEDSECURITY=0
UseSequentialRetrievalOnly=0
UseXViews=0
EnableUDFUpload=0
UDFUploadPath=

 (3)連接數據庫樣例(test_pyodbc_dsn.py)

# import pyodbc module
import pyodbc

# disable connection pooling
pyodbc.pooling = False

# create connection
#connection=pyodbc.connect('DSN=testdsn;UID=dbc;PWD=dbc;QUIETMODE=YES;') #DSN中未設定UID and PWD 
connection=pyodbc.connect('DSN=testdsn;QUIETMODE=YES;')                  #DSN中設定了UID and PWD 

# enable auto commit
connection.autocommit = True;

# python 3.x connect Teradata set charset(如果不設置此字符集,數據庫連接無問題,但是執行SQL會無法執行)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
#connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le')
connection.setencoding(encoding='utf-8')

# print driver and database info
print ('-ODBC version        =',connection.getinfo(10))
print ('-DBMS name           =',connection.getinfo(17))
print ('-DBMS version        =',connection.getinfo(18))
print ('-Driver name         =',connection.getinfo(6))
print ('-Driver version      =',connection.getinfo(7))
print ('-Driver ODBC version =',connection.getinfo(77))

#disconnect
connection.close()

(4)執行結果

 2.5 使用pyodbc執行SQL

2.5.1操作流程

獲取連接對象==>創建游標==>執行SQL==>獲取結果==>關閉游標==>關閉數據庫連接

# import pyodbc module
import pyodbc

# disable connection pooling
pyodbc.pooling = False

# create connection
#connection=pyodbc.connect('DRIVER={Teradata Database ODBC Driver 16.20};DBCNAME=192.168.253.131;UID=dbc;PWD=dbc;QUIETMODE=YES;') #使用DRIVER方式連接
#connection=pyodbc.connect('DSN=testdsn;UID=dbc;PWD=dbc;QUIETMODE=YES;') #使用DSN方式連接,DSN中未設定UID and PWD 
connection=pyodbc.connect('DSN=testdsn;QUIETMODE=YES;')                  #使用DSN方式連接,DSN中設定了UID and PWD 

# enable auto commit
connection.autocommit = True;

# python 3.x connect Teradata set charset(如果不設置此字符集,數據庫連接無問題,但是執行SQL會無法執行)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
#connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le')
connection.setencoding(encoding='utf-8')

# create cursor
cursor = connection.cursor()

# fetch result
cursor.execute("select * from dbc.dbcinfov")
rows=cursor.fetchall()
for row in rows:
        print(row)


# close cursor
cursor.close()

#disconnect
connection.close()

2.5.2常用操作函數

(1)連接對象

close()  關閉數據庫連接

commit()  提交事務

rollback()  回滾事務

cursor()   獲取游標對象,操作數據庫,如執行DML操作,調用存儲過程等

(2)游標對象

close() 關閉當前游標

execute("SQL") 執行數據庫操作,SQL語句或者數據庫命令,其中SQL為執行語句

fetchone()   獲取查詢結果集中下一條記錄

fetchmany(n)  獲取結果集指定數量n條記錄

fetchall()    獲取結果集所有記錄

2.5.3 經典實例

 在數據庫testbase中,創建數據庫表books,插入數據后,查詢插入數據。

# import pyodbc module
import sys
import pyodbc

print(sys.getdefaultencoding())

# disable connection pooling
pyodbc.pooling = False

# create connection
#connection=pyodbc.connect('DRIVER={Teradata Database ODBC Driver 16.20};DBCNAME=192.168.253.131;UID=dbc;PWD=dbc;QUIETMODE=YES;') #使用DRIVER方式連接
#connection=pyodbc.connect('DSN=testdsn;UID=dbc;PWD=dbc;QUIETMODE=YES;') #使用DSN方式連接,DSN中未設定UID and PWD 
connection=pyodbc.connect('DSN=testdsn;QUIETMODE=YES;')                  #使用DSN方式連接,DSN中設定了UID and PWD 

# enable auto commit
connection.autocommit = True;

# python 3.x connect Teradata set charset(如果不設置此字符集,數據庫連接無問題,但是執行SQL會無法執行)
connection.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
connection.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
#connection.setdecoding(pyodbc.SQL_WMETADATA, encoding='utf-32le')
connection.setencoding(encoding='utf-8')


# print driver and database info
print ('-ODBC version        =',connection.getinfo(10))
print ('-DBMS name           =',connection.getinfo(17))
print ('-DBMS version        =',connection.getinfo(18))
print ('-Driver name         =',connection.getinfo(6))
print ('-Driver version      =',connection.getinfo(7))
print ('-Driver ODBC version =',connection.getinfo(77))

# create cursor
cursor = connection.cursor()

# execute SQL statement (create table books)
cursor.execute("DROP TABLE testbase.books")
cursor.execute("CREATE MULTISET TABLE testbase.books (book_name VARCHAR(50) NOT NULL, category VARCHAR(50) NOT NULL, price INTEGER,publish_time date NOT NULL)")

try:
    #execute SQL, instert records
    cursor.execute("insert into testbase.books(book_name,category,price,publish_time) values('Python3.6.8','Python','79.80','2018-05-20')")
    # commit data
    connection.commit()
except:
    #rollback when error
    connection.rollback()
    print("insert error data rollback")

cursor.execute("select book_name,category from testbase.books")
# fetch result set rows
for row in cursor:
    print(row)

# close cursor
cursor.close()

#disconnect
connection.close()

3.使用ODBC+Teradata Python Module連接TD數據庫(已停止更新,不建議使用)

teradata python模塊包括兩個子模塊,它們實現了Python Database API規范v2.0,一個使用rest(teradata.tdrest),另一個使用odbc(teradata.tdbc)。盡管這些模塊可直接被訪問,但建議使用基本的UdaExec模塊,因為它提供了所有額外的支持DevOps的功能。

(1)下載安裝Teradata Python Module

下載地址:teradata-15.10.0.21.tar.gz  其它版本

將下載的安裝包teradata-15.10.0.21.tar.gz拷貝到/software目錄下。

#安裝
cd /software
tar -zxvf teradata-15.10.0.21.tar.gz 
cd teradata-15.10.0.21
setup.py install
#驗證 ll /usr/local/python3/lib/python3.6/site-packages/ 查看是否有teradata-15.10.0.21-py3.6.egg目錄,有則說明安裝成功。

(2)使用Teradata Python Module連接數據庫

test_tdmodule.py腳本如下(需配置好odbcinst.ini,配置方法詳見上文):

#!/usr/bin/python
# encoding=utf-8
import teradata
udaExec = teradata.UdaExec (appName="HelloWorld", version="1.0",logConsole=False)
session = udaExec.connect(method="odbc", system="192.168.253.131",username="dbc", password="dbc");
for row in session.execute("SEL * FROM DBC.dbcinfov"):
    print(row)

執行結果如下:

 

參考文檔(Python安裝)

Python開發環境搭建

參考文檔(pyodbc包連接Teradata數據庫):

Python with Teradata ODBC()

linux下安裝teradata odbc驅動

 pyodbc Connecting to Teradata

python連接Teradata數據庫

pyodbc訪問數據庫(python ODBC訪問數據庫)

 參考文檔(teradata包連接Teradata數據庫):

linux下python連接Teradata

Teradata Python Module


免責聲明!

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



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