<p>问题是您试图从<code>.execute</code>方法获取<code>uid</code>值。请参考<a href="http://legacy.python.org/dev/peps/pep-0249/#id15" rel="nofollow">the Python Database API Specification v2.0 (PEP 249) section describing the .execute method</a>,其中写着:</p>
<blockquote>
<p>Return values are not defined.</p>
</blockquote>
<p>换句话说,<strong>不要使用此方法的返回值</strong>——至少,除非您对模块非常熟悉,能够准确地理解<em>它是如何实现的。在</p>
<p>相反,您需要<strong>使用另一个方法从游标“获取”结果集。<a href="http://mysql-python.sourceforge.net/MySQLdb.html#some-examples" rel="nofollow">The example section in the MySQL-Python User's Guide</a>显示了使用这些方法之一<code>.fetchone</code>来获取单行:</p>
<blockquote>
<p>To perform a query, you first need a cursor, and then you can execute
queries on it:</p>
<pre><code>c=db.cursor()
max_price=5
c.execute("""SELECT spam, eggs, sausage FROM breakfast
WHERE price < %s""", (max_price,))
</code></pre>
<p>...</p>
<p>And now, the results:</p>
<pre><code>>>> c.fetchone()
(3L, 2L, 0L)
</code></pre>
</blockquote>
<p>如果您期望从一个特定的查询中只能得到一行(例如,在聚合整个表时),那么使用<code>.fetchone</code>是合理的。如果有更多的行,可以重复调用此方法,直到行用完为止。但是,在许多情况下,您需要使用<code>.fetchall</code>来存储整个集合:</p>
<pre><code>>>> import MySQLdb
>>> conn = MySQLdb.connect(user='foo', passwd='bar', db='test')
>>> curs = conn.cursor()
>>> curs.execute('create temporary table t (a int);')
0L
>>> curs.executemany('insert into t values (%s);', xrange(10))
10L
>>> curs.execute('select count(*) from t;')
1L
>>> curs.fetchall()
((10L,),)
>>> curs.execute('select a from t where a % 2;')
5L
>>> curs.fetchall()
((1L,), (3L,), (5L,), (7L,), (9L,))
>>> curs.fetchall()
()
</code></pre>
<p>请注意,只提取一次行;如果您第二次调用<code>.fetchall</code>而不执行另一个查询,则会得到一个空的结果集(一个由0个元组组成的元组)。这意味着您应该存储fetch方法的返回值,以便以后访问它们。在</p>
<p>因此,要将此应用于示例,请替换以下行:</p>
^{pr2}$
<p>更像这样:</p>
<pre><code>cur.execute("""Select userid from user_table where username = %s """, (username,))
result = cur.fetchone() # get a single row
uid = result[0] # get the first value from that row
</code></pre>
<p>或者,使用<code>.fetchall</code>:</p>
<pre><code>cur.execute("""Select userid from user_table where username = %s """, (username,))
result = cur.fetchall() # get any/all rows
uid = result[0][0] # get the first value from the first row
</code></pre>
<p>使用哪种模式取决于查询、环境和个人喜好。在这两种情况下,如果在表中找不到用户名,您可能还需要处理获取空集的可能性。在</p>