当使用Kerberos进行身份验证时,如何使用sqlalchemy连接到我的db2数据库?
使用pyodbc时,连接字符串包含AuthenticationMethod = 4,这使kerberos可以处理身份验证,而我不需要提供用户名和密码。
是否有一种方法可以将pyodbc.connect对象直接传递到sqlalchemy中,或者我也可以告诉sqlalchemy使用kerberos?
我的odbc连接字符串看起来像这样:
connstr = 'ApplicationUsingThreads=0;' \
...: 'FloatingPointParameters=0;' \
...: 'DoubleToStringPrecision=16;DB=NYRMPDI1;' \
...: 'AuthenticationMethod=4;' \
...: f'IpAddress={ip_address};' \
...: f'TcpPort={port};' \
...: f'DRIVER={driver_location}'
我找不到任何将其传递给sqlalchemy create_engine的方法。
ibm_db_sa
与IBM Db2驱动程序一起支持与pyodbc的kerberos连接,DSN-LESS和DSN连接字符串,并且与所有三种类型的IBM Db2驱动程序(胖客户端,运行时客户端和ODBC)一起使用和CLI驱动程序)。与ODBC和CLI客户端相比,fat-client + runtime-client需要不同的配置。
默认情况下,除非另行说明,否则安装ibm_db_sa
或ibm_db
模块将安装IBM'ODBC和CLI客户端'。
您的odbcinst.ini
需要定义一个驱动程序名称(在我的示例中,我将其称为DB2CLI,但您可以给它提供任何您喜欢的名称),并从正确的路径中指定要加载的库(示例libdb2.so)。
这里是一个DSN-LESS连接字符串的示例,在传递给create_engine()
之前,您必须先对其进行urlencode:
CONNECTION_STRING=("DRIVER={DB2CLI};HOSTNAME=192.168.1.178;PORT=60000;KRBPLUGIN=IBMkrb5;AUTHENTICATION=KERBEROS;DATABASE=SAMPLE;")
quoted_connection_string=urllib.parse.quote_plus(CONNECTION_STRING)
engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(quoted_connection_string))
如果您喜欢DSN连接,则必须在db2dsdriver.cfg
中定义所有详细信息,并在活动的odbc.ini
中具有dsn节,该节引用了在odbcinst.ini
中配置的驱动程序,并且必须指定< [only像这样的连接字符串中的DSN:
CONNECTION_STRING=("DSN=SAMPLE;")
engine = create_engine('ibm_db_sa+pyodbc:///?odbc_connect={}'.format(CONNECTION_STRING))
对于DSN连接,如果先使kerberos连接与isql
一起使用,然后再使其与sqlalchemy一起使用,这将有所帮助,因为故障排除似乎更容易。我测试了这些组件版本:
db2dsdriver.cfg
,并使用参数Authentication,参数值Kerberos配置数据库。CLNT_KRB_PLUGIN
将IBM Data Server Client db2 update dbm cfg using CLNT_KRB_PLUGIN IBMkrb5
参数配置为odbcinst.ini
以使用Db2客户端提供的正确的libdb2.so
库,并在DSN-LESS python代码中或在odbc.ini
中为DSN连接引用此驱动程序名称。odbc.ini
配置为使用odbcinst.ini
中指定的Db2驱动程序,并在Authentication = kerberos
的DSN节中提及odbc.ini
。 odbc.ini
文件中忽略任何用户ID /密码。对于已连接的DSN-LESS,不需要在odbc.ini
或db2dsdriver.cfg
中对数据库的任何引用。db2cli validate -dsn $YOURDSN -connect
成功完成,没有用户名或密码。这证明CLI层正在使用kerberos。db2 connect to $YOUR_REMOTE_DATABASE
上连接到编录的远程数据库(无需输入用户ID /密码)。这证明常规的shell脚本可以使用kerberos身份验证连接到数据库。如果您使用的是Db2胖客户端或Db2运行时客户端,则在运行isql
或python脚本之前,您需要插入/源正确的db2profile。