Есть ли какой-нибудь хороший способ передать байт-код непосредственно в sqlite3?

#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 в любом месте, которое вы хотите сохранить, а затем просто перекомпилировать подготовленную инструкцию при повторном подключении к базе данных. Эта одна перекомпиляция (или несколько, в зависимости от того, сколько вы храните) не должна быть особой нагрузкой, в зависимости от срока службы вашего приложения.