如何为 cross-platform 测试创建 ODBC "DSN"?
How to create ODBC "DSN" for cross-platform testing?
我需要一个 WIN 上的简单 ODBC 测试场景,我可以非常简单地配置它,并确保它可以支持 Unix.SE 上的另一个问题。
简而言之,我正在尝试在 KVM/QEMU 虚拟系统 (192.168.1.12) 中设置从 Debian 10 (192.168.1.2) 到 Windows 10 的 PyODBC/Python 脚本连接.
首先,在 Windows 10/KVM 上,我看到 ODBC Data Source Administrator
有一个选项卡 File DSN
和 Microsoft Text Driver
。 我可以使用 FileDSN 测试 Python PyODBC 连接到 ODBC 使用简单的 CSV 文件代替服务器吗?(我对 ODBC 的研究只找到 运行 服务器实例).
接下来,我尝试的是:
我在 Debian 上安装了 ODBC Microsoft driver for Linux.
关闭Windows 10防火墙,我可以双向ping:
$nmap -p 22 192.168.1.12
# Deb 获胜
> Test-NetConnection 192.168.1.2 -p 22
# 赢给 Deb
在 Windows 10/KVM 我添加了一个带有 Microsoft Text Driver 的 FileDSN。我用简单的 header 和一行数据 (IE. {'ID' : 1, 'NAME' : 'FOO'}
)
创建了一个 CSV 文件 (odbc_test_01.csv
)
创建了一个 Jupyter 笔记本来简化测试。这是我的连接字符串和结果:
cn = pyodbc.connect(r'Driver={ODBC Driver 17 for SQL Server};' # Driver installed above
r'FILEDSN=odbc_test_01.csv;' # my attempt at FileDSN
r'SERVER=192.168.1.12;' # KVM IP tested with ping
r'Trusted_Connection=no;' # explicit; use UID/PWD
r'UID=<username>;' # Windows user name
r'PWD=<password>', # Windows user password
autocommit=True)
OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
尝试 isql
从 Debian 命令行使用相同的字符串:
isql -v -k ''Driver={ODBC Driver 17 for SQL Server};FILEDSN=odbc_test_01.csv;SERVER=192.168.1.12; Trusted_Connection=no;UID=<username>;PWD=<password>'
SO 处的类似页面:
ODBC“文件 DSN”不是用于访问文件中数据的 driver。这是一种将 DSN(目标数据库的连接信息)指定为独立 文件 中的值的方法,而不是 Linux 上的标准配置文件中的值(例如,/etc/odbc.ini
) 或在 Windows 注册表中。
如果您需要“克隆”一个 Windows DSN 条目以便在 Linux 环境中使用,那么您可能会发现我的 dump_dsn 实用程序很有帮助。它从 Windows 注册表中检索一个 ODBC DSN,并以一种您可以用来在 Linux.
上重新创建 DSN 的形式呈现它
例如,假设我在 Windows 上有一个名为“mssql199”的 DSN,当我在 运行 dump_dsn.to_text("mssql199")
上得到
[mssql199]
Driver=ODBC Driver 17 for SQL Server
Description=with UseFMTONLY
Server=192.168.0.199
Database=myDb
Encrypt=No
TrustServerCertificate=No
ClientCertificate=
KeystoreAuthentication=
KeystorePrincipalId=
KeystoreSecret=
KeystoreLocation=
UseFMTONLY=Yes
Trusted_Connection=No
要在 Linux 盒子上使用相同的 DSN,我必须
- 将该块复制到
/etc/odbc.ini
(或等同于“系统 DSN”)或 ~/.odbc.ini
(对于“用户 DSN”)以使用 DSN=mssql199
,或
- 用
[ODBC]
header 而不是 [mssql199]
将该块保存到文件中,例如 /home/gord/mssql199_file.dsn
(对于“文件 DSN”)并使用 FILEDSN=/home/gord/mssql199_file.dsn
Edit 回复:“我可以使用 FileDSN 来测试 Python PyODBC 连接到 ODBC 使用简单的 CSV 文件代替服务器吗??”
没有。 Windows 框上的 ODBC DSN 或 FILEDSN 仅对连接 从 Windows 框 到 数据有用源(本地或其他机器上)。我们无法将从一台机器(例如Linux)连接到另一台机器上的ODBC DSN条目
我创建了一个 SQLite 数据库。然后我添加了 SQLite drivers for ODBC.
我需要一个 WIN 上的简单 ODBC 测试场景,我可以非常简单地配置它,并确保它可以支持 Unix.SE 上的另一个问题。
简而言之,我正在尝试在 KVM/QEMU 虚拟系统 (192.168.1.12) 中设置从 Debian 10 (192.168.1.2) 到 Windows 10 的 PyODBC/Python 脚本连接.
首先,在 Windows 10/KVM 上,我看到 ODBC Data Source Administrator
有一个选项卡 File DSN
和 Microsoft Text Driver
。 我可以使用 FileDSN 测试 Python PyODBC 连接到 ODBC 使用简单的 CSV 文件代替服务器吗?(我对 ODBC 的研究只找到 运行 服务器实例).
接下来,我尝试的是:
我在 Debian 上安装了 ODBC Microsoft driver for Linux.
关闭Windows 10防火墙,我可以双向ping:
$nmap -p 22 192.168.1.12
# Deb 获胜> Test-NetConnection 192.168.1.2 -p 22
# 赢给 Deb在 Windows 10/KVM 我添加了一个带有 Microsoft Text Driver 的 FileDSN。我用简单的 header 和一行数据 (IE.
创建了一个 CSV 文件 ({'ID' : 1, 'NAME' : 'FOO'}
)odbc_test_01.csv
)创建了一个 Jupyter 笔记本来简化测试。这是我的连接字符串和结果:
cn = pyodbc.connect(r'Driver={ODBC Driver 17 for SQL Server};' # Driver installed above r'FILEDSN=odbc_test_01.csv;' # my attempt at FileDSN r'SERVER=192.168.1.12;' # KVM IP tested with ping r'Trusted_Connection=no;' # explicit; use UID/PWD r'UID=<username>;' # Windows user name r'PWD=<password>', # Windows user password autocommit=True) OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')
尝试
isql
从 Debian 命令行使用相同的字符串:isql -v -k ''Driver={ODBC Driver 17 for SQL Server};FILEDSN=odbc_test_01.csv;SERVER=192.168.1.12; Trusted_Connection=no;UID=<username>;PWD=<password>'
SO 处的类似页面:
ODBC“文件 DSN”不是用于访问文件中数据的 driver。这是一种将 DSN(目标数据库的连接信息)指定为独立 文件 中的值的方法,而不是 Linux 上的标准配置文件中的值(例如,/etc/odbc.ini
) 或在 Windows 注册表中。
如果您需要“克隆”一个 Windows DSN 条目以便在 Linux 环境中使用,那么您可能会发现我的 dump_dsn 实用程序很有帮助。它从 Windows 注册表中检索一个 ODBC DSN,并以一种您可以用来在 Linux.
上重新创建 DSN 的形式呈现它例如,假设我在 Windows 上有一个名为“mssql199”的 DSN,当我在 运行 dump_dsn.to_text("mssql199")
上得到
[mssql199]
Driver=ODBC Driver 17 for SQL Server
Description=with UseFMTONLY
Server=192.168.0.199
Database=myDb
Encrypt=No
TrustServerCertificate=No
ClientCertificate=
KeystoreAuthentication=
KeystorePrincipalId=
KeystoreSecret=
KeystoreLocation=
UseFMTONLY=Yes
Trusted_Connection=No
要在 Linux 盒子上使用相同的 DSN,我必须
- 将该块复制到
/etc/odbc.ini
(或等同于“系统 DSN”)或~/.odbc.ini
(对于“用户 DSN”)以使用DSN=mssql199
,或 - 用
[ODBC]
header 而不是[mssql199]
将该块保存到文件中,例如/home/gord/mssql199_file.dsn
(对于“文件 DSN”)并使用FILEDSN=/home/gord/mssql199_file.dsn
Edit 回复:“我可以使用 FileDSN 来测试 Python PyODBC 连接到 ODBC 使用简单的 CSV 文件代替服务器吗??”
没有。 Windows 框上的 ODBC DSN 或 FILEDSN 仅对连接 从 Windows 框 到 数据有用源(本地或其他机器上)。我们无法将从一台机器(例如Linux)连接到另一台机器上的ODBC DSN条目
我创建了一个 SQLite 数据库。然后我添加了 SQLite drivers for ODBC.