Come implementare correttamente un campo mysql date o datetime in hook_schema ()?


13

Ho scritto un file mymodule.install che contiene una definizione di schema per creare una tabella nel mio database. Questa tabella contiene due campi dati. Questi campi saranno popolati dagli utenti quando riempiranno il contenuto specifico (esempio: per specificare una data di pubblicazione per una notizia). Ora non ho usato il modulo Date contribuito appositamente, perché avevo bisogno che questi due campi fossero sulla stessa riga nella tabella del database per altri motivi.

Hook_schema definisce i due campi in questo modo:

'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,
  ),

La tabella è stata creata correttamente nel database, ma ricevo sempre questi messaggi di avviso:

Campo news_board.pubblish_date: nessun tipo di schema per datetime di tipo mysql. Campo news_board.unpublish_date: nessun tipo di schema per datetime di tipo mysql. news_board.pubblish_date: nessun tipo per il tipo di schema: normale. Campo news_board.pubblish_date: nessun tipo di schema per il tipo. news_board.unpublish_date: nessun tipo per il tipo di schema: normale. Campo news_board.unpublish_date: nessun tipo di schema per tipo.

Mi sembra strano perché ho rosso sulla documentazione per utilizzare la specifica mysql_type al fine di memorizzare il formato datetime nel database mysql.

So che Drupal supporta i timestamp in modo nativo e se si desidera memorizzare un formato data diverso, è necessario utilizzare definizioni specifiche come mysql_type o pgsql_type in base al database che si sta utilizzando.

Nelle discussioni ho scoperto che molte persone hanno usato la definizione di mysql_type e da quello che ho visto hanno risolto il problema, quindi perché non funziona per me?

Molte grazie.

Risposte:


12

È necessario fornire un tipo di fallback ( varchar) nel caso in cui il database non sia 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,
),

Tuttavia, i messaggi visualizzati provengono dal modulo Schema . Questo problema è già stato registrato come numero 468644 .

L'implementazione del datetime mysql nel tuo schema va bene. Puoi tranquillamente ignorare questi messaggi. Direi che questi "messaggi di avviso" sono causati da un bug nel modulo Schema.


Ciao Gisle, grazie per la risposta. Ho appena fatto la modifica che hai suggerito e sì, crea la tabella nel database ma ho ancora questo annuncio: •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

Sì, lo so, l'ho disabilitato e disinstallato ma il risultato è lo stesso. La versione principale che sto usando è la 7.22. Voglio specificare che ho installato anche il modulo schema. I consigli menzionati appaiono quando provo a ispezionare lo schema del database con questo modulo. Onestamente non ho provato a verificare se sono presenti anche in altre parti dell'interfaccia di amministrazione. Mi chiedo anche se posso ignorare questi messaggi a questo punto e continuare a costruire il modulo. Non so se questo influenzerà la funzionalità del modulo stesso.
Marco,

OK, grazie mille per il tuo tempo Gisle, hai risparmiato molto del mio!
Marco,

0

Se è necessario utilizzare un tipo di record non incluso nell'elenco dei tipi ufficialmente supportati, è possibile specificare un tipo per ciascun back-end del database.

In questo caso, puoi tralasciare il parametro type, ma tieni presente che lo schema non verrà caricato su backend che non hanno un tipo specificato. Una possibile soluzione può essere quella di utilizzare il tipo "text" come fallback. ( 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', )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.