Изменение данных в sql через ТГ
Подскажите плиз. Как переписывать значения в базе. Есть бот, который заносит информацию в базу данных. Как сделать что бы в случае когда пользователь по второму разу вносит данные (в случае их измениния к примеру) в базе находился пользователь с таким id и информация менялась. Сейчас мне просто сообщается что пользователь с таким id уже существует и ничего не происходит. Вот что из кода у меня есть в данный момент (касаемо работы с БД)
async def create_connection(path):
connection = None
try:
connection = sqlite3.connect(".\\sm_app.sqlite")
print("Connection to SQLite DB successful")
except Error as e:
print(f"The error '{e}' occurred")
return connection
connection = create_connection(".\\sm_app.sqlite")
conn = sqlite3.connect(r'.\\sm_app.sqlite', check_same_thread=False)
cursor = conn.cursor()
async def db_table_val(user_id: int, user_name: str, user_old: int, user_rest: str):
cursor.execute('INSERT INTO user (user_id, user_name, user_old, user_rest) VALUES (?, ?, ?, ?)',
(user_id, user_name, user_old, user_rest))
conn.commit()
пока внесение информации сильно топорное, как разберусь как переписывать строчки, буду прикручивать FSM, пока просто записываю инфу в базу
async def get_text_messages(message):
if message.text.lower() == 'привет':
await message.message.answer('Привет! Ваше имя добавленно в базу данных!')
us_id = message.from_user.id
us_name = message.from_user.first_name
user_old = 13
user_rest = 'ггм'
await bd.db_table_val(user_id=us_id, user_name=us_name, user_old=user_old, user_rest=user_rest)
поле юзер_ид помечено как уникальное. Я полагаю логика такая циклом пробегаемся по столбцу user_id, если находим совпадения но заполняем вносим информацию в оставшиеся 3 поля, если совпадений нет, то создаём новую запись. пока придумал что то подобное, но не понимаю, как просмотреть весь столбец. Не могу найти
async def db_table_val(user_id: int, user_name: str, user_old: int, user_rest: str):
y: int = 0
for x in ???? :
if x == user_id:
cursor.execute('''UPDATE user user_name = user_name, user_old = user_old, user_rest = user_rest;''')
y = 1
break
if y == 0:
cursor.execute('INSERT INTO user (user_id, user_name, user_old, user_rest) VALUES (?, ?, ?, ?)',
(user_id, user_name, user_old, user_rest))
conn.commit()
но вот как это прописать не понимаю.
Ответы (2 шт):
Циклом проходить по БД не нужно, это будет очень не эффективно, можно просто попробовать извлечь нужное значение, раз у нас есть индекс:
q = 'SELECT user FROM user WHERE user_id = ?'
my_cursor = connection.execute(q, (user_id,))
row = cursor.fetchone()
if row is None:
cursor.execute('INSERT ...', ...)
else
cursor.execute('REPLACE ...', ...)
А в SQLite можно поступить ещё хитрее, использовать операцию INSERT OR REPLACE :) Кстати, в некоторых других СУБД эта операция называется UPSERT.
@AivanF Спасибо за наводку, после долгих мытарств и экспериментов нашел таки как это сделать. Всё оказалось проще, достаточно было сделать
cursor.execute('REPLACE INTO user (user_id, user_name, user_old, user_rest) VALUES (?, ?, ?, ?)',
(user_id, user_name, user_old, user_rest))
Оказывается REPLASE проверят БД и при совпадении ключевого поля эту строку просто переписывает с новыми значениями, а если совпадения нет, то создаёт новую запись. По крайней мере я так понял