<p><a href="https://github.com/ibmdb/python-ibmdbsa/tree/master/ibm_db_sa" rel="noreferrer">README for ^{<cd1>}</a>只在“支持的数据库”部分列出了用于Linux/Unix/Windows的DB2。所以它很可能不适用于我的DB2,至少不是现成的。</p>
<p>既然您已经声明您拥有IBM System i Access for Windows,我强烈建议您只使用它附带的一个驱动程序(ODBC、OLEDB或ADO.NET,正如@Charles所提到的)。</p>
<p>就我个人而言,我总是使用ODBC,使用<a href="https://github.com/mkleehammer/pyodbc/releases" rel="noreferrer">^{<cd2>}</a>或<a href="https://pypi.python.org/pypi/pypyodbc" rel="noreferrer">^{<cd3>}</a>。两种都可以。一个简单的例子:</p>
<pre><code>import pyodbc
connection = pyodbc.connect(
driver='{iSeries Access ODBC Driver}',
system='11.22.33.44',
uid='username',
pwd='password')
c1 = connection.cursor()
c1.execute('select * from qsys2.sysschemas')
for row in c1:
print row
</code></pre>
<p>现在,SQLAlchemy的连接方法之一是<code>pyodbc</code>,因此我认为,如果您可以直接使用<code>pyodbc</code>建立连接,那么您可以通过某种方式配置SQLAlchemy来执行相同的操作。但我自己并不是一个SQLAlchemy用户,所以我没有这方面的示例代码。</p>
<p><strong>更新</strong></p>
<p>我设法让SQLAlchemy连接到我们的IBM I并执行直接的SQL查询。换言之,使其达到与直接使用PyODBC差不多的功能。<em>我没有测试过任何其他的SQLAlchemy特性。</em>我在我的Windows 7计算机上设置连接所做的操作:</p>
<ul>
<li><p>将<code>ibm_db_sa</code>安装为SQLAlchemy方言<br/>
你也许可以用<code>pip</code>来做这个,但我用的是低技术的方式:</p>
<ol>
<li>从PyPI下载<a href="https://pypi.python.org/pypi/ibm_db_sa" rel="noreferrer">^{<cd1>}</a>。<br/>
截至本文撰写时,最新版本为0.3.2,已于2014年10月20日上传。可以想象,以后的版本可能会以不同的方式被修复或破坏(所以在将来,我将要描述的修改可能是不必要的,或者它们可能不起作用)。</li>
<li>解压缩存档文件(<code>ibm_db_sa-0.3.2.tar.gz</code>),并将所附的<code>ibm_db_sa</code>目录复制到<code>sqlalchemy\dialects</code>目录中。</li>
</ol></li>
<li><p>修改<code>sqlalchemy\dialects\ibm_db_sa\pyodbc.py</code><br/></p>
<ul>
<li>将<code>initialize()</code>方法添加到<code>AS400Dialect_pyodbc</code>类<br/>
这样做的目的是重写<code>DB2Dialect</code>中同名的方法,该方法由<code>AS400Dialect_pyodbc</code>继承。问题是<code>DB2Dialect.initialize()</code>试图设置属性<code>dbms_ver</code>和<code>dbms_name</code>,这两个属性在使用PyODBC连接到IBM i时都不可用或都不相关(据我所知)。</li>
<li>添加模块级名称<code>dialect</code>,并将其设置为<code>AS400Dialect_pyodbc</code>类</li>
</ul></li>
</ul>
<p>上述修改的代码应该放在文件的末尾,如下所示:</p>
<pre><code> def initialize(self, connection):
super(DB2Dialect, self).initialize(connection)
dialect = AS400Dialect_pyodbc
</code></pre>
<p>注意凹痕!记住,<code>initialize()</code>方法必须属于<code>AS400Dialect_pyodbc</code>类,并且<code>dialect</code>必须是模块的全局。</p>
<p>最后,您需要为引擎创建者提供正确的URL:</p>
<pre>'ibm_db_sa+pyodbc://username:password@host/*local'</pre>
<p>(显然,用有效值替换<code>username</code>、<code>password</code>和<code>host</code>。)</p>
<p>就这样。此时,您应该能够创建引擎,连接到i,并通过SQLAlchemy执行普通SQL。我认为很多ORM的东西也应该在这一点上起作用,但我还没有证实这一点。</p>