使用 pyodbc 从 IBM DB2 检索数据以及相关错误

发布于 2025-01-14 17:28:35 字数 3073 浏览 2 评论 0原文

我确认我已经在 StackOverflow 上浏览了多个关于类似问题的帖子,但仍然遇到以下问题,因此发帖寻求指导/指示。

以下是代码执行的代码

import pypyodbc as pyodbc
import configparser

config = configparser.ConfigParser()
config.read('config.ini')

conn_str = 'DRIVER={' + config['db2']['driver'] + '};' \
            + 'SERVER=' + config['db2']['server'] + ';' \
            + 'DATABASE=' + config['db2']['database'] + ';' \
            + 'UID=' + config['db2']['uid'] + ';' \
            + 'PWD=' + config['db2']['password']
print(conn_str)

connection = pyodbc.connect(
    conn_str
)

cur = connection.cursor()

cur.execute('SELECT col_1, col_2 FROM schema.table_name LIMIT 2')
for row in cur:
    print (row)

输出

[connect string output]
DRIVER={'IBM i Access ODBC Driver 64-bit'};SERVER='hostname';DATABASE='database';UID='userid';PWD='password'

[error from executing the code]
raise Error(state,err_text)
pypyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified')

配置文件

$ cat config.ini
[db2]
driver = 'IBM i Access ODBC Driver 64-bit'
server = 'hostname'
database = 'database'
uid = 'userid'
password = 'password'

ODBC 安装程序和卸载程序命令的输出

odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/useradmin/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
cat /etc/odbcinst.ini
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1

[IBM i Access ODBC Driver]
Description=IBM i Access for Linux ODBC Driver
Driver=/opt/ibm/iaccess/lib/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib/libcwbodbcs.so
Driver64=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup64=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1

[IBM i Access ODBC Driver 64-bit]
Description=IBM i Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1
$ cat ~/.odbc.ini
[db2]
Driver          = IBM i Access ODBC Driver 64-bit
DATABASE        = 'database'
SYSTEM          = hostname
HOSTNAME        = hostname
PORT            = 446
PROTOCOL        = TCPIP
$ isql db2 $username $password -v
[08001][unixODBC][IBM][System i Access ODBC Driver]The specified database can not be accessed at this time.
[ISQL]ERROR: Could not SQLConnect

中没有拼写错误

我已仔细检查并确认驱动程序名称“IBM i Access ODBC Driver 64-bit”操作系统信息 x86_64 GNU/Linux

请问有关于如何调试问题的指示/指导吗?

I confirm that I have gone through multiple posts in StackOverflow with respect to similar problem, still stuck with the below problem, hence posting to seek guidance/pointers.

Following is the code

import pypyodbc as pyodbc
import configparser

config = configparser.ConfigParser()
config.read('config.ini')

conn_str = 'DRIVER={' + config['db2']['driver'] + '};' \
            + 'SERVER=' + config['db2']['server'] + ';' \
            + 'DATABASE=' + config['db2']['database'] + ';' \
            + 'UID=' + config['db2']['uid'] + ';' \
            + 'PWD=' + config['db2']['password']
print(conn_str)

connection = pyodbc.connect(
    conn_str
)

cur = connection.cursor()

cur.execute('SELECT col_1, col_2 FROM schema.table_name LIMIT 2')
for row in cur:
    print (row)

Output from code execution

[connect string output]
DRIVER={'IBM i Access ODBC Driver 64-bit'};SERVER='hostname';DATABASE='database';UID='userid';PWD='password'

[error from executing the code]
raise Error(state,err_text)
pypyodbc.Error: ('IM002', '[IM002] [unixODBC][Driver Manager]Data source name not found, and no default driver specified')

Configuration file

$ cat config.ini
[db2]
driver = 'IBM i Access ODBC Driver 64-bit'
server = 'hostname'
database = 'database'
uid = 'userid'
password = 'password'

Output of ODBC installer and uninstaller command

odbcinst -j
unixODBC 2.3.1
DRIVERS............: /etc/odbcinst.ini
SYSTEM DATA SOURCES: /etc/odbc.ini
FILE DATA SOURCES..: /etc/ODBCDataSources
USER DATA SOURCES..: /home/useradmin/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
cat /etc/odbcinst.ini
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1

[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1

[IBM i Access ODBC Driver]
Description=IBM i Access for Linux ODBC Driver
Driver=/opt/ibm/iaccess/lib/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib/libcwbodbcs.so
Driver64=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup64=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1

[IBM i Access ODBC Driver 64-bit]
Description=IBM i Access for Linux 64-bit ODBC Driver
Driver=/opt/ibm/iaccess/lib64/libcwbodbc.so
Setup=/opt/ibm/iaccess/lib64/libcwbodbcs.so
Threading=0
DontDLClose=1
UsageCount=1
$ cat ~/.odbc.ini
[db2]
Driver          = IBM i Access ODBC Driver 64-bit
DATABASE        = 'database'
SYSTEM          = hostname
HOSTNAME        = hostname
PORT            = 446
PROTOCOL        = TCPIP
$ isql db2 $username $password -v
[08001][unixODBC][IBM][System i Access ODBC Driver]The specified database can not be accessed at this time.
[ISQL]ERROR: Could not SQLConnect

I have double checked and confirm that there is no typo with driver name "IBM i Access ODBC Driver 64-bit"

OS information
x86_64 GNU/Linux

Any pointers/guidance on how to debug the issue, please?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

那请放手 2025-01-21 17:28:36

我认为您将架构名称与数据库名称混淆了。
您很可能可以完全省略数据库名称(或将其保留为空字符串并使其默认为 *SYSBAS)。相反,您可以指定 DefaultLibraries 参数。

请参阅此处的 IBM 文档有关有效连接字符串(和 odbc.ini)关键字的信息。

同样,您可以省略 PORTPROTOCOL 和 HOSTNAME 关键字,因为此驱动程序不支持它们。

这将为您留下一个看起来像这样简单的 odbc.ini

[db2]
Driver           = IBM i Access ODBC Driver 64-bit
DefaultLibraries = 'database'
SYSTEM           = hostname

I think you are confusing the schema name with the database name.
Odds are you can omit the database name completely (or leave it empty string and let it default to *SYSBAS). Instead, you can specify the DefaultLibraries argument.

See the IBM doc here for info on the valid connection string (and odbc.ini) keywords.

Similarly, you can omit the PORT, PROTOCOL, and HOSTNAME keywords, as they're not supported by this driver.

That will leave you with an odbc.ini that looks as simple as this:

[db2]
Driver           = IBM i Access ODBC Driver 64-bit
DefaultLibraries = 'database'
SYSTEM           = hostname
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文