Mar*_*ese 6 python sqlalchemy pyodbc db2-400
简短版本: 请告诉我如何通过 SQLAlchemy 连接到 AS/400。
长版
我的最终目标是连接来自 SQL Server 和 AS/400 的数据以在 Flask Python 应用程序中显示。我的方法是将每个数据库中的数据获取到 Pandas 数据帧中,然后可以将其连接并输出为 JSON。如果有人有更好的方法,请随时发表评论。我尝试执行此操作的方法的问题在于Pandas.read_sql_query()依赖于 SQLAlchemy,并且事实证明让 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.
Run Code Online (Sandbox Code Playgroud)
我阅读了这些资源以及其他资源,并尝试应用他们的技术:
以下是我收集的一些失败的尝试和相应的错误消息。我不知道第一部分(“ 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()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.InterfaceError (pyodbc.InterfaceError) ('IM002', u'[IM002] [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序 (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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.InterfaceError (pyodbc.InterfaceError) ('IM002', u'[IM002] [Microsoft][ODBC Driver Manager] 未找到数据源名称且未指定默认驱动程序 (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()
Run Code Online (Sandbox Code Playgroud)
发生异常: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()
Run Code Online (Sandbox Code Playgroud)
无法打开“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()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.InterfaceError (ibm_db_dbi.InterfaceError) ibm_db_dbi::InterfaceError: connect 期望前五个参数为 string 或 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()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.NoSuchModuleError 无法加载插件:sqlalchemy.dialects:ibm_db
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('db2:///?odbc_connect={}'.format(quoted)).connect()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.InterfaceError (ibm_db_dbi.InterfaceError) ibm_db_dbi::InterfaceError: connect 期望前五个参数为 string 或 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()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.InterfaceError (ibm_db_dbi.InterfaceError) ibm_db_dbi::InterfaceError: connect 期望前五个参数为 string 或 unicode 类型(此错误的背景位于: http: //sqlalche.me/e/rvf5)
quoted = urllib.quote_plus(CONNECTION_STRING)
create_engine('db2+ibm_db_sa:///?odbc_connect={}'.format(quoted)).connect()
Run Code Online (Sandbox Code Playgroud)
发生异常:sqlalchemy.exc.NoSuchModuleError 无法加载插件:sqlalchemy.dialects:db2.ibm_db_sa
我终于成功了,虽然有点尴尬。我在项目中创建了一个空白文件,以安抚我收到的这条消息,以响应我的问题中显示的其中一项尝试:
无法打开
'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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2925 次 |
| 最近记录: |