Проблема с получением id? у pymysql
В моем коде есть функция, с помощью которой я проверяю: есть ли id пользователя в данной базе данных, или нет. Теоретически, когда пользователь отправляет сообщение, бот проверяет айди участника в базе данных, и если его нет - он записывает его туда.
Проблема заключается в том, что при написании сообщения пользователем, который есть в бд, бот все равно пытается закинуть айди участника в бд, получая следующее:
pymysql.err.IntegrityError: (1062, "Duplicate entry '418**********' for key 'users.PRIMARY'")
Все бы ничего, но данное сообщение серьезно засоряет консоль при написании любого сообщения. Прошу помочь мне разобраться в данном недоразумении. Заранее спасибо!
Код:
@bot.event
async def on_message(ctx):
with db.cursor() as cur:
cur.execute(f"select * from users where id = {ctx.author.id}")
myresult = cur.fetchone()
if ctx.author.id == myresult:
pass
else:
if ctx.author.id == myresult:
pass
else:
with db.cursor() as curs:
sqladd = "INSERT INTO users (id, level, exp) VALUES (%s, %s, %s)"
valadd = (ctx.author.id, 1, 1)
curs.execute(sqladd, valadd)
db.commit()
Ответы (1 шт):
fetchone возвращает кортеж (англ. tuple). Так что проверка в таком виде, как сейчас у вас никогда не будет работать.
Нужно или брать элемент кортежа (а для этого нужно знать его индекс, а * может вернуть колонки в произвольном порядке, упрощенно говоря):
cur.execute(f"select id from users where id = {ctx.author.id}")
myresult = cur.fetchone()
if ctx.author.id == myresult[0]
# нашли
else:
# не нашли
Или так (fetchone вернет None если запрос ничего не вернул):
cur.execute(f"select id from users where id = {ctx.author.id}")
myresult = cur.fetchone()
if myresult is None:
# не нашли
else:
# нашли
Ну и еще, лучше не использовать манипуляции со строками, так как это небезопасно. Запрос делайте со связываемыми переменными:
cur.execute("select id from users where id = %s", (ctx.author.id,))