Инициализация и проверка записи в бд. 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 шт):
в 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.