【问题标题】:How to get the result of the 'for x in myresult: print(x[0])' into a variable如何将“for x in myresult: print(x[0])”的结果转换为变量
【发布时间】:2019-12-10 14:54:10
【问题描述】:

基本上,当我的 SQL 命令获取数据库的数据时,它会像这样 [('admin',)]

对于 x 在 myresult 中: 打印(x [0]) 我发现这将以管理员身份打印出来,这就是我想要的方式,但我需要将它保存到用户名等变量中

定义登录(): mydb = mysql.connector.connect(

host="localhost",
user="root",
passwd="password",
database="testdb",
)


username=input("Please Enter Your username:     ") 

mycursor = mydb.cursor()


mycursor.execute ("SELECT name FROM account_database WHERE name = 'admin' ")

myresult = mycursor.fetchall()
print(myresult)
mydb.commit()
mycursor.close()

for x in myresult:
    print(x[0])

【问题讨论】:

  • 我想我的问题是如何获得 for x in myresult: print(x[0]) 保存到变量的结果

标签: python python-3.x variables mysql-python


【解决方案1】:

将值附加到列表中。

final = []
for x in myresult:
    print(x[0])
    final.append(x[0])

【讨论】:

    【解决方案2】:

    您从myresult = mycursor.fetchall() 获得的myresult 是一个元组列表。

    使用for x in myresult:x 会从myresult 一个接一个地分配每个元组。然后使用x[0] 访问这些元组中的第一个元素。

    在您的情况下,只有一个元组,只有一个值。这是有道理的,因为您的 SQL 从名称为 'admin' 的所有记录中选择 name - 您基本上是在检查是否有名称为 'admin' 的用户。不清楚您为什么要使用此名称,因为每条记录都将是 'admin'

    你可以像这样直接访问它:

    admin_name = myresult[0][0]
    

    即将myresult 中第一条记录的第一个值分配给admin_name,但它要么与admin_name = 'admin' 相同,要么如果数据库中没有名为'admin' 的用户,则会生成错误消息。

    检查:

    if len(myresult) == 0:
        print('There is no user named \'admin\'')
    else:
        print('There is a user named \'admin\')
    

    注意:如果您只想查看是否有任何具有该名称的记录,您也不需要.fetchall(),您可以使用.fetchone()。或者您甚至可以只运行一个完全避免错误的查询:

    mycursor.execute ("SELECT COUNT(name) FROM account_database WHERE name = 'admin'")
    myresult = mycursor.fetchone()
    print(f'There are {myresult[0]} users named \'admin\'')
    

    【讨论】:

      【解决方案3】:

      你写道:

      for x in myresult:
          print(x[0])
      

      之后,x 仍在范围内, 因此,您可以随心所欲地使用涉及x 的表达式。

      假设您最喜欢的变量是v。 然后在循环之后你可以分配例如:

      v = x[0]
      

      表达循环的更好方法是元组解包:

      for name, in myresult:
          print(name)
      
      v = name
      

      在这里,我们将一个 1 元组解包到字符串变量 name 中。 请求两列的更高级的查询可能会使用:for name, age in myresult:

      现在,您当前的查询使用相等测试 所以它将返回零或一行 (在零行“未找到”的情况下,v 分配将失败)。 想象一下,而不是只找到'admin' 您的 WHERE 子句要求输入以 a 开头的 所有 个名称:

      ... WHERE name LIKE 'a%'
      

      那么收集一个列表的名字会更合适:

      import pprint
      ...
      names = [name
               for name, in myresult]
      
      pprint.pprint(names)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-20
        • 1970-01-01
        • 1970-01-01
        • 2016-09-13
        • 2021-02-02
        • 1970-01-01
        • 2014-06-27
        • 2010-10-22
        相关资源
        最近更新 更多