【问题标题】:TypeError: tuple indices must be integers or slices, not str postgres/pythonTypeError:元组索引必须是整数或切片,而不是 str postgres/python
【发布时间】:2021-01-18 14:46:19
【问题描述】:

您好,我正在尝试从我的 postgres 数据库中名为 time 的行中获取时间戳,但出现错误。这是数据库中的第二行。

错误TypeError: tuple indices must be integers or slices, not str 位于stamp = cursor.fetchone()["time"] 行。

我希望在我的不和谐机器人中将元组读取为字符串。这是我正在处理的内容:

for member in guild.members:
        cursor = conn.cursor()
        cursor.execute("SELECT time FROM blacklist WHERE username=%s", (member.id, ))
        stamp = cursor.fetchone()["time"]
        for time in stamp: 
            if time is not None:
                timestamp = time
                members = discord.utils.get(member.guild.roles, name="Members")
                restricted_role = get(guild.roles, name="Restricted")
                datestamp = datetime.now()
                datetimestring = str(datestamp.now().strftime("%Y%m%d%H%M%S"))
                dateonlystring = timestamp.strftime("%Y%m%d%H%M%S")
        
                if (datetimestring > dateonlystring):
                    await member.add_roles(members)
                    await member.remove_roles(restricted_role)
                    print("Done.")

我们将不胜感激。

【问题讨论】:

  • 你应该在discord.py等异步用例中使用asyncpg

标签: python postgresql discord.py discord.py-rewrite


【解决方案1】:

此代码 sn-p 存在一些问题。引发此错误的是cursor.fetchone() 返回tuple,而不是错误提示的dict。您需要在返回定义中为其指定与名为“time”的列相对应的整数索引,这应该是 0。

所以你需要换行:

stamp = cursor.fetchone()["time"]

stamp = cursor.fetchone()[0]

psychopg.fetchone()查看详情

但是,我注意到 stamp 应该被编入索引,所以即使您测试 None 也会失败。

我在修改后的代码中提出了其他建议,基于它的推测。

for member in guild.members:
        cursor = conn.cursor()

        # Changed the query so that NULLs (which will be cast as None) are not returned
        cursor.execute("SELECT time FROM blacklist WHERE username=%s AND time IS NOT NULL", (member.id, ))

        # no index needed, multiple stamps are returned 
        results = cursor.fetchall()

        for result in results:
            # first and only returned element
            timestamp = result[0] 

            members = discord.utils.get(member.guild.roles, name="Members")
            restricted_role = get(guild.roles, name="Restricted")
            datestamp = datetime.now()

            datetimestring = str(datestamp.now().strftime("%Y%m%d%H%M%S"))
            dateonlystring = timestamp.strftime("%Y%m%d%H%M%S")
        
            if (datetimestring > dateonlystring):
                    await member.add_roles(members)
                    await member.remove_roles(restricted_role)
                    print("Done.")

【讨论】:

  • 谢谢,但已经返回'NoneType' object is not subscriptable ?
  • 那么您的查询没有返回任何内容,而您的结果为 NULL/None。
猜你喜欢
  • 2017-03-11
  • 2019-11-23
  • 2018-12-29
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2020-05-14
  • 2020-11-21
  • 2017-10-08
相关资源
最近更新 更多