Как в питон сделать так, чтобы в sqlite3 не было отрицательных чисел при изменении значения
Как в питон сделать так, чтобы в sqlite3 не было отрицательных чисел при изменении значения(проверку)
код:
@slash.slash(
name="takecash",
description="- вычесть количество ар",
guild_ids=[924384808187093032],
options=[
create_option(
name="member",
description="пользователь",
required=True,
option_type=6,
),
create_option(
name="amount",
description="количество аров",
required=True,
option_type=10,
),
]
)
@commands.has_any_role(971817475543035975)
async def takecash(ctx, member: discord.Member, amount:str):
if amount < 1:
await ctx.send(f"**{ctx.author}**, укажите сумму больше 1")
else:
cursor.execute("UPDATE users SET cash = cash - {} WHERE id = {}".format(amount, member.id))
connection.commit()
Ответы (4 шт):
Автор решения: Pavel.img
→ Ссылка
Как вариант, если пользователю не надо сообщать о превышении значения -
cursor.execute(f"UPDATE users SET cash = cash - {amount} WHERE id = {member.id} AND cash - {amount} > 0"
Автор решения: Alpensin
→ Ссылка
На уровне БД можно добавить
ALTER TABLE USERS
ADD CONSTRAINT checkCashIsPositive CHECK(CASH >= 0);
тогда БД не позволит ввести такое значение, выбросив исключение.
Автор решения: Namerek
→ Ссылка
Если прям наглядно, то можно вот так:
Такое решение даст возможность корректно обработать кейс (отправить сообщение пользователю, заблокировать аккаунт и т.д. и т.п.) не вызывая исключений в программе
from pathlib import Path
from sqlite3 import connect
conn = connect(Path('test.sqlite'))
cur = conn.cursor()
conn.execute(
"""
create table if not exists test
(
key integer primary key ,
val integer
);
"""
)
cur.execute(
"""
insert into test (key, val) VALUES (1, 150)
on conflict (key) do update set val = excluded.val;
"""
)
conn.commit()
for _ in range(20):
cur.execute(
"""
update test set val = val - ? where key = ? returning val;
""", [
20,
1
]
)
val, = cur.fetchone()
if val >= 0:
print(val)
conn.commit()
continue
else:
print('do something')
conn.rollback()
break
cur.execute(
"""
select val from test where key = ?;
""", [1]
)
val, = cur.fetchone()
print(
f'check val in db `{val = }`'
)
# 130
# 110
# 90
# 70
# 50
# 30
# 10
# do something
# check val in db `val = 10`
Автор решения: MayorLeon19
→ Ссылка
Решено: делаем переменную типа
member_cash = cursor.execute("SELECT cash FROM users WHERE id = {}".format(member.id)).fetchone()[0]
и потом
if amount > member_cash:
print('err')
else:
print('pass')