[英]How do I access AS/400 using SQLAlchemy?
簡短版: 請告訴我如何通過SQLAlchemy連接到AS / 400。
長版
我的最終目標是將來自SQL Server和AS / 400的數據連接到Flask Python應用程序中進行顯示。 我的方法是將每個數據庫中的數據放入Pandas數據幀中,然后可以將其連接並以JSON輸出。 如果有人有更好的方法,請隨時發表評論。 我嘗試執行此操作的方式的問題是Pandas.read_sql_query()
依賴於SQLAlchemy, Pandas.read_sql_query()
證明使SQLAlchemy與AS / 400一起使用非常困難。
pyodbc
和ibm_db_sa
。 沒有sqlalchemy
, pyodbc
可以正常工作:
CONNECTION_STRING = (
"driver={iSeries Access ODBC Driver};"
"system=ip_address;"
"database=database_name;"
"uid=username;"
"pwd=password;"
)
pyodbc.connect(CONNECTION_STRING)
# Queries work fine after this.
我已經閱讀了這些資源,並嘗試應用它們的技術:
以下是我收集的一些失敗嘗試和相應的錯誤消息。 我不知道在第一部分要輸入什么(“ something+something//...
”),要指定哪個端口(446?8471?其他?什么都沒有?),是使用服務器的名稱還是IP地址? ,或者是否對create_engine()
使用連接字符串樣式參數,所以我一直在嘗試可以想到的每種組合。 我嘗試按照上面第二個鏈接中的建議修改AS400Dialect_pyodbc
類,然后嘗試重新運行一些失敗的嘗試。 我可能會繼續嘗試,但此時我只是在轉動輪子。
from sqlalchemy import create_engine
CONNECTION_STRING = (
"driver={iSeries Access ODBC Driver};"
"system=ip_address;"
"database=database_name;"
"uid=username;"
"pwd=password;"
)
create_engine('ibm_db_sa+pyodbc://username:password@ip_address:446/database_name').connect()
發生異常:sqlalchemy.exc.InterfaceError(pyodbc.InterfaceError)('IM002',u'[IM002] [Microsoft] [ODBC驅動程序管理器]數據源名稱未找到,未指定默認驅動程序(0)(SQLDriverConnect)') (此錯誤的背景位於: http : //sqlalche.me/e/rvf5 ),文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”,第43行,在
create_engine('ibm_db_sa://username:password@ip_address:446/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30061N在遠程節點上找不到數據庫別名或數據庫名稱“ database_name”。 SQLSTATE = 08004 \\ r SQLCODE = -30061(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”,第43行,
create_engine('ibm_db_sa://username:password@server_name:446/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL1336N找不到遠程主機“ server_name”。 SQLSTATE = 08001 \\ r SQLCODE = -1336(此錯誤的背景位於: http ://sqlalche.me/e/e3q8create_engine('ibm_db_sa:// username:password @ ip_address:446 / server_name.database_name').connect()
create_engine('ibm_db_sa://username:password@ip_address:446/server_name.database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30061N在遠程節點上找不到數據庫別名或數據庫名稱“ server_name.database_name”。 SQLSTATE = 08004 \\ r SQLCODE = -30061(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)
create_engine('db2+ibm_db://username:password@ip_address:446/server_name.database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30061N在遠程節點上找不到數據庫別名或數據庫名稱“ server_name.database_name”。 SQLSTATE = 08004 \\ r SQLCODE = -30061(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”的第45行,在
create_engine('db2+ibm_db://username:password@ip_address:446/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30061N在遠程節點上找不到數據庫別名或數據庫名稱“ database_name”。 SQLSTATE = 08004 \\ r SQLCODE = -30061(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”的第45行,在
create_engine('db2+ibm_db://username:password@ip_address/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30081N已檢測到通信錯誤。 使用的通信協議:“ TCP / IP”。 使用的通信API:“ SOCKETS”。 檢測到錯誤的位置:“ ip_address”。 通訊功能檢測到錯誤:“連接”。 協議特定的錯誤代碼:“ 10061”,“ ”,“ ”。 SQLSTATE = 08001 \\ r SQLCODE = -30081(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)
create_engine('db2+ibm_db://username:password@server_name:446/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL1336N找不到遠程主機“ server_name”。 SQLSTATE = 08001 \\ r SQLCODE = -1336(此錯誤的背景位於: http : //sqlalche.me/e/e3q8 )
create_engine('db2+ibm_db://username:password@server_name/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL1336N找不到遠程主機“ server_name”。 SQLSTATE = 08001 \\ r SQLCODE = -1336(此錯誤的背景位於: http : //sqlalche.me/e/e3q8 )
create_engine('db2+pyodbc://username:password@ip_address:446/database_name').connect()
發生異常:sqlalchemy.exc.InterfaceError(pyodbc.InterfaceError)('IM002',u'[IM002] [Microsoft] [ODBC驅動程序管理器]數據源名稱未找到,未指定默認驅動程序(0)(SQLDriverConnect)') (此錯誤的背景位於: http : //sqlalche.me/e/rvf5 ),文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”,第45行,在
create_engine('db2://username:password@ip_address:446/database_name').connect()
發生異常:sqlalchemy.exc.OperationalError(ibm_db_dbi.OperationalError)ibm_db_dbi :: OperationalError:[IBM] [CLI驅動程序] SQL30061N在遠程節點上找不到數據庫別名或數據庫名稱“ database_name”。 SQLSTATE = 08004 \\ r SQLCODE = -30061(此錯誤的背景位於: http ://sqlalche.me/e/e3q8)文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”的第45行,在
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(quoted)).connect()
無法打開“ hashtable_class_helper.pxi”:找不到文件(file:/// c:/git/dashboards/pandas/_libs/hashtable_class_helper.pxi)。
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('ibm_db_sa:///?odbc_connect={}'.format(quoted)).connect()
發生了異常:sqlalchemy.exc.InterfaceError(ibm_db_dbi.InterfaceError)ibm_db_dbi :: InterfaceError:connect期望前五個參數為字符串或Unicode類型(有關此錯誤的背景信息,請訪問: http : //sqlalche.me/e/rvf5 )文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”,第43行,在
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('ibm_db:///?odbc_connect={}'.format(quoted)).connect()
發生異常:sqlalchemy.exc.NoSuchModuleError無法加載插件:sqlalchemy.dialects:ibm_db
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('db2:///?odbc_connect={}'.format(quoted)).connect()
發生了異常:sqlalchemy.exc.InterfaceError(ibm_db_dbi.InterfaceError)ibm_db_dbi :: InterfaceError:connect期望前五個參數為字符串或Unicode類型(有關此錯誤的背景信息,請訪問: http : //sqlalche.me/e/rvf5 )文件“ C:\\ Git \\ dashboards \\ web_app \\ pandas db2 test.py”,第45行,在
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('db2+ibm_db:///?odbc_connect={}'.format(quoted)).connect()
發生了異常:sqlalchemy.exc.InterfaceError(ibm_db_dbi.InterfaceError)ibm_db_dbi :: InterfaceError:connect期望前五個參數為字符串或Unicode類型(有關此錯誤的背景信息,請訪問: http : //sqlalche.me/e/rvf5 )
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('db2+ibm_db_sa:///?odbc_connect={}'.format(quoted)).connect()
發生異常:sqlalchemy.exc.NoSuchModuleError無法加載插件:sqlalchemy.dialects:db2.ibm_db_sa
我終於讓它工作了,盡管有點尷尬。 我在項目中創建了一個空白文件,以安撫我收到的此消息,以響應問題中顯示的一種嘗試:
無法打開
'hashtable_class_helper.pxi'
:找不到file:///c:/git/dashboards/pandas/_libs/hashtable_class_helper.pxi
(file:///c:/git/dashboards/pandas/_libs/hashtable_class_helper.pxi
)。
(我的項目文件夾是C:/Git/dashboards
,所以我創建了其余的路徑。)
在存在該文件的情況下,下面的代碼現在對我有用。 engine.connect()
有效,但是我運行了一個實際查詢以進一步驗證它是否有效。 記錄下來,不管是否按照問題中的鏈接之一的建議修改了ibm_db_sa
模塊,它似乎都可以工作,因此,我建議您不要使用該模塊。 請注意,盡管它們不是直接導入的,但是您需要安裝以下模塊: pyodbc
, ibm_db_sa
,甚至future
(我忘記了)。
import urllib
import pandas as pd
from sqlalchemy import create_engine
CONNECTION_STRING = (
"driver={iSeries Access ODBC Driver};"
"system=ip_address;"
"database=database_name;"
"uid=username;"
"pwd=password;"
)
SQL= """\
SELECT
MPBASE AS BASEPA,
COALESCE(SUM(MPQTY), 0) AS PWIP
FROM FUTMODS.MPPROD
WHERE MPOPT <> '*'
GROUP BY MPBASE
"""
quoted = urllib.quote_plus(CONNECTION_STRING)
engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(quoted))
df = pd.read_sql_query(
SQL,
engine,
index_col='basepa'
)
print df
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.