Использование методов быстрого доступа:
Объекты
Cursor
создаются неявно и эти методы быстрого вызова возвращают объекты курсора. Таким образом, можно выполнить инструкцию
SELECT
и выполнить
итерацию напрямую, используя только один вызов объекта
Connection
.
import sqlite3
persons = [
("Hugo", "Boss"),
("Calvin", "Klein")
]
con = sqlite3.connect(":memory:")
# Создать таблицу
con.execute("create table person(firstname, lastname)")
# Заполнить таблицу
con.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
# Распечатать содержимое таблицы
for row in con.execute("select firstname, lastname from person"):
print(row)
print("I just deleted", con.execute("delete from person").rowcount, "rows")
# close() не является ярлыком и не вызывается автоматически,
# поэтому объект соединения должен быть закрыт вручную
con.close()
Доступ к столбцам по имени:
Строки, заключенные в этот класс, могут быть доступны как по индексу - как
кортежи, так и по имени без учета регистра символов:
import sqlite3
con = sqlite3.connect(":memory:")
con.row_factory = sqlite3.Row
cur = con.cursor()
cur.execute("select 'John' as name, 42 as age")
for row in cur:
assert row[0] == row["name"]
assert row["name"] == row["nAmE"]
assert row[1] == row["age"]
assert row[1] == row["AgE"]
con.close()
Использование менеджера контекста соединения:
Объекты соединения могут использоваться как контекстные менеджеры, которые автоматически фиксируют или откатывают транзакции. В случае исключения транзакция откатывается, в противном случае сделка совершается:
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("create table person (id integer primary key, firstname varchar unique)")
# впоследствии `con.commit()` вызывается автоматически
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
# `con.rollback()` вызывается после завершения блока `with` с исключением.
# исключение все еще вызывается и должно быть перехвачено
try:
with con:
con.execute("insert into person(firstname) values (?)", ("Joe",))
except sqlite3.IntegrityError:
print("couldn't add Joe twice")
# Объект соединения, используемый в качестве диспетчера контекста,
# только фиксирует или откатывает транзакции, поэтому объект
# соединения должен быть закрыт вручную
con.close()