Разное

Dbdelta: dbDelta() – Создает или изменяет таблицы базы данных на основе переданного SQL запроса на создание таблицы.

04.02.2023

На пути к лучшему 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 =

  • $queries – строка, содержащая один или несколько запросов CREATE TABLE, разделенных точкой с запятой.
  • $execute — применять ли необходимые изменения схемы (True) или просто возвращать сгенерированные запросы (False).
    По умолчанию запросы выполняются сразу.
  • $drop_columns – удалить ли столбцы, которые присутствуют в текущей таблице, но не в соответствующем запросе CREATE TABLE (True), или оставить их в покое (False). По умолчанию удаление столбцов.
  • $drop_indexes
    — то же, что и предыдущий аргумент, кроме индексов.
  • Функция возвращает массив из двух элементов. Первый элемент представляет собой список удобочитаемых сообщений, объясняющих, какие изменения схемы необходимо выполнить для обновления базы данных. Второе возвращаемое значение — это журнал запросов. Каждый элемент массива журнала запросов также является массивом, содержащим до трех ключей:

    • «запрос» — сгенерированный SQL-запрос.
    • «успех» — флаг True/False, указывающий, успешно ли выполнен запрос. Присутствует, только если для аргумента $execute установлено значение True.
    • «error_message»
      — ошибка MySQL, возникшая при выполнении запроса. Имеет смысл только тогда, когда «успех» = False.

    Исходный код

    Исходный код слишком длинный для включения в пост, поэтому я поместил его в отдельный ZIP-архив. Загрузите его здесь. Просто поместите найденный файл .php куда-нибудь в каталог вашего плагина и включите его перед вызовом blcTableDelta::delta .

    Похожие сообщения :

    Эта запись была опубликована в четверг, 29 июля 2010 г., в 17:17 и размещена в рубрике Разработка WordPress. Вы можете следить за любыми ответами на эту запись через ленту RSS 2.0. Вы можете оставить отзыв или вернуться со своего сайта.

    « Средство проверки неработающих ссылок 0.9.5 Альфа | micro-tweet — клиент Twitter, который подходит для твита »

    Добавление персонализированных таблиц (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 инструкция

    require_once() Предыдущее использование:

    Значение возврата 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.

      php темы или в файле sous-fichiers, например tableau-de-bord-tables.php.

    • 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

    After_switch_theme OU Register_Activation_hook () , Vous Devrez, Dans Votre De Bord, Activer on autre thème wise. ou encore désactiver puis reactiver l’extension pour que la fonction de rappel soit exécutée.

    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, особенно важные меры предосторожности:

  • Имя таблицы использовать префикс в файле wp-config. php.
  • Afin de rendre le nom de la table unique, on ajoutera, immédiatement après le préfixe remplaçant wp_, un mot relié au theme ou à l’extension qui nécessite cette table.

    Полное имя жанра prefixe_monprefixebd_manouvelletable . Пример: fjdk4_christiane_categories.

    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.

  • Pour éviter d’alourdir le code inutilement, le nom des champs ne sera pas précédé par le nom du theme ou de l’extension. Par пример, un champ qui contient une description pourra s’appeler simplement description
    .
  • Структура таблицы 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(), содержащей записи.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *