@Phys_Math_Man

Почему DB browser for sqlite и питон выдают разные результаты запроса?

import sqlite3 as sq

with sq.connect("database.db") as con:
    cur = con.cursor()
    cur.execute("DROP TABLE IF EXISTS my_tab")
    cur.execute("""CREATE TABLE IF NOT EXISTS my_tab (
                   id INTEGER)""")
    for i in range(5):
        cur.execute(f"INSERT INTO my_tab (id) VALUES ({i})")

cur1 = con.cursor()
cur1.execute(f"INSERT INTO my_tab (id) VALUES (200)")

print(cur.execute("SELECT * FROM my_tab").fetchall())


В консоли питона при этом вывод [(0,), (1,), (2,), (3,), (4,), (200,)], а в DB browser в результате этого запроса запись id = 200 отсутствует. И, мне кажется, она и должна отсутствовать, потому что после выхода из with объект con был закрыт. Но почему fetchall выдает такой результат, и почему при попытке обратиться к закрытому соединению не возникает никаких исключений?
  • Вопрос задан
  • 164 просмотра
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
контекстный менеджер делает commit но не закрывает базу. То есть ты должен закрывать соединение самостоятельно close(). https://docs.python.org/3/library/sqlite3.html#sql...
например
import sqlite3
con = sqlite3.connect("tutorial.db")
cur = con.cursor()
cur.execute("CREATE TABLE movie(title, year, score)")
cur.execute("""
    INSERT INTO movie VALUES
        ('Monty Python and the Holy Grail', 1975, 8.2),
        ('And Now for Something Completely Different', 1971, 7.5)
""")
#con.commit()
print(cur.execute("SELECT * FROM movie").fetchall())

insert открывает транзакцию, которая должна быть подтверждена commit (запусти сначала так), а потом раскоментируй и тогда в базу все запишется.
выводит он то что не закомиченно, потому что объект содержит информацию. Еще раз контекстный менеджер делает commit но не закрывает соединение. В доках об этом прямо сказано.

То есть у тебя только один commit (не явный посредством контекстного менеджера коммитит все что в теле контекстного менеджера) и два insert (второй то вне тела контекстного менеджера), соответственно последний insert не записывается в базу.

Ну и это к твоему вопросу не относится, тут каждый раз об этом говорят, правильно вставляй значения в таблицу без форматирования строк.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы