Drupal 7 db_insert и значения столбца DEFAULT - PullRequest
0 голосов
/ 14 февраля 2012

Попытка вставить значение DEFAULT в столбец базы данных MySQL
Простой пример

CREATE TABLE test (
 id int(11) NOT NULL,
 name varchar(10) NOT NULL,
 test_date date NOT NULL
) ENGINE=MyISAM;

На mysql я могу сделать

INSERT INTO test(id) VALUES(1); 

отлично работает

Теперь я перехожу к drupal 7 и делаю следующее

$data = array('id' => 1);
$result = db_insert('test')->fields($data)->execute();

я получаю следующую ошибку

PDOException: SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value: INSERT INTO {test} (id) VALUES (:db_insert_placeholder_0); Array ( [:db_insert_placeholder_0] => 1 )

«Режим sql» на MySQL установлен в «» (пустая строка)

Вопросы

  1. В чем причина возникновения этой ошибки?Ожидается, что drupal (или PDO) будет иметь значения вставки для всех столбцов?
  2. Допустим, я хочу вставить значение MySQL DEFAULT в столбец даты, как мне это сделать, используя db_insert?

Спасибо

============================================================================= Объяснение после копания в:

  • drupal 7 не использует поля даты или даты и времени
  • вся его дата хранится в полях INT как метки времени Unix
  • это может быть из-за того, что D7 хочет сохранить датуобработка независимо от того, как разные базы данных реализуют поля даты и времени
  • Я думаю, что это хорошая практика, позволяющая приложениям обрабатывать преобразование и отображать поле timestamp int
  • будет успешно размещаться вплоть до времени UNIX 429496729502/07/2106 6:28 по Гринвичу.(int без знака)

, чтобы увидеть разрешенные типы, вы можете проверить здесь

  • file: schema.inc
  • function:getFieldTypeMap ()

    'varchar:normal'  => 'VARCHAR',
    'char:normal'     => 'CHAR',
    
    'text:tiny'       => 'TINYTEXT',
    'text:small'      => 'TINYTEXT',
    'text:medium'     => 'MEDIUMTEXT',
    'text:big'        => 'LONGTEXT',
    'text:normal'     => 'TEXT',
    
    'serial:tiny'     => 'TINYINT',
    'serial:small'    => 'SMALLINT',
    'serial:medium'   => 'MEDIUMINT',
    'serial:big'      => 'BIGINT',
    'serial:normal'   => 'INT',
    
    'int:tiny'        => 'TINYINT',
    'int:small'       => 'SMALLINT',
    'int:medium'      => 'MEDIUMINT',
    'int:big'         => 'BIGINT',
    'int:normal'      => 'INT',
    
    'float:tiny'      => 'FLOAT',
    'float:small'     => 'FLOAT',
    'float:medium'    => 'FLOAT',
    'float:big'       => 'DOUBLE',
    'float:normal'    => 'FLOAT',
    
    'numeric:normal'  => 'DECIMAL',
    
    'blob:big'        => 'LONGBLOB',
    'blob:normal'     => 'BLOB',
    

другая функция, которую вам может быть интересно посмотреть (логика работает так)

  • функция createTableSql ()
  • function createFieldSql ()
  • function processField ()
  • function: getFieldTypeMap ()

если вы передадите что-либо, кроме этих, искаженная таблица sql будетне позволяйте создавать саму таблицу

, если у вас уже есть поля базы данных с полями даты и даты и времени в mysql, то вам может потребоваться создать поле метки времени, чтобы сделать его совместимым с D7

1 Ответ

0 голосов
/ 14 февраля 2012

Возможно, что SQL MODE не установлен глобально, но установлен в пользовательской сессии, попробуйте получить эту информацию, выполните этот запрос -

SELECT @@SESSION.SQL_MODE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...