Вставьте в таблицу в sqlite3 и python.Волшебство ключевого слова "с" - PullRequest
0 голосов
/ 07 марта 2019

Я слежу за этим sqlite3 для учебника по питону.

Я пытаюсь вставить строку в таблицу с помощью этого сценария:

conn = sqlite3.connect(database)

sql = ''' INSERT INTO projects(name,begin_date,end_date)
              VALUES(?,?,?) '''    
project = ('X', '2015-01-01', '2015-01-30');

cur = conn.cursor()
cur.execute(sql,project)

conn.close()

Я могу запустить его без ошибок, но строка не вставлена.

Хотя строка вставляется при использовании with:

with conn:
    sql = ''' INSERT INTO projects(name,begin_date,end_date)
                  VALUES(?,?,?) '''    
    project = ('X', '2015-01-01', '2015-01-30');

    cur = conn.cursor()
    cur.execute(sql,project)

Кто-нибудь знает, что происходит?

UPDATE

Я нашел в docs.python.org что после одного или нескольких execute утверждений каждый делает commit, как в

cur.execute(sql, project)
conn.commit()

и все идет хорошо.

Но, тем не менее, я был бы очень признателен за некоторое техническое объяснение ключевого слова with 1030 *.

1 Ответ

1 голос
/ 07 марта 2019

Но, тем не менее, я был бы очень признателен за некоторое техническое объяснение с ключевым словом

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

Это объясняется в sqlite3API doc :

Использование соединения в качестве менеджера контекста

Объекты соединения могут использоваться в качестве менеджеров контекста, которые автоматически фиксируют или откатывают транзакции.В случае исключения транзакция откатывается;в противном случае транзакция совершается:

import sqlite3

con = sqlite3.connect(":memory:")
con.execute("create table person (id integer primary key, firstname varchar unique)")

# Successful, con.commit() is called automatically afterwards
with con:
    con.execute("insert into person(firstname) values (?)", ("Joe",))

# con.rollback() is called after the with block finishes with an exception, the
# exception is still raised and must be caught
try:
    with con:
        con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
    print("couldn't add Joe twice")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...