значeния словаря в sql базу
Всем привет, можете подсказать, как добавить значения словаря в sql базу, пробовал через INSERT вставить значения при помощи метода dict.get(), но ничего не вышло.
В общем, бд нужна для aiogram бота, значения, которые я хочу добавить в базу, это три "ответа" пользователя из машины состояний 'FSM', поэтому всё в словаре
Для реализации я просто написал класс c методом, который попросту добавляет значения параметров в базу:
class Add():
def add_name(self,name, age, gender):
cur.execute('INSERT INTO data VALUES(?,?,?)', (name, age, gender))
base.commit()
А сам метод использую так: add = Add()
await add.add_name(data['name'], data['age'], data['gender'])
Так вот при окончании работы FSM, вылетает вот эта ошибки связанная с sql:
File "C:\Users*\PycharmProjects\bot\sqlighter.py", line 12, in add_name cur.execute('INSERT INTO data VALUES(?,?,?)', (name, age, gender)) sqlite3.OperationalError: table data has 2 columns but 3 values were supplied
Думаю проблема в том, что таблица не обновляется после этих изменений
Ответы (2 шт):
Видимо вы просто создали 2 столбца, а пытаетесь вставить 3 значения Проверьте количество столбцов в таблице data выполнив запрос:
select * from data;
Предполагаю что в вашем случае вывод будет подобным:
name | age
-----+-----
Mike | 23
Дальше нужно добавить столбец в таблицу data:
ALTER TABLE data ADD gender VARCHAR;
и выполнить ваш код
from sqlite3 import connect
with connect('new_db.sqlite') as cnn:
cnn.execute(
"""
create table if not exists data
(
id INTEGER
primary key autoincrement,
name TEXT,
age INT,
gender TEXT
);
""")
cnn.execute(
"""
create unique index if not exists data_name_uindex
on data (name);
"""
)
user = {
'user_name': 'User1',
'user_age': 25,
'user_gender': 'male'
}
Один словарь:
cr = cnn.cursor()
try:
cr.execute(
"""
INSERT INTO data (name, age, gender)
VALUES (:user_name, :user_age, :user_gender)
on conflict (name) do
update
set age = excluded.age
""",
user
)
except Exception:
cnn.rollback()
cr.close()
raise
else:
cnn.commit()
cr.close()
Список словарей:
users = [{
'user_name': 'User1',
'user_age': 26,
'user_gender': 'male'
},
{
'user_name': 'User2',
'user_age': 18,
'user_gender': 'female'
}
]
cr = cnn.cursor()
try:
cr.executemany(
"""
INSERT INTO data (name, age, gender)
VALUES (:user_name, :user_age, :user_gender)
on conflict (name) do
update
set age = excluded.age;
""",
users
)
except Exception:
cnn.rollback()
cr.close()
raise
else:
cnn.commit()
cr.close()