Я совершенно не знаком с модулем sqlite3 Python (и SQL в целом), и это меня полностью ставит в тупик. Странным также кажется обильное отсутствие описаний cursor
предметов (точнее, их необходимости).
Этот фрагмент кода является предпочтительным способом работы:
import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()
Этого нет, хотя он работает так же хорошо и без (казалось бы, бессмысленного) cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
Кто-нибудь может сказать мне, зачем мне нужен cursor
?
Это просто кажется бессмысленным. Для каждого метода в моем скрипте, который обращается к базе данных, я должен создать и уничтожить cursor
?
Почему бы просто не использовать connection
объект?
Вам нужен объект курсора для получения результатов. Ваш пример работает, потому что он
INSERT
и, следовательно, вы не пытаетесь вернуть из него какие-либо строки, но если вы посмотритеsqlite3
документы , вы заметите, что нет никаких.fetchXXXX
методов для объектов подключения, поэтому, если вы попытались сделать aSELECT
без курсора у вас не было бы возможности получить результирующие данные.Объекты курсора позволяют вам отслеживать, какой набор результатов есть, поскольку можно выполнить несколько запросов, прежде чем вы закончите получение результатов первого.
источник
execute
объект подключения, этоsqlite3
расширение.Согласно официальной документации
connection.execute()
, это нестандартный ярлык, который создает промежуточный объект курсора:источник
( документация sqlite3 ; курсив мой.)
Поскольку эти методы объекта подключения нестандартны , то есть они не являются частью спецификации Python Database API версии 2.0 (PEP 249).
Пока вы используете стандартные методы объекта Cursor, вы можете быть уверены, что если вы переключитесь на другую реализацию базы данных, которая соответствует указанной выше спецификации, ваш код будет полностью переносимым. Возможно, вам нужно будет только поменять
import
строчку.Но если вы используете,
connection.execute
есть шанс, что переключение не будет таким простым. Это основная причина, по которой вы можете захотеть использоватьcursor.execute
вместо этого.Однако, если вы уверены, что не собираетесь переключаться, я бы сказал, что вполне нормально использовать
connection.execute
ярлык и действовать «эффективно».источник
Это дает нам возможность иметь несколько отдельных рабочих сред через одно и то же соединение с базой данных.
источник