Почему row[0] обращается к None объекту?
@commands.Cog.listener() async def on_dropdown(self, inter: disnake.MessageInteraction): c = self.conn.cursor() c.execute(f"SELECT role_id, cost FROM shop WHERE id = ?", (inter.data['values'][0],)) row = c.fetchone() role = inter.guild.get_role(row[0]) if role in inter.author.roles: embed = disnake.Embed(title="Магазин ролей", description=f"У вас уже есть роль {role}", color=0xFF0000) await inter.response.send_message(embed=embed, ephemeral=True) return if c.execute(f"SELECT cash FROM users WHERE id = {inter.author.id}") < row[1]: embed = disnake.Embed(title="Магазин ролей", description=f"У вас недостаточно денег для покупки роли {role_name}", color=0xFF0000) await inter.response.send_message(embed=embed, ephemeral=True) return else: c.execute(f"UPDATE users SET cash = {c.execute(f'SELECT cash FROM users WHERE id = {inter.author.id}') - row[1]} WHERE id = {inter.author.id}") self.conn.commit() await inter.author.add_roles(role) embed = disnake.Embed(title="Магазин ролей", description=f"Вы успешно приобрели роль {role}", color=0x2f3136) await inter.response.send_message(embed=embed, ephemeral=True) |
Дополнительно:
c.execute(f"UPDATE users SET cash = {c.execute(f'SELECT cash FROM users WHERE id = {inter.author.id}') - row[1]} WHERE id = {inter.author.id}") |
Пожалуйста, не надо так делать. Вам что, по пальцу отрезают за каждую промежуточную переменную?
И не надо формировать запросы через f-строки, для этого есть подстановка параметров в запрос. Будет аккуратнее и безопаснее.
- очень легко словить ошибку или уязвимость в другом месте
- выполняется два запроса, где хватило бы одного
- становится тяжело прочитать код
Лучше сразу приучиться делать как правильно.
Почему row[0] обращается к None объекту?
Потому что в row None. А почему в row None? Потому что None вернул sql запрос. Элементарная же логика
- эма ну ладно
- и почему же вернул?:)
- Reaper_sds, давай начнем дальше логически мыслить, наверно потому что записи с таким id нет в базе данных.
- типа такой роли нету в базе данных?
- типа я не сохранил эту роль в базу данных?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Проблема, с которой вы столкнулись, связана с тем, что вы пытаетесь обратиться к первому элементу (row[0]) объекта, который является None. None в Python представляет собой специальное значение, которое обозначает отсутствие значения. При попытке обращения к элементам объекта None вы получите ошибку, так как None не имеет индексов или атрибутов.
Чтобы избежать ошибки при обращении к None объекту, необходимо предварительно проверить, что объект не является None, прежде чем обращаться к его элементам. Например, вы можете сделать проверку на None перед обращением к row[0]:
Таким образом, вы защитите свой код от ошибок, связанных с обращением к None объекту. Помните, что проверка на None является важной частью обработки данных в Python, чтобы избежать непредвиденных ситуаций и ошибок в вашем коде.