簡體   English   中英

如何使用SQLAlchemy訪問AS / 400?

[英]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一起使用非常困難。

  • AS / 400是7.2版,盡管我可能會嘗試連接的另一個版本是5.1版。
  • 我正在嘗試從運行Windows 7的計算機上訪問它,該計算機具有i Access 7.1,Python 2.7和Python模塊,包括pyodbcibm_db_sa

沒有sqlalchemypyodbc可以正常工作:

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.pxifile:///c:/git/dashboards/pandas/_libs/hashtable_class_helper.pxi )。

(我的項目文件夾是C:/Git/dashboards ,所以我創建了其余的路徑。)

在存在該文件的情況下,下面的代碼現在對我有用。 engine.connect()有效,但是我運行了一個實際查詢以進一步驗證它是否有效。 記錄下來,不管是否按照問題中的鏈接之一的建議修改了ibm_db_sa模塊,它似乎都可以工作,因此,我建議您不要使用該模塊。 請注意,盡管它們不是直接導入的,但是您需要安裝以下模塊: pyodbcibm_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM