<p>我不能用MySQLdb复制这个。我用的是1.2.2期末考试。
也许可以尝试一个简单的调试,以确保问题出在您已经指出的地方:</p>
<pre><code>In [13]: cur.execute('select %s + %s', (1,2))
Out[13]: 1L
In [14]: cur.fetchall()
Out[14]: ((3L,),)
</code></pre>
<p>更新1:所以我抓取并安装了1.2.3 final,这是我的成绩单:</p>
<pre><code>In [1]: import MySQLdb
In [2]: MySQLdb.version_info
Out[2]: (1, 2, 3, 'final', 0)
In [3]: con = MySQLdb.connect(user='root', db='inventory')
In [4]: cur = con.cursor()
In [5]: cur.execute('select %s + %s', (1,2))
Out[5]: 1L
In [6]: cur.fetchall()
Out[6]: ((3L,),)
</code></pre>
<p>如果我能复制你的问题,也许我能提供一个解决方案!?
那么我们两个环境还有什么不同呢?</p>
<pre><code>$ mysql --version
mysql Ver 14.14 Distrib 5.1.41, for debian-linux-gnu (x86_64) using readline 6.1
</code></pre>
<p>更新2:
你也许可以把事情分解得比上面稍微多一些。请注意MySQLdb-1.2.3的源代码中的以下代码片段:</p>
<pre><code>139 def execute(self, query, args=None):
...
158 if args is not None:
159 query = query % db.literal(args)
160 try:
161 r = self._query(query)
162 except TypeError, m:
163 if m.args[0] in ("not enough arguments for format string",
164 "not all arguments converted"):
165 self.messages.append((ProgrammingError, m.args[0]))
</code></pre>
<p>第159行是转换/转义参数,然后插入查询字符串的位置。
所以也许你可以这样做:</p>
<pre><code>In [24]: con.literal((1,2,))
Out[24]: ('1', '2')
</code></pre>
<p>在与查询字符串合并之前,查看驱动程序如何转换参数。</p>
<pre><code>In [26]: "select %s + %s" % con.literal((1,2,))
Out[26]: 'select 1 + 2'
</code></pre>