Как и когда выполнять оператор PRAGMA в SQLite?

Я использую SQLite. Мне просто интересно, как и когда выполнить статус PRAGMA в sqlite.

Например, я хочу выполнить:

PRAGMA schema.journal_mode = OFF;

Основываясь на документе в https://www.sqlite.org/pragma.html#pragma_journal_mode, я думаю, мне следует выполнить его после sqlite3_open () и перед созданием любых таблиц. Поэтому я просто вызываю sqlite3_prepare_v2 () и sqlite3_step () для выполнения вышеуказанной PRAGMA, чтобы повысить производительность операций с базой данных. Однако после заявления PRAGMA кажется, что ничего не изменилось, и производительность не улучшилась.

В таком случае, как я могу узнать, выполняется ли оператор PRAGMA и вступает ли он в силу?

Спасибо

Вы используете буквальное слово «схема»? Это должно быть «main» или имя другой присоединенной базы данных (или просто не указывать его).

Shawn 28.10.2018 04:20

На самом деле я вообще не использую схему, мое утверждение PRAGMA journal_mode = OFF;

alancc 28.10.2018 04:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
1 518
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Многие из Pragma будут возвращать установленное значение, кроме того, просто используя Pragma, без параметра будет возвращать текущее значение (в некоторых случаях только последний будет возвращать статус / текущее значение).

PRAGMA journal_mode = OFF вернет результат офф. PRAGMA journal_mode вернет текущее значение, не влияя на него.

Так что просто действуйте так, как будто это запрос, имя столбца в наборе результатов во многих случаях будет таким же, как и прагма, в которой выполняется действие. Те, которые возвращают несколько столбцов, такие как database_list, будут возвращать столбцы, специфичные для прагмы.

например

PRAGMA journal_mode;
PRAGMA journal_mode = OFF;
PRAGMA journal_mode;
PRAGMA journal_mode = DELETE;
PRAGMA journal_mode;

приводит к: -

Спасибо. Есть ли другие способы проверить, выключен журнал или нет? Например, SQLite сохранит журнал в определенном каталоге с определенным именем, после чего я могу проверить наличие этого файла журнала, чтобы убедиться, что журнал отключен.

alancc 29.10.2018 10:40

Ненадежно, потому что файл журнала не обязательно должен существовать, поскольку по умолчанию используется DELETE, поэтому его отсутствие не обязательно означает, что он отключен. Временные файлы, используемые SQLite (см. 2.1)

MikeT 29.10.2018 11:12

Когда я использую «PRAGMA synchronous = OFF;», оператор НЕ возвращает никакого результата. Как я могу узнать, что параметр установлен правильно?

alancc 30.10.2018 04:07

Думаю, как "PRAGMA journal_mode = OFF;" и "PRAGMA synchronous = OFF;" должно выполняться после открытия базы данных и до создания таблиц, это правильно?

alancc 30.10.2018 04:08

Используйте PRAGMA synchronous;, чтобы получить результаты. Обратите внимание, что результат является числовым, например 0 = Выключенный и т. д. В соответствии с документацией. Я не верю, что таблицы существуют или не имеют значения. скорее, никакие транзакции не должны быть незавершенными. Но лучше использовать как можно скорее после открытия соединения.

MikeT 30.10.2018 05:08

Я использую sqlite3_step для подготовленного оператора «PRAGMA synchronous = OFF;», но он возвращает SQLITE_DONE вместо SQLITE_ROW, что означает, что данные не возвращаются. Я также пробую его в оболочке sqlite3, но также ничего не возвращает.

alancc 01.11.2018 00:02

@alancc прочитайте комментарий, например. sql = "PRAGMA synchronous;"; rc = sqlite3_exec(db,sql,callback,0,&zErrMsg); приводит к синхронный = 2 (т.е. значения в столбце синхронный равны 2, что соответствует НОРМАЛЬНОМУ (в данном случае)). В отличие от sql = "PRAGMA synchronous = OFF;"; rc = sqlite3_exec(db,sql,callback,0,&zErrMsg);, который не возвращает столбец результата синхронно. Отметьте этот вопрос как ответ.

MikeT 01.11.2018 02:14

Большое тебе спасибо. Я понял.

alancc 01.11.2018 02:34

В принципе, лучше всего попробовать без каких-либо параметров / значений / настроек запросить статус / значение и предоставить только параметр / значение / настройку при изменении (хотя не уверен, что правило является 100% пуленепробиваемым).

MikeT 01.11.2018 02:53

Другие вопросы по теме