знач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 шт):

Автор решения: Andrey Tolstunov

Видимо вы просто создали 2 столбца, а пытаетесь вставить 3 значения Проверьте количество столбцов в таблице data выполнив запрос:

select * from data;

Предполагаю что в вашем случае вывод будет подобным:

name | age
-----+-----
Mike | 23

Дальше нужно добавить столбец в таблицу data:

ALTER TABLE data ADD gender VARCHAR;

и выполнить ваш код

→ Ссылка
Автор решения: Namerek
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()
→ Ссылка