Задать вопрос
@fsdaer

Как обновить весь столбец sqlite3 python?

я вношу в поле date дату в формате YYYYMMDD далее с помощью datetime вычислю разницу в днях, и хочу записать эту разницу в днях в столбец days, но во все строки записывается только одно значение. Например в базе две строки с датой, разница выводится следующая 63c1853d48bdc297527943.png , но в обе строки в колонке days записывается 112, а не 57 в первую и 112 во вторую. Как сделать, чтобы в каждую строку записывалось свое значение?
import sys, sqlite3, os, time
from datetime import datetime

# Создание базы
try:
    sqlite_connection = sqlite3.connect('my_fin.db')
    create_table = '''CREATE TABLE IF NOT EXISTS my_table (
                                id INTEGER  PRIMARY KEY AUTOINCREMENT NOT NULL,
                                name TEXT,
                                summ INTEGER,
                                date TEXT,
                                percent INTEGER,
                                summ_percent INTEGER GENERATED ALWAYS AS ((summ*percent)/100) VIRTUAL,
                                days INTEGER,
                                con_summ INTEGER GENERATED ALWAYS AS (summ + summ_percent) VIRTUAL);'''

    cursor = sqlite_connection.cursor()
    cursor.execute(create_table)
    sqlite_connection.commit()
    cursor.close()

except sqlite3.Error as error:
    print("Ошибка при подключении к sqlite", error)
finally:
    if (sqlite_connection):
        print("Подключение к базе успешно")
        sqlite_connection.close() 
def days():
    sqlite_connection = sqlite3.connect('my_fin.db', detect_types=sqlite3.PARSE_DECLTYPES)
    cursor = sqlite_connection.cursor()
    sqlite_connection.row_factory = sqlite3.Row
    cursor.execute("SELECT date FROM my_table")
    q = cursor.fetchall()
    for qq in q:
        qq=''.join(qq)
        dt1 = datetime.now()
        dt2 = datetime(year=int(qq[0:4]), month=int(qq[4:6]), day=int(qq[6:8]))
        dt3 = dt2 - dt1
        dt3 = int(dt3.days)
        print(dt3)
        ds = ('''UPDATE my_table SET days = (?);''')
        cursor.execute(ds, (dt3,))
        sqlite_connection.commit()
  • Вопрос задан
  • 78 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Каждый раз проходя по циклу for ваш запрос UPDATE my_table SET days = (?); обновляет ВСЕ значения столбца days на ?. И в последней итерации цикла for в весь столбец записывается 112. Чтобы это исправить нужно добавить в SQL запрос WHERE id = ?, чтобы изменение применялось только к определенному id. Для реализации этого нужно еще и получать это самое значение id.
Итоговая функция days может выглядеть так:
def days():
    sqlite_connection = sqlite3.connect('my_fin.db', detect_types=sqlite3.PARSE_DECLTYPES)
    cursor = sqlite_connection.cursor()
    sqlite_connection.row_factory = sqlite3.Row
    cursor.execute("SELECT id, date FROM my_table")
    q = cursor.fetchall()
    for qq in q:
        date_id = qq[0]
        qq=''.join(qq[1])
        dt1 = datetime.now()
        dt2 = datetime(year=int(qq[0:4]), month=int(qq[4:6]), day=int(qq[6:8]))
        dt3 = dt2 - dt1
        dt3 = int(dt3.days)
        print(dt3)
        ds = ('''UPDATE my_table SET days = (?) WHERE id = (?);''')
        cursor.execute(ds, (dt3, date_id))
        sqlite_connection.commit()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Непонятно что автор хотел сделать. Может так. Я не проверял. Типы и функции может другие надо.

UPDATE my_table SET days = CURRENT_TIME - date;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы