当与python一起使用时,为什么mysql以('abc')格式返回字符串

时间:2013-12-20 19:03:08

标签: python mysql django python-2.7

代码:

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

将name和cust的输出显示为:(u'abc',) (u'abc123',)

如何在没有(u' ')的情况下将输出作为正确的字符串?

3 个答案:

答案 0 :(得分:1)

您正在获取,而不仅仅是数据库中的一列。每一行都是一个元组,因为你的查询返回的行只包含一列,你得到长度为1的元组。

如果您想只拥有行的第一列,请使用索引:

name = cur.fetchone()[0]

元组中的列是一个unicode字符串,unicode字符串的python表示使用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

答案 1 :(得分:0)

(u“foo”,)是一个带有一个元素的tupleu只是unicode字符串的前缀。您可以通过索引来获取字符串:name[0]

答案 2 :(得分:0)

正如Martijn在他的回答中所说,即使你只要求一个列,你总是会获取一列的行,而不是裸列。因此,您可能更清楚地将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 **