На пути к лучшему dbDelta | W-Shadow.com
Когда дело доходит до создания и обновления таблиц базы данных, WordPress имеет очень удобную вспомогательную функцию — dbDelta. Теоретически эта функция может принимать один или несколько запросов CREATE TABLE, сравнивать их с таблицами, уже находящимися в базе данных, и автоматически выяснять, как обновить их, добавляя или изменяя столбцы и индексы по мере необходимости.
На практике dbDelta
является хрупким, недокументированным и склонным к скрытому сбою, когда что-то пойдет не так. Он может только анализировать запросы, адаптированные к его идиосинкразическим требованиям, не знает, как удалить устаревшие столбцы, не знает о наборах символов и сопоставлении, давится лишними пробелами… Неприятно, но очевидно Good Enough™ для большинства плагинов, даже для самого WordPress. Это все же лучше, чем обновлять схему вручную, и в большинстве случаев вы можете обойти ограничения.
Опять же, иногда нельзя. Буквально несколько дней назад я столкнулся с ситуацией, с которой dbDelta
просто не справился (из-за вышеупомянутой неосведомленности о сопоставлении). Это побудило меня реорганизовать dbDelta во что-то более гибкое. Результатом стал класс blcTableDelta
, все еще несколько привередливый в отношении синтаксиса запросов, но гораздо более гибкий в остальном.
В оставшейся части этого сообщения обсудите, как моя версия сравнивается со встроенной функцией dbDelta, объясните, как ее использовать, и предоставьте исходный код.
Преимущества
Моя версия dbDelta ни в коем случае не идеальна – или, если на то пошло, даже особенно хороша . Для этого потребуется реализовать полноценный синтаксический анализатор SQL, что явно излишне для служебной функции, которая вызывается только один или два раза за установку. Вместо этого это просто Better Enough ™ . Вот как работает blcTableDelta по сравнению с dbDelta:
- Более снисходительно к пробелам — больше никаких нелепых требований вроде «между словами PRIMARY KEY и определением вашего первичного ключа должно быть ровно два пробела».
- Обнаруживает изменения не только в типе данных столбца, но также в настройках сортировки и флагах NULL/NOT NULL/AUTO INCREMENT.
- При необходимости можно удалить устаревшие столбцы и индексы.
- Возвращает полный журнал запросов, включая статус выполнения и любые сообщения об ошибках MySQL.
- Не задыхается от «ЕСЛИ НЕ СУЩЕСТВУЕТ».
- Имеет немного лучшую документацию.
Недостатком является то, что этот класс не так хорошо протестирован, как родная функция dbDelta. Он также не поддерживает запросы INSERT.
Использование
Вот простой пример использования класса blcTableDelta
:
//Определите структуру таблицы, которую вы хотите получить.
$sql =
Функция возвращает массив из двух элементов. Первый элемент представляет собой список удобочитаемых сообщений, объясняющих, какие изменения схемы необходимо выполнить для обновления базы данных. Второе возвращаемое значение — это журнал запросов. Каждый элемент массива журнала запросов также является массивом, содержащим до трех ключей:
- «запрос» — сгенерированный SQL-запрос.
- «успех» — флаг True/False, указывающий, успешно ли выполнен запрос. Присутствует, только если для аргумента $execute установлено значение True.
- «error_message»
Исходный код
Исходный код слишком длинный для включения в пост, поэтому я поместил его в отдельный ZIP-архив. Загрузите его здесь. Просто поместите найденный файл .php куда-нибудь в каталог вашего плагина и включите
его перед вызовом blcTableDelta::delta
.
Похожие сообщения :
Эта запись была опубликована в четверг, 29 июля 2010 г., в 17:17 и размещена в рубрике Разработка WordPress. Вы можете следить за любыми ответами на эту запись через ленту RSS 2.0. Вы можете оставить отзыв или вернуться со своего сайта.
Добавление персонализированных таблиц (dbDelta())
Частная тема или расширение для соответствующих таблиц.
Les nouvelles table seront ajoutées à la base de données WordPress на том сайте, на котором можно найти toutes les données dont il besoin à partir d’une seule base de données.
En effet, si on avait creé une deuxième base de données, il aurait fallu créer un autre objet pour interroger cette BD. Вы можете получить код неиспользуемого комплекса, который является предпочтительным для размещения таблиц в оригинальном BD на вашем сайте WordPress.
▼Publicité Le texte se poursuit plus bas
dbDelta()
Функция dbDelta() позволяет создавать и измерять рабочие таблицы, которые интересны и эффективны.
Внимание: модификатор il ne faut jamais la framework des table qui font partie du noyau de WordPress.
Si vous le faites, vous risquez de perdre vos модификации lors de la prochaine mise à jour.
Идея базы данных dbDelta() соответствует :
- Если таблица не существует, то она представляет собой предлагаемую структуру.
- Существует таблица, структура которой сравнима с предлагаемой структурой:
- Les nouveaux champs sont ajoutés.
- Les champs qui diffèrent dans leur type ou dans leur longueur sont ajustés.
- Si le nom d’un champ est modifié, un nouveau champ sera creé avec le nouveau nom. L’ancien champ demeurera inchangé.
- dbDelta() не используется в существующей таблице.
Функция dbDelta() была создана на стороне нового WordPress. Это определение находится в файле wp-admin/includes/upgrade.php. Il faut donc ajouter une инструкция
Значение возврата dbDelta() не используется. Pourtant, elle permet de savoir ce qui a été réalisé dans la structure de la table, par exemple :
[gds5_monprefixebd_matable] => Created table gds5_monprefixebd_matable]
ou
[gds5_monprefixebd_matable.nouveauchamp] => Added column gds5_monprefixebd_matable.nouveauchamp
À quel moment les table personnalisées doivent-elles être créées?
Le meilleur endroit pour creer les table personalisées est lors de l’activation du theme ou de l’extension. Le code sera donc place à l’un des endroits suivants:
Если таблицы не используются по теме, на крючке after_switch_theme в файле functions.
Si les tables sont utilisées par une extension, on utilisera la fonction r egister_activation_hook() в классе расширения. Например, соответствующий пример, приложение для register_activation_hook() вместо конструктора класса. Метод creer_tables() является автоматическим определением класса расширения.
Внимание: Lors de Développement de wortre thème ou de wortre extension, si vous créez des tables en utilisant
Ce problème ne se posera pas lorsqu’un autre site utilisera votre theme ou votre extension: dès qu’il l’activera, la fonction de rappel sera exécutée.
Определение структуры таблицы и ее создание с помощью dbDelta()
Проверка конфликтов с расширениями или настройками WordPress, особенно важные меры предосторожности:
Notez que dans la plupart des cas, ce préfixe sera le même que celui utilisé pour assurer que vos fonctions portent un nom unique. Cependant, ceci n’est pas obligatoire puisqu’il n’y a aucun laien entre les deux.
Структура таблицы doit être définie à l’aide d’une requête CREATE TABLE .
Чтобы убедиться, что таблица использует хорошие игровые характеристики и хорошие межклассовые отношения, а также точные настройки файлов в файле wp-config. php с помощью метода $wpdb->get_charset_collate().
Lors de la definition de la requête SQL, il faut absolument of les suivantes les regles :
- Инструкция CREATE TABLE, соответствующая имени таблицы и скобкам, сделанным на линии.
- Il doit y avoir un espace entre le nom de la table et la parthèse ouvrante (sans celà, vous obtiendrez une erreur «Таблица уже существует» si vous activez votre thème plusieurs fois).
- Chaque champ doit être sur sa propre ligne.
- Il ne doit y avoir aucune ligne blanche dans la définition de la table.
- Первичный идентификатор заливки, использующий PRIMARY KEY. Il doit y avoir deux espaces entre PRIMARY KEY et le nom de la clé primaire.
Il ne faut pas entourer le nom des champs par des guillemets obliques (на английском: галочки).
Пример использования :
Il faut plutôt faire:
Введите код для создания персонализированной таблицы :
Тип идентификаторов и других ключей
Если вы хотите указать структуру таблиц Noyau WordPress, укажите идентификаторы, соответствующие типу bigint(20) unsigned(20) unsigned(20) unsigned(20) unsigned(20) . Il serait sage d’employer ce même type pour les identifants de vos таблицы personnalisées.
De plus, si une de vos table contient une clé étrangère liée à un de ces identifants, vous devrez prendre soin de lui donner à elle aussi le type bigint(20) без знака .
Вставка начальных значений
Если у вас есть возможность добавить начальные значения начальных значений в таблице, вы можете использовать функцию $wpdb->insert() после применения dbDelta().
Dans cet example, un seul enregistrement est ajouté. Je vous предлагает алгоритм для ввода дополнительных регистраций в картотеку «Insérer plusieurs enregistrements dans une table».
Внимание : tenez compte du fait qu’un theme ou une extension peut être activée et désactivée plusieurs fois. Votre code devra s’assurer que les insertions de données ne soient Effectuées qu’une fois…
Заинтересованная техника состоит из верификатора таблицы, отображаемой для dbDelta(), содержащей записи.