Форум сайта python.su
Пытаюсь выполнть запрос:
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
<class 'str'>
<class 'int'>
Офлайн
такой запрос тоже не проходит:
cursor.execute("UPDATE permissions SET deviceID='{mac}' WHERE userID='{username}'")
UPDATE permissions SET deviceID='90:0e:b3:13:bc:50' WHERE userID='659605758501'
Офлайн
Ты не должен питоном подставлять поля. Так может быть посажена уязвимость. В модулях для работы с СУБД обычно есть встроенные средства подстановки полей, которые принимают меры против уязвимостей. Это те же подстановки, только защищённые.
Если же питоном подставляешь, используй 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)
Офлайн
попробовал, но к сожалению значение 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
Офлайн
ffrrЗайди в базу данных и в самой базе данных выполни запрос с нужными данными,посмотри меняются ли значения,
и в БД остается старое значение.
Офлайн
проверял делая запрос в самой БД-значения менялись. Как сделать запрос в python без форматирования строки ума не приложу)) уже столько вариантов перепробовал… Возмоно так?
cursor.execute("UPDATE permissions SET deviceID='a4:3e:a0:b4:c6:ac' WHERE userID='659605758501'"
Офлайн
попробовал и так:
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'")
Офлайн
ffrrВыполни каждую строку как в консоли, так и в питоне
в обоих случаях тишина - не изменяется значение deviceID в БД.
SELECT * FROM permissions WHERE userID='659605758501';
SELECT * FROM permissions WHERE userID=659605758501;
Офлайн
В консоли эти 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
Офлайн
ffrrХорошо.
В консоли эти 2 команды возвращают всю строку из БД.
SELECT * FROM permissions WHERE userID=659605758501;
Отредактировано py.user.next (Ноя. 5, 2020 03:39:20)
Офлайн