如何使用SQLAlchemy访问AS / 400?

时间:2019-01-17 17:45:33

标签: python sqlalchemy pyodbc db2-400

简短版本: 请告诉我如何通过SQLAlchemy连接到AS / 400。

长版

我的最终目标是将来自SQL Server和AS / 400的数据连接到Flask Python应用程序中进行显示。我的方法是将每个数据库中的数据放入Pandas数据帧中,然后可以将其连接并以JSON输出。如果有人有更好的方法,请随时发表评论。我尝试执行此操作的方式的问题是Pandas.read_sql_query()依赖于SQLAlchemy,而事实证明,使SQLAlchemy与AS / 400一起使用非常困难。

  • AS / 400的版本是7.2,尽管我可能会尝试连接的另一个版本是5.1。
  • 我正在尝试从运行Windows 7的计算机上访问它,该计算机具有i Access 7.1,Python 2.7和Python模块,包括pyodbcibm_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)')(此错误的背景位于:{{ 3}})     

中的文件“ 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/rvf5)     

中的文件“ 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/e3q8('ibm_db_sa://用户名:密码@ip_地址: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/e3q8create_engine

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)')(此错误的背景位于:{{ 3}})     

中的文件“ 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”:找不到文件   (文件:/// 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/e3q8)     

中的文件“ 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

1 个答案:

答案 0 :(得分:0)

尽管有点尴尬,我终于让它工作了。我在项目中创建了一个空白文件,以安抚我收到的此消息,以响应问题中显示的一种尝试:

  

无法打开'hashtable_class_helper.pxi':找不到文件(file:///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