#sqlite
#sqlite
Вопрос:
Я работаю над инструментом, который позволяет разработчикам Python писать pythonic код для взаимодействия с базой данных sqlite3, аналогично sqlalchemy, но без фазы «перевода». Если я могу сгенерировать подготовленный оператор sqlite3, как я могу напрямую передать его в систему оценки?
В качестве грубого примера, вот как я примерно представляю, как пользователь может взаимодействовать с моим инструментом:
myTable = Table("field1", "field2", "field3")
mytable.insert("foo", "bar", "baz")
select = mytable.select("field1")
---------------
print(select)
>>> ["foo"]
Комментарии:
1. Разве Python не поставляется с библиотекой SQLite3, которая позволяет им «писать pythonic code»?
2. Вы правы, но это все равно требует от вас записи ваших операторов sql. Я думал о создании абстракции, которая, очень грубо говоря, позволяет пользователю создавать объекты python, которые представляют объекты SQL в sqlite3 следующим образом: mytable = Table(«field1», «field2», «field3»); mytable.insert(«foo», «bar», «baz»); select = mytable . выберите («field1»);
3. Это похоже на то, чтобы отбросить большую часть возможностей SQL для небольшой выгоды. Кроме того, я не вижу, как подготовленные операторы и байт-код помогут здесь, если только ваш план не состоит в том, чтобы обойти сам компилятор SQL. Который… почему вы используете SQLite, если не хотите использовать SQL?
4. И если вы хотите обойти SQL, вы можете просто
mytable
сохранить имя таблицы, а также иметь.insert
и.select
создавать команды SQL вместо байт-кода SQLite. Но опять же, если вы не используете выразительные возможности SQL в запросах, похоже, вам нужна база данных NoSQL.
Ответ №1:
В SQLite3 нет (общедоступного) API, который позволяет выполнять предварительно созданный байт-код SQLite. Байт-код для инструкции SQL можно просмотреть с EXPLAIN
помощью команды SQL, но это предназначено для целей отладки и обучения, а не для того, что вы пытаетесь сделать.
И для большинства целей вам это не нужно. Если вы чувствуете, что время, потраченное на компиляцию подготовленного оператора, будет обременительным, sqlite3_stmt
объекты могут храниться в течение всего срока действия sqlite3
соединения с базой данных, с помощью которого оно было создано. Подготовленные инструкции, которые были выполнены, можно сбросить, что позволит им выполняться снова. Таким образом, пока существует соединение с базой данных, вы можете скомпилировать инструкцию один раз и использовать ее столько раз, сколько вам нужно.
Но это все. Не существует механизма сохранения подготовленного оператора после истечения срока действия sqlite3
соединения. Вы не можете извлечь байт-код с помощью любого общедоступного API, и вы не можете использовать некоторый байт-код, который вы получили, для восстановления подготовленного оператора.
Если вам нужна сохраняемость за пределами соединения, вам нужно сохранить текст инструкции SQL в любом месте, которое вы хотите сохранить, а затем просто перекомпилировать подготовленную инструкцию при повторном подключении к базе данных. Эта одна перекомпиляция (или несколько, в зависимости от того, сколько вы храните) не должна быть особой нагрузкой, в зависимости от срока службы вашего приложения.