Могу ли я динамически создать таблицу MySQL из JSON? - PullRequest
2 голосов
/ 23 декабря 2011

Допустим, у меня есть серверный скрипт, который генерирует JSON из простого выбора таблицы. JSON кодируется в 1-м сценарии.

У меня нет контроля над этим первым скриптом, но я знаю, когда меняется базовая структура базы данных и когда меняется структура JSON.

Скрипт 2 использует CURL для получения .js файла (содержимого), содержащего JSON, который я затем могу декодировать в массив.

Затем мне нужно сохранить данные в другой базе данных.

Мой вопрос в основном об автоматизации этого процесса и возможности создания таблицы из массива, когда вы не знаете, какова структура массива, пока он не прибудет.

Можно ли это сделать?

РЕДАКТИРОВАТЬ Добавлен JSON в его текущем состоянии, но суть в том, что он может измениться.

{"name": "Google",
 "homepage_url": "http://www.google.com",
 "blog_url": "",
 "blog_feed_url": "",
 "twitter_username": "",
 "category_code": "ecommerce",
 "tag_list": "retail-portal-online-shopping-markets",
 "alias_list": null,
 "image": null,
 "products":
  [],
 "relationships":
  [],
 "competitions":
  [],
 "providerships":
  [{"title": "Legal",
    "is_past": false,
    "provider":
     {"name": "TaylorWessing",
      "permalink": "taylorwessing"}}],
 "offices":
  [{"description": "European HQ",
    "address1": "",
    "address2": "",
    "zip_code": "",
    "city": "Brussels",
    "state_code": null,
    "country_code": "BEL",
    "latitude": null,
    "longitude": null}]}

Ответы [ 3 ]

4 голосов
/ 18 февраля 2013

Простой кусок кода для создания таблицы MySQL и вставки значений из любой переменной JSON. Это быстрый взлом .. проверьте типы полей и т. Д. :) Возможно, есть лучшие способы, но этот работает и уже сэкономил мне часы при именовании полей вручную

Это можно изменить, чтобы создать таблицу отношений, которая также обрабатывает объекты. Теперь это сделано для массива JSON, а не для объектов, то есть массивов в массивах.

<?php

    JSON_to_table($place_your_JSON_var_here_please);

            function JSON_to_table($j_obj, $tblName = "New_JSON_table_" . time()){
            $j_obj = json_decode($your_JSON_variable, true);
            if(!mysql_num_rows( mysql_query("SHOW TABLES LIKE '" . $tblName . "'"))){ 
                $cq = "CREATE TABLE ". $tblName ." (
                id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,";
                foreach($j_obj as $j_arr_key => $value){
                    $cq .= $j_arr_key . " VARCHAR(256),";
                }
                $cq = substr_replace($cq,"",-1);
                $cq .= ")";
                mysql_query($cq) or die(mysql_error());
            }

            $qi = "INSERT INTO $tblName (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= $j_arr_key . ",";
                }
                $qi = substr_replace($qi,"",-1);
            $qi .= ") VALUES (";
            reset($j_obj);
                foreach($j_obj as $j_arr_key => $value){
                    $qi .= "'" . mysql_real_escape_string($value) . "',";
                }
            $qi = substr_replace($qi,"",-1);
            $qi .= ")";
            $result = mysql_query($qi) or die(mysql_error());

        return true;
            }
?>
1 голос
/ 23 декабря 2011

Я отвечу рядом с вопросом, но если вы хотите сохранить JSON, почему бы не использовать базу данных документов? CouchDB кушетка хранит ваш JSON "как есть" без необходимости какой-либо обработки.

0 голосов
/ 23 декабря 2011

Получив JSON, вы можете использовать функцию PHP json_decode для преобразования JSON в стандартный объект PHP. http://php.net/manual/en/function.json-decode.php

Затем можно построить строку SQL-запроса, зацикливая только что созданный объект, используя foreach. http://php.net/manual/en/control-structures.foreach.php

Когда вы перебираете свой объект, вам, вероятно, придется выполнять проверку типов, чтобы убедиться, что вы создаете правильный тип поля для базы данных. Например, используйте функцию PHP is_numeric, чтобы убедиться, что вы задали это поле как числовое вместо varchar. Но тебе решать, что там делать. Вы можете просто позволить ему разорваться и сделать все поля varchar.

Вы также можете просто сохранить объект JSON как есть, но я не знаю, нужно ли вам просто архивировать данные или вам это нужно для поиска и составления отчетов. Если вам нужно искать / сообщать об этом, вам придется сделать какое-то преобразование. Или сделайте то, что сказал RageZ и поместите в базу данных Couch. Есть также несколько других вариантов, таких как MongoDB. http://www.mongodb.org/ Но если у вас нет времени на изучение и установку базы данных No-SQL, я бы продолжил конвертацию.

...