2013-12-20 74 views
1

的代碼使用時,(「ABC」)的格式爲什麼MySQL的返回字符串:與Python

cur = connection.cursor() 
cur.execute("SELECT username from users where customer_id = %s", (cust)) 
name = cur.fetchone() 

使輸出的姓名和卡斯特爲:(u'abc',) (u'abc123',)

我怎樣才能得到輸出作爲沒有(u' ')的正確字符串?

回答

0

您正在提取,而不僅僅是數據庫中的一列。每行都是一個元組,並且由於您的查詢返回的行只有一列,因此您將得到長度爲1的元組。

如果你想擁有隻是一個行的第一列,使用索引:

name = cur.fetchone()[0] 

元組列是Unicode字符串和Unicode字符串的蟒蛇表示使用u前綴:

>>> u'unicode value' 
u'unicode value' 
>>> print u'unicode value' 
unicode value 

這使調試更容易;您可以直接將該值複製到Python解釋器中,並知道您獲得了完全相同的值。

當打印在Python標準容器(如一個元組,字典,列表等)容器的內容始終使用的表示:即使你

>>> print ['list', 'with', 'strings'] 
['list', 'with', 'strings'] 
>>> print ['list', 'with', 'strings'][0] 
list 
0

(u「foo」,)是帶有一個元素的tupleu只是unicode字符串的前綴。您可以通過索引獲取字符串:name[0]

0

正如馬亭在他回答說,要求只有一列,你總是會獲取一列的行,而不是裸露的列。因此,將fetchone()的結果分配給像row這樣的變量,而不是像some_column_name這樣的變量,可能會更清楚。然後你可以操縱那個row來提取你想要的特定數據。

您也可能發現使用返回字典而不是元組的字符串很有用。就像這樣:

import MySQLdb.cursors 

cur = connection.cursor(cursorclass=MySQLdb.cursors.DictCursor) 
cur.execute("SELECT username from users where customer_id = %s;", (cust,)) 
row = cur.fetchone() # {'username': 'abc123'} 
name = row['username'] # 'abc123' 

這是您發送查詢結果到一些自定義的函數或類對應於列名的關鍵字參數特別好;例如:

cur = connection.cursor(cursorclass=MySQLdb.cursors.DictCursor) 
cur.execute("SELECT name, age, years_in_residence FROM natural-born_citizens;") 
query_result = cursor.fetchall() # a tuple of dictionaries 

def eligible(name, age, years_in_residence): 
    if age >= 35 and years_in_residence >= 14: 
     return '{} is eligible to run for U.S. President.'.format(name) 
    else: 
     return '{} is not eligible.'.format(name) 

for row in query_result: 
    print eligible(**row) 

# Richard Stallman is eligible to run for U.S. President. 
# Kermit the Frog is eligible to run for U.S. President. 
# Miley Cyrus is not eligible. 
# Oliver Smoot is eligible to run for U.S. President. 

參見:Documentation for unpacking argument lists with * and **