Como implementar um campo de data ou data / hora do mysql corretamente em hook_schema ()?

13

Eu escrevi um arquivo mymodule.install que contém uma definição de esquema para criar uma tabela no meu banco de dados. Esta tabela contém dois campos de dados. Esses campos serão preenchidos pelos usuários quando eles preencherem o conteúdo específico (exemplo: para especificar uma data de publicação para uma notícia). Agora não usei o módulo de contribuição de data de propósito, porque precisava que esses dois campos estivessem na mesma linha na tabela do banco de dados por outros motivos.

O hook_schema define os dois campos desta maneira:

'pubblish_date' => array(
    'description' => t('The pubblish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),
  'unpublish_date' => array(
    'description' => t('The unpublish date for the single news'),
    'mysql_type' => 'datetime',
    'not null' => FALSE,
  ),

A tabela foi criada corretamente no banco de dados, mas eu sempre recebo essas mensagens de aviso:

Campo news_board.pubblish_date: nenhum tipo de esquema para o tipo mysql datetime. Campo news_board.unpublish_date: nenhum tipo de esquema para o tipo mysql datetime. news_board.pubblish_date: nenhum tipo para o tipo de esquema: normal. Campo news_board.pubblish_date: nenhum tipo de esquema para o tipo. news_board.unpublish_date: nenhum tipo para o tipo de esquema: normal. Campo news_board.unpublish_date: nenhum tipo de esquema para o tipo.

Parece estranho para mim, porque eu, na documentação, uso a especificação mysql_type para armazenar o formato de data e hora no banco de dados mysql.

Eu sei que o Drupal suporta timestamps nativos e se você deseja armazenar um formato de data diferente, deve usar definições específicas como mysql_type ou pgsql_type de acordo com o banco de dados que você está usando.

Nas discussões, descobri on-line muitas pessoas usaram a definição mysql_type e, pelo que vi, resolveram o problema, então por que não funciona para mim?

Muito obrigado.

Marco
fonte

Respostas:

12

Você deve fornecer um tipo de fallback ( varchar) para o caso em que o banco de dados não é mysql.

'pubblish_date' => array(
  'description' => t('The pubblish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),
'unpublish_date' => array(
  'description' => t('The unpublish date for the single news'),
  'type' => 'varchar',
  'mysql_type' => 'datetime',
  'not null' => FALSE,
),

No entanto, as mensagens que você vê são do módulo Esquema . Esse problema já está registrado como problema # 468644 .

A implementação do datetime do mysql no seu esquema está correta. Você pode ignorar essas mensagens com segurança. Eu diria que essas "mensagens de aviso" são causadas por um bug no módulo Schema.

Radical livre
fonte
Olá Gisle, obrigado pela resposta. Eu apenas fiz a modificação que você sugeriu e sim, ele cria a tabela no banco de dados, mas eu ainda tenho este adivices: •Field news_board.pubblish_date: no Schema type for mysql type datetime. •Field news_board.unpublish_date: no Schema type for mysql type datetime.
Marco
Sim, eu sei, desativei e desinstalei, mas o resultado é o mesmo. A versão principal que estou usando é a 7.22. Quero especificar que também tenho o módulo de esquema instalado. Os conselhos mencionados aparecem quando tento inspecionar o esquema do banco de dados com este módulo. Honestamente, eu não tentei verificar se eles também estão em outra parte da interface do administrador. Também estou querendo saber se posso ignorar essas mensagens neste momento e continuar construindo o módulo. Não sei se isso afetará a funcionalidade do próprio módulo.
13133 Marco
OK, muito obrigado pelo seu tempo, Gisle, você salvou muitos dos meus!
Marco
0

Se você precisar usar um tipo de registro não incluído na lista de tipos oficialmente suportados, poderá especificar um tipo para cada back-end do banco de dados.

Nesse caso, você pode deixar de fora o parâmetro type, mas lembre-se de que seu esquema falhará ao carregar em back-end que não têm um tipo especificado. Uma solução possível pode ser usar o tipo "texto" como substituto. ( https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Database%21database.api.php/group/schemaapi/8.2.x )

'submit_date' => array( 'type' => 'varchar', 'mysql_type' => 'datet', )

PADMAJA SONWANE
fonte