Mysql DESCRIBE table и определение столбов

Василий М.

Новичок
DESCRIBE table вываливает информацию о таблице в каком-то непригодным для программиста виде. Как можно ещё с помощью SQL посмотреть инфу о таблице?
Раньше так делал:

PHP:
$result = $this->db->query('SELECT * FROM ?f ORDER BY 1 ASC LIMIT 1', $this->getTableName());

       $finfo = mysqli_fetch_fields($result->getResult());

       foreach ($finfo as $obj)
       {
         self::$list_fields[$this->getTableName()][$obj->name] = $obj;
       }
 

AnrDaemon

Продвинутый новичок
SHOW CREATE даёт тебе одну строку - команду создания таблицы.
А товарищу похоже нужно описание таблицы... в виде таблицы.
 

Василий М.

Новичок
id int(10) unsigned

мне нужно просто знать что это int
что бы никакого говнокода не городить по выявлению из рузультата запроса типа столбца

пока это юзаю:
PHP:
  /**
  * Возвращает массив объектов stdClass, представляющих поля результирующего набора.
  * Первое поле таблицы должно быть индексом или PK.
  *
  * @param void
  * @return array
  */
  protected function getListFields()
  {
     if (!isset(self::$list_fields[$this->getTableName()]))
     {
       $result = $this->db->query('SELECT * FROM ?f ORDER BY 1 ASC LIMIT 1', $this->getTableName());

       $finfo = mysqli_fetch_fields($result->getResult());

       foreach ($finfo as $obj)
       {
         self::$list_fields[$this->getTableName()][$obj->name] = $obj;
       }
     }

     return self::$list_fields[$this->getTableName()];
  }
это дает более гибкий результат:


Код:
Array
(
    [id] => stdClass Object
        (
            [name] => id
            [orgname] => id
            [table] => user_user
            [orgtable] => user_user
            [def] =>
            [db] => adverts
            [catalog] => def
            [max_length] => 2
            [length] => 11
            [charsetnr] => 63
            [flags] => 49667
            [type] => 3
            [decimals] => 0
        )

    [user_unique_cookie_id] => stdClass Object
        (
            [name] => user_unique_cookie_id
            [orgname] => user_unique_cookie_id
            [table] => user_user
            [orgtable] => user_user
            [def] =>
            [db] => adverts
            [catalog] => def
            [max_length] => 0
            [length] => 32
            [charsetnr] => 51
            [flags] => 0
            [type] => 254
            [decimals] => 0
        )

    [user_active] => stdClass Object
        (
            [name] => user_active
            [orgname] => user_active
            [table] => user_user
            [orgtable] => user_user
            [def] =>
            [db] => adverts
            [catalog] => def
            [max_length] => 1
            [length] => 1
            [charsetnr] => 63
            [flags] => 36865
            [type] => 1
            [decimals] => 0
        )
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Василий М., в базах нет просто типа int, отсюда и такой результат.
А зачем это вообще нужно? Динамически схему данных состовлять? Ну тогда это и есть говнокод. Схему должен описывать программист в конфиге.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
если для тебя нет разницы что это именно unsigned, может и смысла нет вообще это делать?
 

Redjik

Джедай-мастер
Василий М., в базах нет просто типа int, отсюда и такой результат.
А зачем это вообще нужно? Динамически схему данных состовлять? Ну тогда это и есть говнокод. Схему должен описывать программист в конфиге.
Не согласен, схема в конфигах и реверс инжениринг для миграций - тоже зло... я за меньшее зло - динамические схемы.
Поэтому и скинул пример с Yii/Yii2.
Схему само собой надо держать в кеше, чтобы базу постоянно не дергать.
 

Василий М.

Новичок
короче, поцоны, мне это нужно для сохранения объекта Datetime в базу.
На этапе сохранения я не знаю какой формат у поля даты (date, datetime или int)
поэтому имею такую конструкцию:

PHP:
switch ($fields_info[$db_field_name]->type)
{
  // datetime
  case '12':
  $sql .= '?f = "?s", ';
  $args[] = $object::getPropertyFieldName($key);
  $args[] = $value->format('Y-m-d H:i:s');
  break;

  // date
  case '10':
  $sql .= '?f = "?s", ';
  $args[] = $object::getPropertyFieldName($key);
  $args[] = $value->format('Y-m-d');
  break;

  // int
  case '3':
  $sql .= '?f = ?i, ';
  $args[] = $object::getPropertyFieldName($key);
  $args[] = $value->getTimestamp();
  break;
}
 

Redjik

Джедай-мастер
PHP:
case '12':
тут константы напрашиваются, если не хочешь стратегию юзать
 

hell0w0rd

Продвинутый новичок
Василий М., ну и введи плейсхолдер d и D, в чем проблема?
Redjik, выходит база контролирует поведение твоего приложения, а не приложение базу. Ну супер, чо
 

Redjik

Джедай-мастер
Именно, база для меня это святое - как можно меньше приложение должно контролировать базу...
А иначе потом начинается - я грохнул все ФК, чтобы запросы быстрее обрабатывались - у меня же все равно приложение проверяет связи... Было такое, не раз, спасибо.
Вообще спор тупо и остро - конечников.
 

Василий М.

Новичок
Василий М., ну и введи плейсхолдер d и D, в чем проблема?
опишу проблему
есть объект модели, который пишется в таблицу, ORM да
у него свойства, разные
одно свойство - это Datetime объект

таблица же, которая сопоставляется с этим объектом, может иметь поле даты в любом формате - date, datetime или int для timestamp - не известно какое. я просто знаю что свойство объекта "дата". и все.

код выше как раз и занимается определением типа поля в таблице. но мне не нравится этот метод.
 

hell0w0rd

Продвинутый новичок
Redjik, вырубить фк в базе - это личный загон разработчика, который это сделал. С ОРМ стоит забыть о низкоуровневом общении с базой, но совсем забывать о том, откуда данные берутся не стоит.
 
Сверху