Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 2, 2020 17:27:50

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

Пытаюсь выполнть запрос:

 db_connect()
sql = """UPDATE permissions SET deviceID='%s' WHERE userID='%d'""" % (mac, username)
data = (mac, username)
cursor.execute(sql, data)
con.commit()

выдает:
 Traceback (most recent call last):
  File "./auth.py", line 109, in <module>
    cursor.execute(sql, data)
  File "/opt/lib/python3.8/site-packages/pymysql/cursors.py", line 161, in execute
  File "/opt/lib/python3.8/site-packages/pymysql/cursors.py", line 140, in mogrify
TypeError: not all arguments converted during string formatting

проверял переменные mac и username: mac
 <class 'str'>

username
 <class 'int'>

Офлайн

#2 Ноя. 2, 2020 17:37:43

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

такой запрос тоже не проходит:

 cursor.execute("UPDATE permissions SET deviceID='{mac}' WHERE userID='{username}'")

в ответ ничего не выдает, хотя через print видно, что сам запрос правильный:
 UPDATE permissions SET deviceID='90:0e:b3:13:bc:50' WHERE userID='659605758501'

Офлайн

#3 Ноя. 2, 2020 22:59:19

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

Ты не должен питоном подставлять поля. Так может быть посажена уязвимость. В модулях для работы с СУБД обычно есть встроенные средства подстановки полей, которые принимают меры против уязвимостей. Это те же подстановки, только защищённые.

Если же питоном подставляешь, используй str.format() (она более развита, чем старый процент)

  
sql = """UPDATE permissions SET deviceID='{}' WHERE userID='{}'""".format(mac, username)

  
>>> mac = 123
>>> username = 'abc'
>>> sql = """UPDATE permissions SET deviceID='{}' WHERE userID='{}'""".format(mac, username)
>>> sql
"UPDATE permissions SET deviceID='123' WHERE userID='abc'"
>>>



Отредактировано py.user.next (Ноя. 2, 2020 23:00:34)

Офлайн

#4 Ноя. 3, 2020 16:11:18

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

попробовал, но к сожалению значение device ID в базе не обновляется, при этом никаких ошибок не выводится:

                                 print(mac)
                                print(type(mac))
                                print(username)
                                print(type(username))
                                print("Authentication success")
                                db_connect()
                                sql = """UPDATE permissions SET deviceID='{}' WHERE userID='{}'""".format(mac, username)
                                cursor.execute(sql)
                                con.commit()

при запуске выдает:
 90:0e:b3:13:bc:50
<class 'str'>
659605758501
<class 'int'>
Authentication success

и в БД остается старое значение.

Офлайн

#5 Ноя. 3, 2020 20:34:49

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1308
Репутация: +  112  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

ffrr
и в БД остается старое значение.
Зайди в базу данных и в самой базе данных выполни запрос с нужными данными,посмотри меняются ли значения,
Если поменялись,сделай этот же запрос средствами python пока без форматирования строки

Офлайн

#6 Ноя. 3, 2020 20:41:22

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

проверял делая запрос в самой БД-значения менялись. Как сделать запрос в python без форматирования строки ума не приложу)) уже столько вариантов перепробовал… Возмоно так?

 cursor.execute("UPDATE permissions SET deviceID='a4:3e:a0:b4:c6:ac' WHERE userID='659605758501'"

Офлайн

#7 Ноя. 4, 2020 10:55:14

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

попробовал и так:

 sql = """UPDATE permissions SET deviceID='a4:3e:a0:b4:c6:ac' WHERE userID='659605758501'"""
cursor.execute(sql)
con.commit()

и так:
 cursor.execute("UPDATE permissions SET deviceID='a4:3e:a0:b4:c6:ac' WHERE userID='659605758501'")

в обоих случаях тишина - не изменяется значение deviceID в БД.

Офлайн

#8 Ноя. 4, 2020 12:25:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

ffrr
в обоих случаях тишина - не изменяется значение deviceID в БД.
Выполни каждую строку как в консоли, так и в питоне
 SELECT * FROM permissions WHERE userID='659605758501';
 SELECT * FROM permissions WHERE userID=659605758501;
Убедись, что питон возвращает то же, что и консоль.



Офлайн

#9 Ноя. 4, 2020 13:31:42

ffrr
Зарегистрирован: 2020-10-22
Сообщения: 69
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

В консоли эти 2 команды возвращают всю строку из БД. А питон возвращает:

   File "./auth.py", line 118
    cursor.execute("SELECT * FROM permissions WHERE userID='659605758501'")                 
                                                                                           ^
TabError: inconsistent use of tabs and spaces in indentation
и
   File "./auth.py", line 119
    cursor.execute("SELECT * FROM permissions WHERE userID=659605758501")                 
                                                                                         ^
TabError: inconsistent use of tabs and spaces in indentation

Офлайн

#10 Ноя. 5, 2020 03:39:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

запрос UPDATE к mariadb

ffrr
В консоли эти 2 команды возвращают всю строку из БД.
Хорошо.

Теперь в питоне выполни
 SELECT * FROM permissions WHERE userID=659605758501;
Только запиши правильно. Очисти все пробелы в концах строк в коде.



Отредактировано py.user.next (Ноя. 5, 2020 03:39:20)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version