#python #database #sqlite #sql-execution-plan #peewee
#python #База данных #sqlite #sql-execution-plan #чибис
Вопрос:
Я использую Python (и Peewee) для подключения к базе данных SQLite. Мой уровень доступа к данным (DAL) представляет собой смесь функций peewee ORM и SQL. Я хотел бы включить ПЛАН ОБЪЯСНЕНИЯ для всех запросов при подключении к базе данных и переключить его с помощью параметра конфигурации или CLI… как я могу это сделать, используя Python API?
from playhouse.db_url import connect
self._logger.info("opening db connection to database, creating cursor and initializing orm model ...")
self.__db = connect(url)
# add support for a REGEXP and POW implementation
# TODO: this should be added only for the SQLite case and doesn't apply to other vendors.
self.__db.connection().create_function("REGEXP", 2, regexp)
self.__db.connection().create_function("POW", 2, pow)
self.__cursor = self.__db.cursor()
self.__cursor.arraysize = 100
# what shall I do here to enable EXPLAIN PLANs?
Ответ №1:
Это особенность интерактивной оболочки sqlite. Чтобы получить планы запросов, вам нужно будет явно запросить их. С Peewee это не совсем просто, потому что он использует параметризованные запросы. Вы можете получить SQL, выполняемый peewee, несколькими способами.
# Print all queries to stderr.
import logging
logger = logging.getLogger('peewee')
logger.addHandler(logging.StreamHandler())
logger.setLevel(logging.DEBUG)
Или для индивидуального запроса:
query = SomeModel.select()
sql, params = query.sql()
# To get the query plan:
curs = db.execute_sql('EXPLAIN ' sql, params)
print(curs.fetchall()) # prints query plan
Комментарии:
1. Спасибо! это уже рабочее решение. Я все еще надеялся, что смогу установить что-то на уровне соединения / курсора и вывести explain plans без необходимости добавлять EXPLAIN к каждому запросу в коде … в противном случае мне придется придумать общее решение для переключения EXPLAIN .
2. У вас действительно так много различных запросов, которые вам нужно проанализировать? Предположительно, они в основном будут следовать тому же плану или легко выводимому плану.