<p>在MySQLdb 1.2.3中,查询来自字符串替换,第一个参数用作模型字符串,第二个参数用作参数列表或单个参数,<em>通过con.literal</em>传递。con.literal接受您提供的内容,并尝试将其转换为一个字符串,由MySQL正确解析。它在字符串中添加撇号。它输出不带引号的数字。或者,如果给它一个带撇号的字符串,它会引用撇号。</p>
<p>在您的特定情况下,MySQLdb似乎总是会做错误的事情,当您将一个只有一个项的元组交给它时(con是任何打开的连接):</p>
<pre><code>>>> con.literal((10,))
('10',)
>>>
</code></pre>
<p>这正是Python希望能够创建一个包含单个项的元组的原因,但这会导致MySQL出现barf(向右滚动可以看到barfness):</p>
<pre><code>mysql> select distinct sites.SiteCode, sites.SiteName, Latitude, Longitude, County, SourceID from sites, seriescatalog where sites.SiteID = seriescatalog.SiteID and sites.SiteID in (82,);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1
mysql>
</code></pre>
<p>这是我的工作,以防止博比小报:</p>
<pre><code>siteinfoquery = """select distinct sites.SiteCode, sites.SiteName, Latitude, Longitude, County, SourceID from sites, seriescatalog where sites.SiteID = seriescatalog.SiteID and sites.SiteID in (%s);"""
cur.execute(siteinfoquery % ",".join([str(int(i)) for i in SiteID]))
</code></pre>
<p>顺便说一句,下面的代码不起作用,因为con.literal(在MySQLdb的execute()函数中调用)引用了结果字符串,将其从一个数字列表转换为一个字符串,然后变成一个与任何SiteID都不匹配的值:</p>
<pre><code>cur.execute(siteinfoquery , ",".join([str(int(i)) for i in SiteID]))
>>> "(%s)" % con.literal(",".join([str(float(i)) for i in SiteID]))
"('10.0,20.0')"
>>>
</code></pre>
<p>我还没有看到这是不是一个在更高版本中修复的错误,当前的问题,我的错误,还是一个他们不知道的问题。</p>