Инициализация и проверка записи в бд. Python, sqlite3

Есть скрипт, в нем три функции. Первая инициализирует бд, вторая вставляет запись в бд, третья проверяет есть ли запись в бд.

В теории все должно работать так. Но на практике функция проверки записей возвращает значение из бд только со второго запуска.

Вот код:

import os
import sqlite3

conn = sqlite3.connect(os.path.join('test_db.db'))
cursor = conn.cursor()


def init_db():
    with open('create_test_db.sql', 'r') as f:
        sql = f.read()
    cursor.executescript(sql)
    conn.commit()
    print('bd is init')


def test_query():
    cursor.execute("INSERT INTO test_table("
                        "t1)"
                        "VALUES("
                        "100)")
    conn.commit()
    fetch = cursor.fetchone()
    print(fetch)  # Всегда None. Почему?


def test_check():
    info = cursor.execute("SELECT t1 FROM test_table;")
    fetch = info.fetchone()
    if info.fetchone() is None:
        print('empty')  # Здесь в первый запуск None. Только повторный запрос возвращает значение.
    else:
        print(fetch)


init_db()
test_query()
test_check()

В sql скрипте вот такая запись:

CREATE TABLE IF NOT EXISTS test_table(
    date DATA DEFAULT CURRENT_DATE,
    t1 INT DEFAULT 0,
    t2 INT DEFAULT 0,
    t3 INT DEFAULT 0
);

Основной вопрос такой: почему test_check() возвращает None в первый запуск. Ведь test_query() вносит данные в табличку до запроса информации (хотя fethc все-равно всегда отдает None, что тоже весьма интересно).


Ответы (1 шт):

Автор решения: Roman-Stop RU aggression in UA

в test_check вы вызываете fetchone() два раза и первый результат (т.е. первую запись) игнорируете. По-этому, работает только со второго раза, т.е. когда вставится вторая запись. Измените на:

def test_check():
    info = cursor.execute("SELECT t1 FROM test_table;")
    fetch = info.fetchone()
    if fetch is None:
        print('empty')  # Здесь в первый запуск None. Только повторный запрос возвращает значение.
    else:
        print(fetch)

Ну а в test_query значение всегда None потому, что вы выполнили запрос INSERT, который не возвращает записей, потому fetchone возвращает None.

→ Ссылка